linux - DPDK 和 Netfilter 的区别

标签 linux linux-kernel netfilter dpdk

我想绕过 Linux 网络堆栈并将原始数据包转换为我在 userland 中的自定义代码并在那里处理它们。

我知道您可以使用 pf-rings 或 DPDK 等来制作您的自定义驱动程序。但是我不明白为什么我要制作这些类型的驱动程序,而我可以使用 Netfilter 并将我的模块挂接到 NF_IP_PRE_ROUTING 状态并将数据包发送到 userland

如果有人能向我解释它们之间的主要区别,那将对我有很大帮助。

最佳答案

DPDK 和 Netfilter Hook 之间存在巨大差异。当使用 Netfilter/hooking NF_IP_PRE_ROUTING 时,您劫持了数据包流并将数据包从内核空间复制到用户空间。这种复制会导致很大的开销。

当使用 DPDK 时,您实际上是将网卡的数据包缓冲区映射到用户空间内存区域。这意味着内核不是从 NIC 获得中断,而是将其传递通过所有队列,直到它到达 NF_IP_PRE_ROUTING ,后者会根据请求将打包程序复制到用户空间,DPDK 为您提供从用户空间直接访问映射数据包缓冲区的可能性,绕过内核的所有元处理,有效地提高性能(以代码复杂性和安全性为代价)。

关于linux - DPDK 和 Netfilter 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53360136/

相关文章:

linux - 当从 cron 调用脚本时,脚本中的 Sed 命令不起作用

Python 应用程序崩溃并出现错误 "ImportError: pyexpat.x86_64-linux-gnu.so: undefined symbol: XML_SetHashSalt"

linux - 如何在内核中获取当前用户,即如何以正确的方式调用 current->uid

linux - 生成内核镜像时,出现无法识别的命令行选项 ‘-mlongcalls' 错误

linux-kernel - 中断处理程序时间统计

c - skb_header_pointer 和 skb_transport_header 之间的区别?

linux - 如何使用 tc 和 cgroups 对数据包进行优先级排序

linux - 如何在 UNIX 中读取一个值

c - Netfilter 内核模块拦截数据包并记录它们

iptables - 如何从 tcpdump 输出中获取 from..to 偏移量以与 iptables 字符串匹配模块一起使用