TAP TUN介绍
tap/tun 是 Linux 内核 2.4.x 版本之后实现的虚拟网络设备,可以配置 IP, Linux 网络设备管理模块统一管理。文章重点是对TAP业务流量本身的理解。
对2端的理解
TAP/TUN作为虚拟网卡的一种类型,存在2端,一端连接内核网络协议栈,另一端连接用户态。
网络协议栈这端--虚拟接口底层逻辑
创建tap0接口,会在内核态中创建一个虚拟网卡设备,内核将该虚拟设备安装tun网卡驱动。安装成功后,tun驱动会在网络协议栈的设备接口层创建出来tap0虚拟网口。
用户态端--怎么用TAP/TUN接口
用户态端被业务如DPDK/VPP等应用,通过open("/dev/net/tun")统一的TUN设备作为入口,指定需要操作的tap0接口名称,并生成ifr的接口数据结构,使用ioctl与TUN驱动交互,将tap0接口与一个文件描述符fd进行绑定,后续可以通过该fd对tap0设备进行读写了。
注意:这里与网上大部分文档说的/dev/tap0文件打开都不符,都是些很老的内核版本文档了,抄来抄去的有意思吗?
可以访问tap0设备后,那就可以理解下面的示意图了。
流量转发的理解
应用类型--什么时候用TAP/TUN接口
首先搞清楚啥情况下用tap/tun类型接口,不能盲目的去构建网络拓扑,原理不清楚流量就没法打通。
基于tap/tun类型2端的特点,一端连接内核,一端连接用户态。说明用户态测应用有处理网络流量的需求才会采用这类接口,并且不希望数据包发送到外部环境,希望能在同主机内部进行网络流量的特殊处理。
既然是特殊处理,HOST网络协议栈是无法实现或者很难达到目的,比如VPP的网络协议编排、DPDK的网络流量bypass内核等,需要绕过或者希望能在用户态空间处理网络流量。所以tap/tun的2端正是为了解决这类网络需求产生的,因此常用于DPDK/VPP/网络虚拟化等场景。
流量转发--包在TUN架构下怎走的
搞清楚 底层逻辑-怎么用-什么时候用,现在好奇下网络包怎么走的。
参考上面流程,直接替换PING 一个外部IP,PING进程发送ICMP报文给网络协议栈,网络层处理ICMP时查询目标IP的路由信息,发现该IP的需要通过tap0口发送出去,协议栈会将报文转给tap0设备,TUN驱动将报文写到打开该tap0网口的fd,用户态的VPP通过read fd方式收到该报文。VPP根据tap-inject配置,读取的报文根据VPP内部协议树,按照图节点处理顺序层层转发,在eth0-tx图节点最后处理,该节点会关联eth0网卡驱动的发送通道,进而从真正的物理网卡发送出HOST。收包流程也是类似,不同点在于具体更长和更多种类的图节点路径,可以编排出多种类型的网络协议处理方案。