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