本文列举了四个比较经典的Linux收包引擎。如果还有其他你觉得还可以的,可以留言。这四个分别是:libpcap/libpcap-mmapPF_RINGPDDKxdplibpcaplibpcap的抓包机制是在数据链路层增加了一个旁路处理,不干扰系统自身网络协议栈的处理,通过linux来收发数据包核心。过滤缓冲,最后直接传递给上层应用。数据包到达网卡设备。网卡设备根据配置进行DMA操作。(“第1次拷贝”:网卡寄存器->内核为网卡分配的bufferringbuffer)网卡发送中断,唤醒处理器。驱动软件从ringbuffer中读取并填充kernelskbuff结构(“二次拷贝”:内核网卡bufferringbuffer->kernel-specificdatastructureskbuff)然后调用netif_receive_skb函数:5.1如果有抓包程序,它被网络划分接口进入BPF过滤器,将符合规则的数据包复制到系统内核缓存中(“第三份”)。BPF将一个过滤器和两个缓冲区与每个需要服务的数据包捕获程序相关联。BPF分配缓冲区,通常它的配额是4KB。存储缓冲区用于从适配器接收数据;保持缓冲区用于将数据包复制到应用程序。5.2处理数据链路层的桥接功能;5.3根据skb->protocol字段确定上层协议并提交网络层处理,进入网络协议栈,进行高层处理。libpcap绕过了Linux内核数据包接收过程中协议栈的处理,使得用户空间API可以直接调用socketPF_PACKET从链路层驱动中获取数据包的副本,并从内核缓冲区中复制到userSpacebuffer("4thcopy")libpcap-mmaplibpcap-mmap是对旧的libpcap实现的改进,新版本的libpcap基本上使用packet_mmap机制。PACKET_MMAP通过mmap减少了一次内存拷贝(“第四次拷贝没了”),减少了频繁的系统调用,大大提高了抓包效率。PF_RING我们之前看到libpcap有4个内存拷贝。libpcap_mmap有3个内存副本。PF_RING提出的核心解决方案是减少消息在传输过程中的副本数。我们可以看到,相比于libpcap_mmap,pfring允许用户空间内存直接与rx_buffer进行mmap。这减少了另一个副本(“libpcap_mmap的第二个副本”:rx_buffer->skb)PF-RINGZC实现了DNA(DirectNICAccess直接网卡访问)技术,将用户内存空间映射到驱动程序的内存空间,使得用户的应用程序可以直接访问网卡的寄存器和数据。这样就避免了内核中的packetcache,减少了一份(“libpcap的第一个copy”,DMA到kernelbuffer的copy)。这完全是零拷贝。缺点是一次只有一个应用程序可以打开DMA环(注意现在的网卡可以有多个RX/TX队列,允许一个应用程序同时在每个队列上),换句话说,Multipleapplications在用户态需要相互通信分发数据包。DPDKpf-ringzc和dpdk都可以实现数据包的零拷贝,都可以绕过内核,只是实现原理略有不同。pf-ringzc通过zc驱动(也在应用层)接管数据包,dpdk是基于UIO实现的。1UIO+mmap实现零拷贝(zerocopy)UIO(UserspaceI/O)是一种运行在用户空间的I/O技术。Linux系统中一般驱动设备运行在内核空间,在用户空间可以被应用程序调用,而UIO则小部分驱动运行在内核空间,大部分驱动在用户空间实现空间。功能。Linux提供的UIO机制可以绕过Kernel,在用户空间完成所有的消息处理。2UIO+PMD减少中断和CPU上下文切换DPDK的UIO驱动屏蔽硬件中断,然后在用户态使用主动轮询。这种模式称为PMD(PollModeDriver)。与DPDK相比,pf-ring(nozc)使用了NAPI轮询和应用层轮询,而pf-ringzc与DPDK类似,只使用了应用层轮询。3HugePages减少TLBmiss操作系统引入MMU(MemoryManagementUnit)后,CPU需要访问内存两次才能读取内存中的数据。第一次是查询页表将逻辑地址转换为物理地址,然后访问物理地址读取数据或指令。为了减少页数过多和页表过大导致的查询时间过长的问题,引入了TLB(TranslationLookasideBuffer),可以翻译成一个地址转换缓冲区。TLB是一个内存管理单元,一般存放在一个寄存器中,里面存放着一小部分当前最有可能被访问到的页表项。引入TLB后,CPU首先会寻址TLB。由于TLB是存放在一个寄存器中,只包含少量的页表项,所以查询速度非常快。如果在TLB中寻址成功(TLBhit),则无需查询RAM中的页表;如果在TLB中寻址失败(TLBmiss),则需要查询RAM中的页表。查询到后,页面会更新到TLB。DPDK使用HugePages,在x86-64下支持2MB和1GB的页面大小,大大减少了页面总数和页表的大小,从而大大降低了TLB未命中的几率,提高了CPU的寻址性能。4其他优化SNA(Shared-nothingArchitecture),软件架构去中心化,尽可能避免全局共享,带来全局竞争,失去水平扩展的能力。NUMA系统下,内存不是跨Node远程使用的。SIMD(SingleInstructionMultipleData),从最早的mmx/sse到最新的avx2,SIMD的能力都得到了增强。DPDK使用批处理同时处理多个包,然后使用向量编程在一个周期内处理所有包。例如,memcpy使用SIMD来提高速度。cpuaffinity:即CPU亲和性。XDPxdp表示eXpress数据路径。Ebpf用于数据包过滤。与dpdk相比,数据包直接发送到用户态,用户态作为一个快速的数据处理平面。xdp在驱动层创建一个数据Quick平面。在数据被网卡硬件dma到内存并分配skb之前,处理数据包。请注意,XDP不会对数据包执行内核绕过,它只是提前做了一点预检查。与DPDK相比,XDP具有以下优势:无需第三方代码库和许可证支持轮询和中断网络无需分配大页面无需专用CPU无需定义新的安全网络模型XDP的使用场景包括:DDoS防御防火墙基于XDP_TX的负载均衡网络统计复杂网络采样高速交易平台以上是良旭教程网给大家分享的几个经典的Linux包接收引擎。以上就是良序教程网为各位小伙伴们分享的Linux相关知识。
