tun/tap虚拟网卡收发机制解析
文章目录
- 收发机制原理
- 共性
- 虚拟网卡和物理网卡的通信
- 网络传输包格式
- 接收机制
- 发送机制
- 服务器端的转发机制
本章要研究的是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虚拟网卡收发机制解析相关推荐
- linux下使用tun/tap虚拟网卡
tun/tap虚拟网卡介绍 tun是一种虚拟网络设备,tun设备一端连接着用户程序,一端连接着内核协议栈,任何时候从协议栈发到tun网卡的数据都能从用户程序中读到,而从用户程序写入/dev/net/t ...
- tun/tap虚拟网卡
简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在li ...
- 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 ...
- 启用tun设备开启tap虚拟网卡功能
注意:该文章中的arp应答部分是有问题的,由于作者现在已经没有实验环境无法再进行修正了,望看该文章的人注意一下 关于tun设备启用tap网卡,就是启用一个字符设备,使用open函数得到一个tun设备的 ...
- linux虚拟网卡tun,Centos7 创建虚拟网卡(tun/tap)
创建网卡.创建网桥并建立桥接 [root@kolla ~]# cat create.sh create_br(){ tunctl -t storage -u root brctl addbr virb ...
- linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上
目录 linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上 一.tun/tap设备简介 二.在linux上使用tun/tap设备模拟一个虚拟网卡 三. 创建网桥连接到 ...
- 超猛tuntap虚拟网卡实现超猛UDP隧道
TUN/TAP虚拟网卡在25Gbps物理网卡的环境下可以接近25Gbps的转发能力吗? 答案当然是可以. 实现简单到让你怀疑人生! 首先看一个图: 上周末写了点代码,这周贴上去: https://gi ...
- 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN
Linux的网卡驱动中内含了很多"虚拟网卡".早先的文章曾经详细分析过tun,ifb等虚拟网卡,类似的思路,在虚拟化大行其道的趋势下,Linux源码树中不断增加对"网络虚 ...
- (OK) 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN
http://blog.csdn.net/dog250/article/details/45788279 Linux的网卡驱动中内含了很多"虚拟网卡".早先的文章曾经详细分析过tu ...
最新文章
- 微软2012实习生笔试题及答案(望讨论)
- iOS系统 越狱系统还原(平刷)
- 【BERT】BERT模型压缩技术概览
- 1005. 继续(3n+1)猜想 (25)
- vant组件搜索并选择_借助PARTsolutions 选型助手,轻松快速地找到组件。
- linux系统安装宝塔面板
- C++ vector的反向迭代器
- 在网络上提供资源的计算机,在计算机网络中通常把提供并管理共享资源的计算机称为...
- 编辑index.html
- mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO
- 【金融】【python】处理表格(*.xlsx)形式的期货数据
- 邻接表的建立与spfa算法
- 解决@media screen (自适应)IE浏览器不兼容问题
- 虚拟机VMware插入U盘操作系统崩溃死机的解决方法
- SerialVersionUID [Java]
- 计算机日常故障DIY维修有哪些,计算机维护 DIY 完全手册
- (转)Unity MRTK语音输入
- Detailed OCI error val is 12154 and errmsg is ‘ORA-12154: TNS:could not resolve the connect identifi
- 媒体访问控制(MAC)子层
- T端军衔系统c++源代码,转自飞狐魔兽
热门文章
- 从iPhone应用中启动App Store
- Linux系统Deepin/Ubuntu解决IDEA输入中文光标无法跟随的问题
- 项目搭建后启动时无法自动打开浏览器 Your application is running here:
- 论文阅读 PCT:Point Cloud Transformer
- AI+影像赛道开启,美图在人工智能领域如何「名利双收」?
- android在浏览器中打开,在android浏览器中打开一个链接(WebView)
- B2B CRM服务商平台: 商户进件(关于间连新进件商家身份认证标准升级的公告)
- 仿照java的jdk动态代理实现go语言动态代理
- 帝国cms 自定义页面 php,帝国cms怎么加自定义页面
- PXE高效率批量网络装机