Linux经典的几款收包引擎

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

libpcap/libpcap-mmap
PF_RING
DPDK
xdp

libpcap

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

数据包到达网卡设备。
网卡设备依据配置进行DMA操作。( 「第1次拷贝」 :网卡寄存器->内核为网卡分配的缓冲区ring buffer)
网卡发送中断,唤醒处理器。
驱动软件从ring buffer中读取,填充内核skbuff结构( 「第2次拷贝」 :内核网卡缓冲区ring buffer->内核专用数据结构skbuff)
接着调用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经典的几款收包引擎的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/229809.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Perplexity AI怎么用 新手入门操作指南
上一篇 2025年11月3日 20:38:25
《战地6》B测后改动细节曝光 大量演示视频发布
下一篇 2025年11月3日 20:38:33

相关推荐

  • 在Linux中grep命令大全

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。     1.作用    linux系统中grep命令是一种强大的文…

    用户投稿 2026年8月30日
    000
  • Linux如何获取CPU信息?

    cpu(中央处理单元)通常简称为处理器,是机器最重要的组件之一;它执行所有类型的数据处理操作,并被视为计算机的大脑。如果我们想要查看cpu的信息(例如:处理器类型和速度),要如何实现?下面本篇文章就来给大家介绍在linux中从命令行获取、查看cpu信息的方法,希望对大家有所帮助。 方法一:查看/pr…

    2026年8月30日
    000
  • linux有哪些常用的版本?

    常用的Linux版本有以下几个版本: 1、Redhat系列 Redhat系列包括RHEL(Redhat Enterprise Linux,也就是所谓的RedhatAdvance Server,收费版本)、FedoraCore(由原来的Redhat桌面版本发展而来,免费版本)、CentOS(RHEL的…

    2026年8月30日
    000
  • Linux操作系统安装字体笔记

    对于从事java开发的朋友们来说,了解如何在linux服务器上部署应用至关重要。linux服务器因其成本低、运行稳定而受到青睐。然而,当在linux系统上生成包含中文字符的pdf文档时,常常会遇到乱码问题。这通常是因为服务器缺少相应的中文字体所致。今天,小编将分享在linux操作系统上安装中文字体的…

    2026年8月30日
    1300
  • linux实现时间同步有哪几种方法

    Linux实现时间同步的方法的有两种,分别是:1、使用ntpdate从时间服务器来更新时间,不需要自己做任何配置;2、使用ntp来搭建自己的时间服务器。 【推荐课程:Linux系统】 由于硬件的原因,机器或多或少的跟标准时间对不上,误差几秒到几分钟不等。对于服务器来说时间不准会有很多麻烦。例如支付的…

    2026年8月30日
    000
  • Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录

    Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录

    用sublime text搭配python脚本能高效批量写入mysql数据,实现接口爬虫日志的自动化记录。1.使用sublime text轻便快捷,配合pymysql等库快速编写脚本,并支持直接运行;2.采用executemany()方法批量插入数据,显著提升效率,避免单条insert性能差的问题;…

    2026年8月30日 用户投稿
    300
  • 如何解决PHP项目中HTML转图片的需求?使用h4cc/wkhtmltoimage-amd64库可以轻松搞定!

    可以通过以下地址学习composer:学习地址 在我的一个php项目中,我需要将html内容转换为图片,用于生成报告和展示页面。这个需求看似简单,但实际上却充满了挑战。首先,转换的质量必须足够高,能够清晰地展示html内容中的所有元素。其次,转换过程必须高效,因为用户可能会频繁地进行转换操作。最后,…

    用户投稿 2026年8月30日
    100
  • linux如何递归查找删除文件或目录?

    本篇文章主要给大家介绍linux递归查找文件和linux递归删除文件或目录的方法。 要实现linux递归查找并删除文件/目录的目的,我们可以使用下面的语法将find命令和rm命令一起使用。 这里,末尾的+号表示允许同时读取多个目录。 $ find /start/search/from/this/di…

    用户投稿 2026年8月30日
    100
  • Linux学习之awk基础编程

    Linux学习之awk基础编程Linux学习之awk基础编程Linux学习之awk基础编程Linux学习之awk基础编程

     awk是一个使用非常广泛的文本处理工具,是功能最强大的数据处理引擎之一,可以进行样式的装入,流控制,数学运算符,进程控制语句甚至于内置变量和函数,下来就来详细介绍它的基本使用方示,和大家一起分享一下! 1.awk每次读一行数据,如果设置了-F选项,是在这一行使用分隔符分,$0是全部 2.awk由模…

    2026年8月30日 用户投稿
    200
  • 【Linux】使用scp命令上传文件至服务器

    本篇文章讲述的是在linux系统下上传文件到服务器的操作步骤,在这里分享给大家以供学习参考。 scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。 上传本地文件到服务器scp 本地路径 用户名@远程服务器ip:远程路径 下载文件 scp 用户名…

    2026年8月30日
    100
  • Linux下导出数据库文件进行统计+去重

    本文主要讲述了如何在linux中实现数据库文件统计以及去重,感兴趣的朋友可以来学习一下! 1. 把数据库表导出到文本文件中 mysql -h主机 -P端口 -u用户 -p密码 -A 数据库 -e “select email,domain,time from ent_login_01_00…

    2026年8月30日
    200
  • 如何查看Linux软件包变更记录 rpm -q changelog解析

    如何查看Linux软件包变更记录 rpm -q changelog解析如何查看Linux软件包变更记录 rpm -q changelog解析如何查看Linux软件包变更记录 rpm -q changelog解析如何查看Linux软件包变更记录 rpm -q changelog解析

    查看变更日志有助于排查升级问题、确认安全补丁和判断关键修复。1. 使用 rpm -q –changelog 可查看已安装包的变更记录;2. 若未安装,可从官方仓库下载 .rpm 文件后用 rpm -qp 查看;3. 输出过多时可用 grep、less 或 head 过滤;4. 结合 dn…

    2026年8月30日 用户投稿
    1100
  • Linux学习之文件权限知识点总结

    linux 中任何一个文件都具有 「用户、用户组与其他用户」三种权限,一个用户可属于多个用户组。所有用户的相关信息都记录在 /etc/passwd 文件中,密码记录在 /etc/shaodw 文件,用户组记录在 /etc/group 文件。 root 用户权限最高,不算其他用户 文件属性 ls -a…

    用户投稿 2026年8月30日
    100
  • 怎么快速让Linux虚拟机连上WiFi

    怎么快速让Linux虚拟机连上WiFi怎么快速让Linux虚拟机连上WiFi怎么快速让Linux虚拟机连上WiFi怎么快速让Linux虚拟机连上WiFi

    在生活中,网络无处不在,我们可以通过网络玩游戏、看电视剧和刷微博等,我们的手机和电脑没有了网络可能就变成了一个什么都不能干的物品。由于linux系统的高安全性,系统中的网络装置,需要进行配置,才能与外界网络互连,那么我们该怎样让我们的电脑连上wifi呢?让我们来看一看吧! 由于Linux系统的高安全…

    2026年8月30日 用户投稿
    100
  • 怎么在Linux系统中以单容器安装Nginx+ASP.NET Core

    怎么在Linux系统中以单容器安装Nginx+ASP.NET Core怎么在Linux系统中以单容器安装Nginx+ASP.NET Core怎么在Linux系统中以单容器安装Nginx+ASP.NET Core怎么在Linux系统中以单容器安装Nginx+ASP.NET Core

    推荐在生产环境中使用反向代理服务器转发请求到kestrel http服务器,本文将会实践将nginx —>asp.net core 部署架构容器化的过程。 Nginx->ASP.NET Coe部署架构容器化   在Docker中部署Nginx—>ASP.NE…

    2026年8月30日 用户投稿
    100
  • Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置

    Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置

    要使用 sublime 连接运行在 docker 容器中的 mysql 数据库,首先要确保容器配置正确并开放远程访问权限。具体步骤包括:1. 启动容器时添加 -p 3306:3306 参数实现端口映射;2. 创建允许从外部连接的 mysql 用户,如 ‘root’@&#821…

    2026年8月30日 用户投稿
    000
  • 为什么说禁用Windows的快速启动功能可能有助于解决某些休眠问题?

    禁用快速启动可解决休眠问题,因其采用混合关机机制,将内核会话保存至硬盘以加快启动,但与传统休眠冲突,易导致唤醒失败、黑屏或设备异常;尤其在双系统或驱动不兼容时更明显。关闭后系统执行完整关机,避免状态残留,提升电源管理稳定性。 禁用Windows的快速启动功能可能有助于解决某些休眠问题,是因为快速启动…

    2026年8月30日
    100
  • 服务器用什么linux?

    linux服务器就是采用linux系统的网络服务器,那么可以用什么linux来当服务器?下面推荐6款好用的linux 服务器发行版,希望对你们有所帮助。 1、Ubuntu Ubuntu 是由 Canonical 公司开发的基于 Debian 的开源 Linux 操作系统。毫无疑问,它是当下最流行的 …

    2026年8月30日
    000
  • kill是什么意思?

    在Linux中的kill命令用来终止指定的进程(terminate a process)的运行,kill是Linux下进程管理的常用命令。kill 送出一个特定的信号 (signal) 给行程 id 为 pid 的行程根据该信号而做特定的动作,若没有指定,预设是送出终止 (TERM) 的信号。 通常…

    2026年8月30日
    200
  • linux怎么下载安装软件?

    linux是一套免费使用和自由传播的类unix操作系统,是一个基于posix和unix的多用户、多任务、支持多线程和多cpu的操作系统。它能运行主要的unix工具软件、应用程序和网络协议。它支持32位和64位硬件。linux继承了unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。用…

    2026年8月30日
    100

发表回复

登录后才能评论
关注微信