我想绕过 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/