一 图例
二 图解
1 将vm的网卡和host OS的网卡连接在一起。
2 通过tun/tap adapter,会在host OS上生成虚拟网卡tap。
3 tun是点对点的网络设备,使得vm的网卡和tap虚拟网卡成为一对。
4 从vm网卡发出的所有网络包,host OS的tap0都能收到,最终通过eth0发出。
5 虚拟机将网络包通过字符设备写入/dev/net/tun(host OS上的一个文件)。
6 字符设备驱动将数据包写入虚拟网卡驱动。
7 虚拟网卡驱动将包通过tcp/ip协议栈写入host OS上的虚拟网卡tap0.
8 在host OS通过路由规则(通过网桥(东西向流量)、网桥和路由器(南北向流量)),包从ech0出去。
三 原理
TAP/TUN是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层,Linux内核通过TAP/TUN设备向绑定该设备的用户空间程序发送数据,反之,用户空间程序也可以像操作硬件网络设备那样,通过TAP/TUN设备发送数据。
基于TAP驱动,即可以实现虚拟网卡的功能,虚拟机的每个vNIC都与hypervisor中的一个TAP设备相连。当一个TAP设备被创建时,在Linux设备文件目录下生会生成一个对应的字符设备文件,用户程序可以打开普通文件一样打开这个文件进行读写。
当对这个TAP设备文件执行write()操作时,对于Linux网络子系统来说,相对于TAP设备收到了数据,并请求内核接受他,Linux内核收到此数据后将根据网络配置进行后续处理,处理过程类似于普通的物理网卡从外界收到数据。(VM向外发数据)。
当用户程序执行read()请求时,相对于向内核查询TAP设备上是否有数据需要被发送,有的话则取出到用户程序里,从而完成TAP设备发送数据的功能。(VM接收数据)。
在这个过程中,TAP设备可以被当做本机的一个网卡,而操作TAP设备应用程序相对于另外一台VM,它通过read/write系统调用,和本机进行网络通信。
VETH设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接收的形式出现。创建并配置正确后,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。
四 veth、tun、tap比对
1 图例
2 图解
tun:点对点的设备,tun设备模拟网络层设备,处理三层报文,如IP报文。tun设备完全不需要物理地址的。它收到和发出的包不需要arp,也不需要有数据链路层的头。
tap:是一个普通的以太网设备,tap设备模拟链路层设备,处理二层报文,比如以太网帧。tap设备需要有完整的物理地址和完整的以太网帧
TUN用于路由,而TAP用于创建网桥。
五 参考