一、网络设备
一般一个系统中如果可以连接外网的话,会有一个物理设备,也就是我们通常意义上所说的网卡。但是除了物理上的网卡,系统中还存在这个其他类型的网络设备,这些设备在网络中有着不同的应用场景。例如最为常见的loopback网卡,还有一些不那么常见的网络设备,例如tun/tap网络设备,bridge网络设备,它们都可以不对应具体的物理网络设备,但是可以在系统中存在,并且可以为套接口所感觉到。由于一个网络地址一般都是要依赖于一个网络设备才有意义,所以不同的网络设备就可以虚拟出不同的网络功能,例如最近在看的虚拟机和VPN技术,它们都是用了虚拟网卡,而且也都可能(可以)用到bridge(网桥)虚拟设备。
一个系统中具体有多少个网络设备可以从proc文件中读取。例如,我的虚拟机中所有的网络设备的列表为
[tsecer@Harry ~]$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 5500365 65797 0 0 0 0 0 0 5500365 65797 0 0 0 0 0 0
eth0: 971038 6026 0 0 0 0 0 0 989858 10854 0 0 0 0 0 0
tap0: 271253 402 0 0 0 0 0 0 110484 937 0 2 0 0 0 0
br0: 272684 1550 0 0 0 0 0 516 66003 457 0 0 0 0 0 0
除了第二个eth0可以认为是物理网卡之外,其它的都是虚拟出来的网络设备。
TUN和TAP不一样
现在统一的说法是:
TUN是点对点的三层设备,工作在IP层,处理IP分组;
TAP是虚拟以太网设备,工作在第二层,处理以太网帧;
而以下查得的资料也印证了这一点:
摘自Universal TUN/TAP device driver的FAQ:
The TUN is Virtual Point-to-Point network device.TUN driver was designed as low level kernel support forIP tunneling.
The TAP is a Virtual Ethernet network device.TAP driver was designed as low level kernel support forEthernet tunneling.
TUN works with IP frames. TAP works with Ethernet frames
摘自OpenVPN的FAQ:The difference between a tun and tap device is this: a tun device is a virtual IP point-to-point device and a tap device is a virtual ethernet device
其实这只是一面,说的很笼统,下面看一些更多的不同:
1、设备号大不同。
TUN 设备号是10 200,是字符设备下的misc设备,在2.6内核的miscdevice.h中定义的TUN_MINOR(从设备号)也是200;而TAP的是36 16,字符设备的netlink支持。
参见device-list(2008-3):
http://www.lanana.org/docs/device-list/devices-2.6+.txt
2、显然,设备号的不同导致了文件节点的不同:
TUN:/dev/net/tun
TAP:/dev/tap0
但是Universal TUN/TAP device driver的似乎是/dev/tun的类型,仔细发现这是在2.4内核之前的,在2.6以后,TUN设备就会对应于文件/dev/net/tun。
3、补充一下,从其他资料偶尔看到了:
TAP:子网掩码是/24,255.255.255.0,对应以太网设备
TUN:子网掩码是/30,255.255.255.252,点对点设备。
最后,在VTUN源代码咋实现open设备的打开时,TAP和TUN也是分开的,好像有两个TUN,一个是/dev/tun的节点(不包含<linux/if_tun.h>),一个是/dev/net/tun(包含<linux/if_tun.h>)。前者看来是为了2.4的核而设置的。
总结一下吧(主要是TUN设备的困惑,TAP就没有):
2.4的核:TUN 设备号是36 16+,文件节点:/dev/tun0
2.6的核:TUN 设备号是10 200,文件节点:/dev/net/tun
补充一下,其实具体是TUN或者是TAP,都不是在open打开设备的文件节点时就确定的。文件节点只是内核提供给用户的接口而已,应用程序需要ioctl
设置自己的虚拟网络设备的工作模式,是TUN还是TAP。
所以上面第二点的理解,需要变通一下!
以上是自己的一些看法,请大虾指教!