TAP和TUN

TAP是一个二层设备,但是是一个虚拟网络设备,每一个TAP都有一个对应的Linux字符设备,用户态程序通过对字符设备的读写,来完成与Linux内核网络协议栈的数据交换,说得直接一点,以太网设备,处理以太网帧

 

同理TUN是一个IP层点到点设备,debian8.1上tun的字符设备可以找到,但是tap却貌似找不到

lihui@2015:~$ ls /dev/net/tun
/dev/net/tun

 

下面一段话是网上摘下来的,随便看看

TUN/TAP 虚拟网络设备的原理比较简单,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备 /dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据包被保存在设备相关的一个队列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。

值得注意的是:一次read系统调用,有且只有一个数据包被传送到用户空间,并且当用户空间的缓冲区比较小时,数据包将被截断,剩余部分将永久地消失,write系统调用与read类似,每次只发送一个数据包。所以在编写此类程序的时候,请用足够大的缓冲区,直接调用系统调用read/write,避免采用C语言的带缓存的IO函数。

至于还有它们驱动程序的原理,直接看IBM文档库的这篇

http://www.ibm.com/developerworks/cn/linux/l-tuntap/

 

 

发表评论