Linux TUN设备实现Tunnel性能分析

一、TUN/TAP设备原理:

Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块,通常用于组建虚拟局域网中的点对点隧道(Tunnel),可以工作于2层(TAP设备)和3层(TUN设备)数据交换。其工作原理图如下:

1. 数据发送流程

  1. 应用程序通过socket向192.168.1.22地址发送数据{DATA}

  2. 数据进入内核协议栈,协议栈构造IP报文,生成{IP{DATA}}数据,并且分发到虚拟网卡

  3. 虚拟网卡将数据{IP{DATA}}转发到TUN驱动

  4. TUN App从TUN驱动读取到{IP{DATA}}数据,

  5. TUN App通过物理socket发送数据到内核协议栈,

  6. 内核协议栈对数据进行IP报文封装{IP{IP{DATA}}},传送到物理网卡

  7. 数据经过物理网卡送出MAC帧报文{MAC{IP{IP{DATA}}}}

上述流程中:

  • 1为socket write操作(用户空间到内核空间的数据交换)

  • 2,3均为内核数据交换

  • 4为fd read操作(内核空间到用户空间数据交换)

  • 5为socket write操作(用户空间到内核空间数据交换)

  • 6,7均为内核数据交换

2. 数据接收流程

  1. 物理网卡收取到来自网络的MAC帧报文数据包{MAC{IP{IP{DATA}}}},解包

  2. 数据包{IP{IP{DATA}}}进入内核协议栈,进行IP层解包生成{IP{DATA}}数据

  3. 根据数据包地址,数据被分配到TUN App的物理socket

  4. TUN App从socket读出数据{IP{DATA}},然后写入TUN 驱动

  5. TUN 驱动根据写入的IP包目标地址将地址送入对应的虚拟网卡

  6. 虚拟网卡将{IP{DATA}}送入内核协议栈

  7. 协议栈解包成{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隧道网络的性能跟直连网络的差距,并且找到瓶颈所在,然后提出可行的优化方法。

二、性能测试方法:

  1. 实现一个底层通过UDP建立隧道的TUN Proxy App(分别采用epoll和select模型实现)

  2. 在在两台机器上部署TUN Proxy App,组成VLAN

  3. 使用SCP程序在两台主机之间通过物理连接进行文件copy操作,记录传输性能参数

  4. 使用SCP程序在两台主机之间通过TUN隧道进行文件copy操作,记录传输性能参数

  5. 对比使用物理直连网络和TUN隧道网络传输的性能差异

采用epoll模型的TUN Proxy App的核心逻辑如下:

void packet_switch_epoll::process() {
  logi() << "+++++ process worker is running...";

  if (!evt_.open()) {
    loge() << "failed to open evtio";
    return;
  }

  evtio::evt_context tun_ctx_(fd_tun_, nullptr);
  evtio::evt_context udp_ctx(fd_socket_, nullptr);
  if (!evt_.attach(&tun_ctx_, evtio::op_read)) {
    loge() << "failed to add tun fd to evtio";
    return;
  }

  if (!evt_.attach(&udp_ctx, evtio::op_read)) {
    evt_.detach(&tun_ctx_);
    loge() << "failed to add udp fd to evtio&#

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值