一、TUN/TAP设备原理:
Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块,通常用于组建虚拟局域网中的点对点隧道(Tunnel),可以工作于2层(TAP设备)和3层(TUN设备)数据交换。其工作原理图如下:
1. 数据发送流程
-
应用程序通过socket向192.168.1.22地址发送数据{DATA}
-
数据进入内核协议栈,协议栈构造IP报文,生成{IP{DATA}}数据,并且分发到虚拟网卡
-
虚拟网卡将数据{IP{DATA}}转发到TUN驱动
-
TUN App从TUN驱动读取到{IP{DATA}}数据,
-
TUN App通过物理socket发送数据到内核协议栈,
-
内核协议栈对数据进行IP报文封装{IP{IP{DATA}}},传送到物理网卡
-
数据经过物理网卡送出MAC帧报文{MAC{IP{IP{DATA}}}}
上述流程中:
-
1为socket write操作(用户空间到内核空间的数据交换)
-
2,3均为内核数据交换
-
4为fd read操作(内核空间到用户空间数据交换)
-
5为socket write操作(用户空间到内核空间数据交换)
-
6,7均为内核数据交换
2. 数据接收流程
-
物理网卡收取到来自网络的MAC帧报文数据包{MAC{IP{IP{DATA}}}},解包
-
数据包{IP{IP{DATA}}}进入内核协议栈,进行IP层解包生成{IP{DATA}}数据
-
根据数据包地址,数据被分配到TUN App的物理socket
-
TUN App从socket读出数据{IP{DATA}},然后写入TUN 驱动
-
TUN 驱动根据写入的IP包目标地址将地址送入对应的虚拟网卡
-
虚拟网卡将{IP{DATA}}送入内核协议栈
-
协议栈解包成{DATA}送到应用程序的socket
上述流程中:
-
1,2均为内核数据交换
-
3为socket read操作(内核空间到用户空间数据交换)
-
4为fd write操作(用户空间到内核空间数据交换)
-
5,6均为内核数据交换
-
7为socket read操作(内核空间到用户空间数据交换)
为了对比,下图显示了直连情况下网络数据的收发流程:
3. 性能损耗点
对比直连网络,通过TUN隧道实现的数据流程中,发送流程中多出了一次TUN fd的读+一次socket写,接收流程中多出了一次socket的读+一次TUN fd的写,这些操作均由运行于用户态的TUN App完成,并且均涉及到用户态到内核态的数据交换,所以性能相比直连网络来说一定会有损耗。我们需要通过一定的测试方法来量化TUN隧道网络的性能跟直连网络的差距,并且找到瓶颈所在,然后提出可行的优化方法。
二、性能测试方法:
-
实现一个底层通过UDP建立隧道的TUN Proxy App(分别采用epoll和select模型实现)
-
在在两台机器上部署TUN Proxy App,组成VLAN
-
使用SCP程序在两台主机之间通过物理连接进行文件copy操作,记录传输性能参数
-
使用SCP程序在两台主机之间通过TUN隧道进行文件copy操作,记录传输性能参数
-
对比使用物理直连网络和TUN隧道网络传输的性能差异
采用epoll模型的TUN Proxy App的核心逻辑如下:
void packet_switch_epoll::process() {
|