注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

tun/tap工作原理分析  

2014-04-05 07:30:56|  分类: linux遂道技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     

在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。

      TAP摸拟一个以太网设备(以arp广播MAC识别),它操作第二层数据包如以太网数据帧。

     TUN模拟了网络层ip设备(以点对点的方式,使用ip标识),操作第三层数据包比如IP数据封包。

     操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。

     在linux环境下,uml-utilities工具提供tunctl,用来生成tun接口(三层);bridge_utils提供brctl工具,用来生成tap接口(二层)。现在的iproute2套件也已经集成了对应的工具模块了。


      在linux下,在使用tap/tun编程时,一经加载tun模块后"modprobe tun"后,再用lsmod测试就可以看到系统中已将tun.ko模块到工作区了。因为按照linux的系统理论,linux下的一切该为文件这个思路,此时试着看一下/dev/net下的文件变化,于是想到观察到了/dev/net/ 下已生成tun设备文件了。
         tun设备建立的是“点对点”链路,即tun隧道是三层隧道,没有二层链路。tap则工作二层链路。
        我们知道数据链路层有两种通信方式:
     (1)一种 是点对点的方式(可理解为点到点的广播),比如ppp协议;
     (2)另一种是广播的方式,比如以太网。
        tun设备建立的隧道只有两个端点,隧道中封装的是IP数据报文,也需要arp协议来定位隧道对端tun设备的mac,然而如果有多台机器同时连接进入一个虚拟网络并且属于同一个网段的话,其它机器是不会收到这个arp报文的,因为根本就没有二层链路帮忙广播转发这个arp报文。
      tun模式虽然在ip层看来所有的ip处于一个网段,但是这同一个网段的ip之间的通信靠的却不是链路层(比如以太网的arp),而是各个客户端和服务器的点对点链路,如果是tap模式,那很显然是有以太网链路层的,arp会在本端与对端之间传送。

附:
通用TUN/TAP虚拟设备驱动程序的常见问题。
1. 一般问题
1.1 What is the TUN ?
  TUN是虚拟点至点的网络设备。
  TUN驱动程序被设计为IP隧道在系统低水平内核支持。它提供了用户态应用两个接口:
   - /dev/tunX - character device(字符设备);
   - tunX - virtual Point-to-Point interface.
   用户级的应用程序可以写IP帧到/dev/个TUNx和内核将收到从个TUNx接口的数据帧。在相同的时间每帧在内核中写入这个TUNx接口可以通过从/dev/net下,由TUNx的设备用户态应用程序读取。
1.2 What is the TAP ?
   TAP是一个虚拟的以太网网络设备。功能上同一个物理级的以态网设备一样。
   TAP驱动被设计为以太网隧道“低”水平内核支持。它提供了用户态应用程序的两个接口:
   - /dev/tapX - character device(字符设备);
   - tapX - virtual Ethernet interface(虚拟以太网接口);
   用户级的应用程序可以将以太网数据帧写到/??dev/tapX这个字符设备中,系统内核即将收到这个从tapX接口发出的数据帧。与此同时,每帧被系统内核写入tapX接口,并可以通过设备用户态应用程序从/dev/tapX读取相应数据帧。
1.3 What platforms are supported by TUN/TAP driver ?
   目前,tun/tap已被3个类Unix系统支持:
    Linux kernels 2.2.x, 2.4.x,2.6+;
    FreeBSD 3.x, 4.x, 5+;
    Solaris 2.6, 7.0, 8+;
    注:基于以上系统有衍生系统也都支持。
1.4 What is TUN/TAP driver used for?
    正如上面所提到的,TUN/TAP驱动的主要目的与工作就是建立隧道与操作隧道。
    在(http://vtun.info)可以看到更多的细节解释。
1.5 虚拟网络设备是如何实际工作的呢?
    虚拟网络设备可以被看作是一个简单的点至点(即隧道)设备或以太网设备(比如网卡),当然它们看起来不是从物理介质直接接收的信息包,而是直接接收了来自用虚拟网络设备的数据报文。数据发送时也不是直接通过物理介质发送数据包,而是直接发给了对应的虚拟网络接口。
    比方说,你在TAP0配置IPX,那么无论什么时候,内核发送任何IPX报文都来自TAP0,它被传递给应用程序(比如VTUN)。应用程序进行加密,压缩,并将其发送到在TCP或UDP的另一侧。在另一侧的应用程序解压缩和解密它们,并写入数据包到TAP设备,内核处理数据包时就像是这些数据报文就是来自真实的物理设备。
    笔者理解:象vtun这种应用程序即是一个守护进程,拦劫着关于它自己的数据报文,然后修改报文结构,再选择真实物理接口发出,同时监听着对端发来的相关报文,再修改这些报文后再转给其它工作进程处理。
1.6 TUN驱动程序和TAP驱动程序之间的区别是什么?
     TUN适用于IP帧。Tap适用于以太网帧。
1.7 BPF和TUN / TAP驱动程序之间的区别是什么?
    BFP是一种先进的数据包过滤器,它可以连接到现有的网络接口,它不提供虚拟网络接口。
    TUN/TAP驱动程序提供虚拟网络接口并能够将BPF连接到该接口。
    注:BPF是带通滤波器,是一个允许特定频段的波通过同时屏蔽其他频段的设备。
 
1.8 是否TAP驱动内核支持以太网桥接?
   是。 Linux和FreeBSD的驱动程序支持以太网桥接。
  评论这张
 
阅读(947)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017