Linux经典的几款收包引擎

发布时间 - 2023-08-04 00:00:00    点击率:

本文列举四个比较经典的 Linux 收包引擎,如果还有其他你觉得ok的可以留言。这四个分别是:

  • libpcap/libpcap-mmap
  • PF_RING
  • DPDK
  • xdp

libpcap

libpcap的包捕获机制是在数据链路层增加一个旁路处理,不干扰系统自身的网路协议栈的处理,对发送和接收的数据包通过Linux内核做过滤和缓冲处理,最后直接传递给上层应用程序。

  1. 数据包到达网卡设备。
  2. 网卡设备依据配置进行DMA操作。( 「第1次拷贝」 :网卡寄存器->内核为网卡分配的缓冲区ring buffer)
  3. 网卡发送中断,唤醒处理器。
  4. 驱动软件从ring buffer中读取,填充内核skbuff结构( 「第2次拷贝」 :内核网卡缓冲区ring buffer->内核专用数据结构skbuff)
  5. 接着调用netif_receive_skb函数:
  • 5.1 如果有抓包程序,由网络分接口进入BPF过滤器,将规则匹配的报文拷贝到系统内核缓存 ( 「第3次拷贝」 )。BPF为每一个要求服务的抓包程序关联一个filter和两个buffer。BPF分配buffer 且通常情况下它的额度是4KB the store buffer 被使用来接收来自适配器的数据;the hold buffer被使用来拷贝包到应用程序。
  • 5.2 处理数据链路层的桥接功能;
  • 5.3 根据skb->protocol字段确定上层协议并提交给网络层处理,进入网络协议栈,进行高层处理。
  • libpcap绕过了Linux内核收包流程中协议栈部分的处理,使得用户空间API可以直接调用套接字PF_PACKET从链路层驱动程序中获得数据报文的拷贝,将其从内核缓冲区拷贝至用户空间缓冲区( 「第4次拷贝」 
  • libpcap-mmap

    libpcap-mmap是对旧的libpcap实现的改进,新版本的libpcap基本都采用packet_mmap机制。PACKET_MMAP通过mmap,减少一次内存拷贝( 「第4次拷贝没有了」 ),减少了频繁的系统调用,大大提高了报文捕获的效率。

    PF_RING

    我们看到之前libpcap有4次内存拷贝。libpcap_mmap有3次内存拷贝。PF_RING提出的核心解决方案便是减少报文在传输过程中的拷贝次数。

    我们可以看到,相对与libpcap_mmap来说,pfring允许用户空间内存直接和rx_buffer做mmap。这又减少了一次拷贝 ( 「libpcap_mmap的第2次拷贝」:rx_buffer->skb)

    PF-RING ZC实现了DNA(Direct NIC Access 直接网卡访问)技术,将用户内存空间映射到驱动的内存空间,使用户的应用可以直接访问网卡的寄存器和数据。

    通过这样的方式,避免了在内核对数据包缓存,减少了一次拷贝( 「libpcap的第1次拷贝」 ,DMA到内核缓冲区的拷贝)。这就是完全的零拷贝。

    其缺点是,只有一个 应用可以在某个时间打开DMA ring(请注意,现在的网卡可以具有多个RX / TX队列,从而就可以在每个队列上同时一个应用程序),换而言之,用户态的多个应用需要彼此沟通才能分发数据包。

    DPDK

    pf-ring zc和dpdk均可以实现数据包的零拷贝,两者均旁路了内核,但是实现原理略有不同。pf-ring zc通过zc驱动(也在应用层)接管数据包,dpdk基于UIO实现。

    1 UIO+mmap 实现零拷贝(zero copy)

    UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。采用Linux提供UIO机制,可以旁路Kernel,将所有报文处理的工作在用户空间完成。

    2 UIO+PMD 减少中断和CPU上下文切换

    DPDK的UIO驱动屏蔽了硬件发出中断,然后在用户态采用主动轮询的方式,这种模式被称为PMD(Poll Mode Driver)。

    与DPDK相比,pf-ring(no zc)使用的是NAPI polling和应用层polling,而pf-ring zc与DPDK类似,仅使用应用层polling。

    3 HugePages 减少TLB miss

    在操作系统引入MMU(Memory Management Unit)后,CPU读取内存的数据需要两次访问内存。第一次要查询页表将逻辑地址转换为物理地址,然后访问该物理地址读取数据或指令。

    为了减少页数过多,页表过大而导致的查询时间过长的问题,便引入了TLB(Translation Lookaside Buffer),可翻译为地址转换缓冲器。TLB是一个内存管理单元,一般存储在寄存器中,里面存储了当前最可能被访问到的一小部分页表项。

    引入TLB后,CPU会首先去TLB中寻址,由于TLB存放在寄存器中,且其只包含一小部分页表项,因此查询速度非常快。若TLB中寻址成功(TLB hit),则无需再去RAM中查询页表;若TLB中寻址失败(TLB miss),则需要去RAM中查询页表,查询到后,会将该页更新至TLB中。

    而DPDK采用HugePages ,在x86-64下支持2MB、1GB的页大小,大大降低了总页个数和页表的大小,从而大大降低TLB miss的几率,提升CPU寻址性能。

    4 其它优化

    • SNA(Shared-nothing Architecture),软件架构去中心化,尽量避免全局共享,带来全局竞争,失去横向扩展的能力。NUMA体系下不跨Node远程使用内存。
    • SIMD(Single Instruction Multiple Data),从最早的mmx/sse到最新的avx2,SIMD的能力一直在增强。DPDK采用批量同时处理多个包,再用向量编程,一个周期内对所有包进行处理。比如,memcpy就使用SIMD来提高速度。
    • cpu affinity:即 CPU 亲和性

    XDP

    xdp代表eXpress数据路径,使用ebpf 做包过滤,相对于dpdk将数据包直接送到用户态,用用户态当做快速数据处理平面,xdp是在驱动层创建了一个数据快速平面。在数据被网卡硬件dma到内存,分配skb之前,对数据包进行处理。

    请注意,XDP并没有对数据包做Kernel bypass,它只是提前做了一点预检而已。

    相对于DPDK,XDP具有以下优点:

    • 无需第三方代码库和许可
    • 同时支持轮询式和中断式网络
    • 无需分配大页
    • 无需专用的CPU
    • 无需定义新的安全网络模型

    XDP的使用场景包括:

    • DDoS防御
    • 防火墙
    • 基于XDP_TX的负载均衡
    • 网络统计
    • 复杂网络采样
    • 高速交易平台

    OK,以上就是今天的分享,如果你觉得还有其他的收包引擎,可以留言分享。



# linux  # 编辑器  # 数据包  # 多个  # 应用程序  # 是在  # 而在  # 应用层  # 请注意  # 链路层  # 相对于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何快速搭建虚拟主机网站?新手必看指南  如何在Windows服务器上快速搭建网站?  Laravel如何实现数据库事务?(DB Facade示例)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  java中使用zxing批量生成二维码立牌  linux top下的 minerd 木马清除方法  如何安全更换建站之星模板并保留数据?  什么是javascript作用域_全局和局部作用域有什么区别?  如何在IIS管理器中快速创建并配置网站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  详解Android图表 MPAndroidChart折线图  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Python面向对象测试方法_mock解析【教程】  利用vue写todolist单页应用  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何用低价快速搭建高质量网站?  浅谈javascript alert和confirm的美化  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何记录自定义日志?(Log频道配置)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在阿里云虚拟主机上快速搭建个人网站?  如何正确选择百度移动适配建站域名?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何用虚拟主机快速搭建网站?详细步骤解析  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何在IIS服务器上快速部署高效网站?  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何制作一个表白网站视频,关于勇敢表白的小标题?  浅述节点的创建及常见功能的实现  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  IOS倒计时设置UIButton标题title的抖动问题  如何在新浪SAE免费搭建个人博客?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  C#如何调用原生C++ COM对象详解  如何用y主机助手快速搭建网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  lovemo网页版地址 lovemo官网手机登录  Laravel如何优化应用性能?(缓存和优化命令)  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  JS实现鼠标移上去显示图片或微信二维码  微信小程序 HTTPS报错整理常见问题及解决方案