我想绕过Linux网络栈,将原始数据包转换为userland中的自定义代码,并在其中处理它们。
我知道您可以使用pf-rings或DPDK和其他工具来定制驱动程序。但是,我不明白为什么我要制作这样的驱动程序,而我可以使用Netfilter并将我的模块挂到NF_IP_PRE_ROUTING状态并将数据包发送到userland。
如果有人能解释他们之间的主要区别,对我会有很大的帮助。
发布于 2018-11-18 14:15:06
DPDK和Netfilter挂钩有很大的不同。在使用Netfilter /挂钩NF_IP_PRE_ROUTING时,您可以劫持数据包流,将数据包从内核空间复制到用户空间。此副本会造成很大的开销。
使用DPDK时,实际上是将网卡的数据包缓冲区映射到用户空间内存区域。这意味着内核不需要从NIC获得中断,而是通过所有队列将其传递到NF_IP_PRE_ROUTING,然后根据请求将封隔器复制到用户土地,DPDK为您提供了从用户空间直接访问映射的数据包缓冲区的可能性,从而绕过了内核的所有元处理,有效地提高了性能(代价是代码复杂性和安全性)。
发布于 2018-11-18 16:44:56
有多种技术可以捕获原始数据包并将它们传递给用户空间应用程序。细节上的魔鬼和往常一样。
如果我们所需要的只是向用户空间应用程序提供数据包,那么使用什么样的解决方案没有什么不同。或者是tun/taps,或者Netfilter,或者pf-ring,什么的。一切都会好起来的。
但是,如果我们需要每秒处理1亿个数据包(在3 3GHz上,每包大约有30个CPU周期) --我认为我们现在没有其他选择,只有DPDK。谷歌为"DPDK性能报告“,并看一看。
DPDK是一个在许多平台(x86、ARM、POWER等)上工作良好并支持多个网卡的框架。没有必要编写驱动程序,对最流行的NIC的支持已经存在。
也有一个支持管理CPU核心,巨大的页面,内存缓冲区,加密,IP碎片等。所有的设计能够转发100个Mpps。如果我们需要那种表演..。
https://stackoverflow.com/questions/53360136
复制相似问题