几句话说清楚22:什么是AF_XDP Socket

AF_XDP

默认读者已经了解XDP(eXpress Data Path)的概念。

基于Kernel提供的BPF能力,XDP可以提供高性能的数据面处理能力。

所谓AF_XDP,和AF_INET一样,也是address family的一种,用于规定socket通讯的类型。相当于socket底层通讯方式的不同实现(多态)。一般的,AF_INET可以用于IPv4类型地址的通讯,在实际通讯中应用自己的那套具体实现(TCP/IP协议栈等),AF_XDP就是一套基于XDP的通讯的实现。

还有支持IPX的AF_IPX,支持蓝牙的AF_BLUETOOTH等等Address Family。

Main Idea

XDP程序在Kernel提供的网卡驱动中直接取得网卡收到的数据帧,然后直接送到用户态应用程序。应用程序利用AF_XDP类型的socket接收数据。

用虚拟化领域的完全虚拟化和半虚拟化概念类比,如果DPDK是”完全Kernel bypass”,那么AF_XDP就是“半Kernel bypass”。

XDP程序会把数据帧送到一个在用户态可以读写的队列Memory Buffer中,叫做UMEM。用户态应用在UMEM中完成数据帧的读取和写入。当然了,整个过程都是零拷贝(Zero Copy)的。

AF_XDP Socket和它的小伙伴们

AF_XDPSocket的创建过程可以使用在网络编程中常见的socket()系统调用,就是参数需要特别配置一下。在创建之后,每个socket都各自分配了一个RX ring和TX ring。这两个ring保存的都是descriptor,里面有指向UMEM中真正保存帧的地址。

UMEM也有两个队列,一个叫FILL ring,一个叫COMPLETION ring。其实就和传统网络IO过程中给DMA填写的接收和发送环形队列很类似。在RX过程中,用户应用程序在FILL ring中填入接收数据包的地址,XDP程序会将接收到的数据包放入该地址中,并在socket的RX ring中填入对应的descriptor。

COMPLETION ring中保存的并非用户应用程序“将要”发送的帧的地址,而是已经完成发送的帧的地址。这些帧可以用来被再次发送或者接收。“将要”发送的帧的地址是在socket的TX ring中,同样由用户应用填入。

RX/TX ring和FILL/COMPLETION ring之间是多对一(n:1)的关系。也就是说可以有多个socket和它们的RX/TX ring共享一个UMEN和它的FILL/COMPLETION ring。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero