tun/tap是纯软件实现的一套虚拟网络设备。tap表示虚拟以太网设备,工作在二层网络上,具有直接处理以太帧的能力。tun表示虚拟点对点设备,工作在三层网络上,具有处理IP包的能力。
其实现原理相对简单。它在内核空间添加一个杂项设备(msicdevice)/dev/net/tun,实质上就是一个主设备号为10的字符设备,作为用户空间与内核空间信息交互的接口。tun/tap驱动程序包括两个部分,一部分是字符设备驱动,另一部分是虚拟网卡驱动。利用网卡驱动部分,接收来自内核协议栈的网络数据包并发送出去,或者反过来将接收到的数据包转交给内核协议栈处理。而字符设备驱动部分则负责数据包在内核空间与用户空间之间传递。
这里以2.6.18内核为例。内核为tun/tap驱动定义的结构体描述如下:<source-code>/include/linux/if_tun.h
struct tun_struct {
struct list_head list; //tun/tap网络设备链表
unsigned long flags; //区分tun或tap设备
...
wait_queue_head_t read_wait; //等待队列
struct sk_buff_head readq; //接收数据包缓存链表
struct net_device *dev; //对应的网络设备结构
...
}