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 ...
最新文章
- MLCC噪声啸叫及对策
- POPUP_GET_VALUES
- 数据库系统概念总结:第十二、十三章 查询处理和查询优化
- Genymotion模拟器
- Atitit. Atiposter 发帖机 新特性 poster new feature v7 q39
- HDU 3081 Marriage Match II【并查集+二分图最大匹配】
- call线程起名字_Java线程的5个使用技巧
- Linux console on LCD
- Zuul 2 –样本过滤器
- java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...
- nuxt webpack配置css,vuecli或nuxt用Webpack的优雅ProgressBar(webpackBar)
- 计算Linux内存,CUP,硬盘使用率的shell脚本
- GridView 一些操作
- 新型APT组织正在攻击全球的政府实体
- Ng第五课:Octave 教程(Octave Tutorial)
- paip.JAVA的几大优点与缺点相比C#.NET.txt
- 全开源即时通讯(IM)系统 高仿微信
- 离散度计算公式 python_Python分析离散心率信号(中)
- 嵩天老师python123测验7: 文件和数据格式化 (第7周)
- 《仿真使用ARENA软件》
热门文章
- HDOJ 2108 Shape of HDU(凸包问题)
- wps linux 中文ibus,解决wps for linux 中文输入法光标不跟随的问题
- 华为服务器raid卡型号,RAID卡类型 - 华为V2V3服务器 RAID控制卡 用户指南 45 - 华为...
- 你的业务被AI所取替的风险度有多高?AI社交、克隆人、角色扮演、代理人
- 退市35年后,牛仔裤品牌李维斯要重新IPO了 1
- mmap java_Java中mmap的使用
- 汉诺塔问题思路的证明
- 30个最优秀的在线照片编辑工具
- Scaleform相关资料整理
- 一念起,念念不绝,此所谓初心