澄清关于TUN/TAP的概念

澄清关于TUN/TAP的概念
                  --初看VTUN的源代码
    近期看了一些关于Linux下的虚拟网卡设备的文章,都写得不错,比如IBM developerWorks和china unix上的,解释了相关的驱动程序设计的问题。
    但当我自己初看了VTUN的源代码,发现还是有些美中不足的地方。先把自己的看法抛砖引玉,希望大家一起探讨。最近很少用CSDN了,传的图片都不能看,唉....
    
    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。

  所以上面第二点的理解,需要变通一下!
    以上是自己的一些看法,请大虾指教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux TUN/TAP设备是一种虚拟网络设备,它能够模拟一个网络接口。通过TUN/TAP设备,用户空间的程序可以像操作物理网络设备一样,发送和接收网络数据包。 TUN/TAP设备主要有两种模式TUN模式TAP模式TUN模式主要用于IP层协议,TAP模式主要用于以太网层协议。两种模式的差异在于数据包的处理方式不同。 在Linux内核中,TUN/TAP设备的实现位于`drivers/net/tun.c`文件中。该文件中定义了一个名为`tun_net`的网络设备对象,并实现了`tun_chr_write_iter()`、`tun_chr_read_iter()`等函数,用于处理用户空间和内核空间之间的数据交互。 当用户空间的程序打开TUN/TAP设备时,会创建一个名为`tunX`的虚拟接口,其中`X`是一个数字,表示设备的编号。内核会将数据包发送到该虚拟接口,然后用户空间的程序可以通过读取该接口的文件描述符来接收数据包。同样地,用户空间的程序可以通过写入该接口的文件描述符来发送数据包。 TUN/TAP设备的实现使用了内核中的网络协议栈,因此它能够与其他网络设备无缝交互。用户空间的程序可以使用标准的套接字接口来与TUN/TAP设备进行通信,实现虚拟网络设备和物理网络设备之间的数据交换。 总之,TUN/TAP设备是一个非常有用的工具,它可以用于各种网络应用程序,如虚拟私有网络(VPN)和网络隧道。通过了解TUN/TAP设备的实现,我们可以更好地理解网络协议栈和Linux内核的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值