我想绕过Linux网络堆栈,并将原始数据包转换为userland
中的自定义代码,并在那里处理它们。
我知道您可以使用pf-rings
或DPDK等来制作自定义驱动程序。但是我无法理解为什么我应该使用Netfilter并将模块挂接到NF_IP_PRE_ROUTING
状态并将数据包发送到userland
的同时制作这些驱动程序。
如果任何人都可以向我解释他们之间的主要区别,那将对我有很大的帮助。
答案 0 :(得分:2)
DPDK和Netfilter挂钩之间有巨大的区别。使用Netfilter
/挂接NF_IP_PRE_ROUTING
时,您劫持了数据包流,并复制数据包形成了内核空间到用户空间。此副本会导致大量开销。
使用DPDK
时,实际上是在将网卡的数据包缓冲区映射到用户空间存储区。这意味着内核无需从NIC获取中断,而是将其通过所有队列,直到到达NF_IP_PRE_ROUTING
,这反过来将根据请求将打包程序复制到用户区,DPDK
为您提供了以下可能性:从用户空间直接直接访问映射的数据包缓冲区,绕过内核的所有元处理,有效地提高了性能(以代码复杂性和安全性为代价)。
答案 1 :(得分:1)
有多种技术可以捕获原始数据包并将其传送到用户空间应用程序。像往常一样,魔鬼在细节中。
如果我们需要的只是将数据包传递到用户空间应用程序-使用哪种解决方案没有区别。 Libpcap或tun / tap或Netfilter或pf环或其他任何东西。一切都会好起来的。
但是,如果我们需要每秒处理1亿个数据包(在3GHz上每个数据包需要30个CPU周期),那么我认为除了DPDK之外,我们目前没有其他选择。谷歌提供“ DPDK性能报告”,看看吧。
DPDK是一个框架,可以在许多平台(x86,ARM,POWER等)上很好地工作,并支持许多NIC。无需编写驱动程序,已经有了对最受欢迎的NIC的支持。
还支持管理CPU内核,大页面,内存缓冲区,加密,IP碎片等。所有这些都设计为能够转发100 Mpps。如果我们需要那种性能...