文章目录

  • 收发机制原理
    • 共性
      • 虚拟网卡和物理网卡的通信
      • 网络传输包格式
    • 接收机制
    • 发送机制
    • 服务器端的转发机制

本章要研究的是openxxx的收发原理,实际上研究就是研究tun/tap网卡驱动的相关原理。

收发机制原理

共性

openxxx开启后,出现了 tap0 虚拟网卡,如下图:


tap类型的虚拟网卡是tun/tap驱动程序实现的,也就是说 openxxx 基于 tun/tap 虚拟网卡驱动了隧道包封装。

其中,tap表示虚拟的是以太网设备,tun表示虚拟的是点对点设备,这两种设备针对网络包实施不同的封装。

那么,虚拟网卡和物理网卡的转发原理是什么(数据包肯定要从物理网卡才能流出)?通信包又是如何封装的?这两点是本小节的主要关注点。

虚拟网卡和物理网卡的通信


从这个路由表可以看出,网段是10.8.0的IP数据包都会被发到tap0网卡。tap0网卡属于网卡,同样被系统内核的网络设备管理系统来管理。

站在管理系统的视角来看,虚拟网卡和实际网卡一样,都是网络设备。网络设备收到的数据,都会发到上层协议栈处理,而协议栈发出的数据,同样也会发动对应的网络设备。下图简要表示了这个结构:

协议栈根据目的IP来决定将数据包路由到哪一个网卡,那么虚拟网卡下层的“物理设备”是什么?

因为数据包肯定是从物理网卡出去的,所以虚拟网卡发出去的数据包最终要发到物理网卡。而基于tun/tap的虚拟网卡,其实现是通过用户态程序来将数据包转交。

而内核态和用户态的数据交互,在Linux下面有多种方式,比如通过Socket或者文件系统管理的文件交互或者设备文件。Linux下面的设备文件分为三大类:块设备、网络设备、字符设备。
块设备主要是存储类型的设备;网络设备使用socket访问;而字符设备就是以字节流形式通讯的I/O设备。

这里tun/tap驱动程序选择的是以字符设备(字符设备文件,Linux一切皆文件)作为传输通道。细节图如下(只看红线部分):

图中虚拟网卡将数据发送到字符设备文件,然后用户程序读取到文件内容后,进行处理,处理完以后将其发往协议栈,最后经由物理网卡发送出去。

可以看出,虚拟网卡既负责实现物理网卡的功能,又负责实现和字符设备的交互。所以tun/tap驱动程序实际上分成了两块:网卡驱动和字符设备驱动。

网络传输包格式

openxxx搭建好以后,我们都是直接使用局域网IP通信的,局域网IP数据包不能直接在公网上路由,我们其他应用发出的原始数据包示意图如下(我们只关注IP层):

这样的数据经过协议栈后自然会转发到虚拟网卡tap0,再有虚拟网卡tap0将其发送到openxxx,然后openxxx内部将这个完整的数据包进行加密,再封装上公网IP包头,数据包示意图如下:

所以实际上在网络中传输,路由依靠的仍然是公网IP头进行数据包的路由。

至于openxxx怎么知道内网和公网IP的映射,这点在openxxx客户端建立连接的时候就已经确认了。因为建立连接的时候openxxx会指定客户端的内网IP,并且由于能够收到客户端的握手信息,所以能够从包中提取到客户端实际的公网IP。

接收机制


接收机制如上图所示,蓝线是公网IP,红线是解密后的内网IP包。经过两次协议栈的路由,最终将数据发到用户程序。结合数据包的流转即可得知过程。

发送机制


发送机制如上图所示,红线是内网IP,蓝线是加密过后的公网IP包。包格式如上文所述。根据数据包的流转,即可得知过程。

服务器端的转发机制


服务端转发的时候并不需要经过tap虚拟网卡,因为数据包首先会到openxxx(参见接收机制),openxxx内部会得知该数据包是要转发到另外一台“局域网客户端的”,所以根据建立连接时的公网IP-内网IP映射关系,将公网IP包的目的IP改变即可。
所以蓝线部分直接就将数据包发送出去了。

为了验证猜想,直接将服务器端的tap0虚拟网卡关闭,一段时间后客户端之间仍然可以正常通信,所以在转发机制这边并不需要走虚拟网卡。

tun/tap虚拟网卡收发机制解析相关推荐

  1. linux下使用tun/tap虚拟网卡

    tun/tap虚拟网卡介绍 tun是一种虚拟网络设备,tun设备一端连接着用户程序,一端连接着内核协议栈,任何时候从协议栈发到tun网卡的数据都能从用户程序中读到,而从用户程序写入/dev/net/t ...

  2. tun/tap虚拟网卡

    简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在li ...

  3. Linux TUN/TAP 虚拟网卡编程入门https://backreference.org/2010/03/26/tuntap-interface-tutorial/...

    原文: https://backreference.org/2010/03/26/tuntap-interface-tutorial/ (为防和谐,下文中p=屁) Tun/Tap interface ...

  4. 启用tun设备开启tap虚拟网卡功能

    注意:该文章中的arp应答部分是有问题的,由于作者现在已经没有实验环境无法再进行修正了,望看该文章的人注意一下 关于tun设备启用tap网卡,就是启用一个字符设备,使用open函数得到一个tun设备的 ...

  5. linux虚拟网卡tun,Centos7 创建虚拟网卡(tun/tap)

    创建网卡.创建网桥并建立桥接 [root@kolla ~]# cat create.sh create_br(){ tunctl -t storage -u root brctl addbr virb ...

  6. linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上

    目录 linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上 一.tun/tap设备简介 二.在linux上使用tun/tap设备模拟一个虚拟网卡 三. 创建网桥连接到 ...

  7. 超猛tuntap虚拟网卡实现超猛UDP隧道

    TUN/TAP虚拟网卡在25Gbps物理网卡的环境下可以接近25Gbps的转发能力吗? 答案当然是可以. 实现简单到让你怀疑人生! 首先看一个图: 上周末写了点代码,这周贴上去: https://gi ...

  8. 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN

    Linux的网卡驱动中内含了很多"虚拟网卡".早先的文章曾经详细分析过tun,ifb等虚拟网卡,类似的思路,在虚拟化大行其道的趋势下,Linux源码树中不断增加对"网络虚 ...

  9. (OK) 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN

    http://blog.csdn.net/dog250/article/details/45788279 Linux的网卡驱动中内含了很多"虚拟网卡".早先的文章曾经详细分析过tu ...

最新文章

  1. 微软2012实习生笔试题及答案(望讨论)
  2. iOS系统 越狱系统还原(平刷)
  3. 【BERT】BERT模型压缩技术概览
  4. 1005. 继续(3n+1)猜想 (25)
  5. vant组件搜索并选择_借助PARTsolutions 选型助手,轻松快速地找到组件。
  6. linux系统安装宝塔面板
  7. C++ vector的反向迭代器
  8. 在网络上提供资源的计算机,在计算机网络中通常把提供并管理共享资源的计算机称为...
  9. 编辑index.html
  10. mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO
  11. 【金融】【python】处理表格(*.xlsx)形式的期货数据
  12. 邻接表的建立与spfa算法
  13. 解决@media screen (自适应)IE浏览器不兼容问题
  14. 虚拟机VMware插入U盘操作系统崩溃死机的解决方法
  15. SerialVersionUID [Java]
  16. 计算机日常故障DIY维修有哪些,计算机维护 DIY 完全手册
  17. (转)Unity MRTK语音输入
  18. Detailed OCI error val is 12154 and errmsg is ‘ORA-12154: TNS:could not resolve the connect identifi
  19. 媒体访问控制(MAC)子层
  20. T端军衔系统c++源代码,转自飞狐魔兽

热门文章

  1. 从iPhone应用中启动App Store
  2. Linux系统Deepin/Ubuntu解决IDEA输入中文光标无法跟随的问题
  3. 项目搭建后启动时无法自动打开浏览器 Your application is running here:
  4. 论文阅读 PCT:Point Cloud Transformer
  5. AI+影像赛道开启,美图在人工智能领域如何「名利双收」?
  6. android在浏览器中打开,在android浏览器中打开一个链接(WebView)
  7. B2B CRM服务商平台: 商户进件(关于间连新进件商家身份认证标准升级的公告)
  8. 仿照java的jdk动态代理实现go语言动态代理
  9. 帝国cms 自定义页面 php,帝国cms怎么加自定义页面
  10. PXE高效率批量网络装机