我想绕过Linux网络堆栈,将原始数据包转换为userland中的自定义代码,并在其中进行处理。
我知道您可以使用pf-rings或dpdk和其他工具制作自定义驱动程序。但我不明白为什么我要做这些驱动程序,而我可以使用netfilter和钩子我的模块NF_IP_PRE_ROUTING状态和发送包到userland
如果有人能给我解释一下他们之间的主要区别,那将对我大有裨益。

最佳答案

dpdk和netfilter钩子之间有很大的区别。使用Netfilter/hookingNF_IP_PRE_ROUTING时,会劫持数据包流并将数据包从内核空间复制到用户空间。这个拷贝会引起很大的开销。
使用DPDK时,实际上是将网卡的数据包缓冲区映射到用户空间内存区域。这意味着,NF_IP_PRE_ROUTING不需要内核从nic获取中断,然后将其传递到它的所有队列中,直到它到达DPDK并在请求时将打包程序复制到userland,提供了直接从userspace访问映射包缓冲区的可能性,绕过了内核的所有元处理,有效地改进了性能(以代码复杂度和安全性为代价)。

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

10-09 03:49