c - tcp - netmap:可以使用tun / tap接口来取消netmap的使用吗?

时间:2014-10-12 20:14:26

标签: c tcp packet

我刚刚在这里问了一个问题:previous question

Tun / tap设备会避免安装netmap / pf_ring / dpdk吗? 如果tun / tap允许绕过内核,那不是一回事吗?

或者那些代码带来了如此多的优化,以至于它们超越了操作系统旁路策略?

我在这里不太明白。

谢谢

1 个答案:

答案 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,您必须修改,重新编译甚至重新设计应用程序以匹配框架。