DPDK 和 Netfilter 的区别

differences between DPDK and Netfilter

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

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

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

DPDK 和 Netfilter 挂钩之间存在巨大差异。当使用 Netfilter / 挂钩 NF_IP_PRE_ROUTING 时,您劫持了数据包流,并且 复制 数据包从内核 space 到用户 space。这个副本会造成很大的开销。

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

有多种技术可以获取原始数据包并将它们传送到用户空间应用程序。一如既往的细节中的魔鬼。

如果我们只需要将数据包传送到用户空间应用程序——使用什么解决方案没有区别。 Libpcap,或 tun/taps,或 Netfilter,或 pf-ring,或其他。一切都会好起来的。

但是如果我们需要每秒处理 1 亿个数据包(在 3GHz 上每个数据包约 30 CPU 个周期)——我认为目前除了 DPDK 我们没有其他选择。 Google for "DPDK performance report" 看看。

DPDK 是一个在许多平台(x86、ARM、POWER 等)上运行良好并支持许多 NIC 的框架。不用写驱动,最流行的网卡都支持

还支持管理 CPU 个核心、大页面、内存缓冲区、加密、IP 碎片等。所有这些都旨在能够转发 100 Mpps。如果我们需要这样的性能...