我刚刚在这里问了一个问题:previous question
Tun / tap设备会避免安装netmap / pf_ring / dpdk吗? 如果tun / tap允许绕过内核,那不是一回事吗?
或者那些代码带来了如此多的优化,以至于它们超越了操作系统旁路策略?
我在这里不太明白。
谢谢
答案 0 :(得分:2)
TUN / TAP接口是虚拟网络接口,其中不是从物理介质发送和接收数据包,而是从用户空间程序发送和接收它们。它们不通过内核,但通常将TAP接口设置为默认接口,以便让用户空间程序拦截应用程序流量。
考虑下图,是用户空间程序与网络接口和网络堆栈的典型交互。
+--------------------------+
| Network Interface Driver |
+------------+-------------+
|
+------------+-------------+
| Network Stack |
+--------+---+---+---------+
| | | Kernel Space
+----------------------------------------+
| | | User Space
|Sockets|
| | |
+--------+---+---+---------+
| User Space Applications |
+--------------------------+
在TAP接口的情况下,没有办法完全绕过网络堆栈。用户空间应用程序仍然可以连接到物理接口。只有当帧专门指向TAP接口时,拦截器应用程序才能拦截帧。
+--------------------------+ +--------------------------+
| Network Interface Driver | | TAP Interface |
+------------+-------------+ +--------+----+------------+
| | |
+------------+-------------+ | |
| Network Stack +--------------+ |
+---+------------------+---+ |
| | | Kernel Space
+-------------------------------------------------------------------------+
| | | User Space
Sockets to NIC Sockets to TAP TAP File Descriptor
| | |
+---+------------------+---+ +-------------+------------+
| Normal Applications | | Interceptor Application |
+--------------------------+ +--------------------------+
如果Netmap一旦用户空间应用程序专门获取了NIC,则由用户空间应用程序决定哪些帧(如果有)可以注入网络堆栈。因此,我们可以获得直接数据包捕获的性能,并在需要时利用网络堆栈服务。独占访问NIC并不总是一个好的功能,考虑NIC必须回复ARP请求时的简单方案。
+-----------------------------------------------------------+
| Netmap Enabled Network Interface Driver |
+-----+-----------------------------------------------------+
|
+-----+-----+ +-----------+ +--------------------------+
| NIC Rings | | Host Ring +------+ Network Stack |
+-----+-----+ +-----+-----+ +--------+---+---+---------+
| | | | | Kernel Space
+-------------------------------------------------------------------------+
| | | | | User Space
MMAP Access MMAP Access |Sockets|
| | | | |
+-----+-------------+------+ +--------+---+---+---------+
| Interceptor Application | | Normal Applications |
+--------------------------+ +--------------------------+
不幸的是,根据http://dpdk.org/doc/guides/sample_app_ug/netmap_compatibility.html
,DPDK不支持“主机响铃”我不确定PF_RING
另请注意,为了使用NETMAP / PF_RING / DPDK,您必须修改,重新编译甚至重新设计应用程序以匹配框架。