Linux虚拟网卡设备tun/tap介绍_2

       上次说了linux下tun模块的编译安装,是tapip用户态协议栈测试的一个必选项。接下来一个一个了解。

       tapip代码仓库:https://github.com/chobits/tapip

什么是Tun/Tap?

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

    TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。  

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

应用程序如何操作Tun/Tap ?

    Linux Tun/Tap驱动程序为应用程序提供了两种交互方式:虚拟网络接口和字符设备/dev/net/tun。写入字符设备/dev/net/tun的数据会发送到虚拟网络接口中;发送到虚拟网络接口中的数据也会出现在该字符设备上。

    应用程序可以通过标准的Socket API向Tun/Tap接口发送IP数据包,就好像对一个真实的网卡进行操作一样。除了应用程序以外,操作系统也会根据TCP/IP协议栈的处理向Tun/Tap接口发送IP数据包或者以太网数据包,例如ARP或者ICMP数据包。Tun/Tap驱动程序会将Tun/Tap接口收到的数据包原样写入到/dev/net/tun字符设备上,处理Tun/Tap数据的应用程序如VPN程序可以从该设备上读取到数据包,以进行相应处理。

    应用程序也可以通过/dev/net/tun字符设备写入数据包,这种情况下该字符设备上写入的数据包会被发送到Tun/Tap虚拟接口上,进入操作系统的TCP/IP协议栈进行相应处理,就像从物理网卡进入操作系统的数据一样。

    Tun虚拟设备和物理网卡的区别是Tun虚拟设备是IP层设备,从/dev/net/tun字符设备上读取的是IP数据包,写入的也只能是IP数据包,因此不能进行二层操作,如发送ARP请求和以太网广播。与之相对的是,Tap虚拟设备是以太网设备,处理的是二层以太网数据帧,从/dev/net/tun字符设备上读取的是以太网数据帧,写入的也只能是以太网数据帧。从这点来看,Tap虚拟设备和真实的物理网卡的能力更接近。

下图描述了Tap/Tun的工作原理:

8d80610e2c1befedaaab9f6a695640c2.png

1、物理网卡收发数据过程

物理网卡可以接收和发送数据:

①收:外界向该物理网卡发送数据时,外界发送到网卡的数据最终会传输到内核空间的网络协议栈中

②发:本机要从物理网卡发送数据时,数据将从内核的网络协议栈传输到网卡,网卡负责将数据发送出去

现在的网卡具备DMA能力,所以网卡和网络协议栈之间的数据传输由网卡负责,而非由内核亲自占用CPU来执行读和写

这里可以将内核看作是一个封闭的加工厂,将物理网卡看作是加工厂的一扇门,门的一端是加工厂,门的另一端是外界。物理网卡也一样,它的一端是内核空间的网络协议栈,另一端是外界网络,物理网卡就是这两者之间以比特流方式收发数据的硬件设备。

35d96135772317e6af22a5e9b69d6838.png    

一般来说,数据的起点和终点是用户程序,所以多数时候的数据需要在用户空间和内核空间(网络协议栈)再传输一次:

①当用户进程的数据要发送出去时,数据从用户空间写入内核的网络协议栈,再从网络协议栈传输到网卡,最后发送出去

②当用户进程等待外界响应数据时,数据从网卡流入,传输至内核的网络协议栈,最后数据写入用户空间被用户进程读取

在这些过程中,内核和用户空间的数据传输由内核占用CPU来完成,内核和网卡之间的数据传输由网卡的DMA来完成,不需要占用过多的CPU。

36da77a9acb795a201b90f6b2c275ad5.png

2、虚拟网卡设备

物理网卡需要通过网卡驱动在内核中注册后才能工作,它在内核网络协议栈和外界网络之间传递数据,用户可以为物理网卡配置网卡接口属性,比如IP地址,这些属性都配置在内核的网络协议栈中。

内核也可以直接创建虚拟的网卡,只要为虚拟网卡提供网卡驱动程序,使其在内核中可以注册成为网卡设备,它就可以工作。    

其实,从Linux内核3.x版本开始,物理网卡和虚拟网卡是平等的设备,它们都会在注册时创建net_device数据结构来保存(物理或虚拟)设备信息。

相比于物理网卡负责内核网络协议栈和外界网络之间的数据传输,虚拟网卡的两端则是内核网络协议栈和用户空间,它负责在内核网络协议栈和用户空间的程序之间传递数据:

发送到虚拟网卡的数据来自于用户空间,然后被内核读取到网络协议栈中

内核写入虚拟网卡准备通过该网卡发送的数据,目的地是用户空间

167614323bf2f12620654c13cc21f986.png

3、虚拟网卡和物理网卡的对比

和物理网卡对比一下,物理网卡是硬件网卡,它位于硬件层,虚拟网卡则可以看作是用户空间的网卡,就像用户空间的文件系统(fuse)一样。

物理网卡和虚拟网卡唯一的不同点在于物理网卡本身的硬件功能:物理网卡以比特流的方式传输数据。

也就是说,内核会公平对待物理网卡和虚拟网卡,物理网卡能做的配置,虚拟网卡也能做。比如可以为虚拟网卡接口配置IP地址、设置子网掩码,可以将虚拟网卡接入网桥等等。    

只有在数据流经物理网卡和虚拟网卡的那一刻,才会体现出它们的不同,即传输数据的方式不同:物理网卡以比特流的方式传输数据,虚拟网卡则直接在内存中拷贝数据(即,在内核之间和读写虚拟网卡的程序之间传输)。

正因为虚拟网卡不具备物理网卡以比特流方式传输数据的硬件功能,所以,绝不可能通过虚拟网卡向外界发送数据,外界数据也不可能直接发送到虚拟网卡上。能够直接收发外界数据的,只能是物理设备。

虽然虚拟网卡无法将数据传输到外界网络,但却:

①可以将数据传输到本机的另一个网卡(虚拟网卡或物理网卡)或其它虚拟设备(如虚拟交换机)上

②可以在用户空间运行一个可读写虚拟网卡的程序,该程序可将流经虚拟网卡的数据包进行处理,这个用户程序就像是物理网卡的硬件功能一样,可以收发数据(可将物理网卡的硬件功能看作是嵌入在网卡上的程序),比如OpenVPN就是这样的工具

很多人会误解这样的用户空间程序,认为它们可以对数据进行封装。比如认为OpenVPN可以在数据包的基础上再封装一层隧道IP首部,但这种理解是错的。

一定请注意,用户空间的程序是无法对数据包做任何封装和解封操作的,所有的封装和解封都只能由内核的网络协议栈来完成。    

372c33ef8919caad5f007672ca5f88a9.png

使用OpenVPN之所以可以对数据再封装一层隧道IP层,是因为OpenVPN可以读取已经封装过一次IP首部的数据,并将包含ip首部的数据作为普通数据通过虚拟网卡再次传输给内核。因为内核接收到的是来自虚拟网卡的数据,所以内核会将其当作普通数据从头开始封装(从四层封装到二层封装)。当数据从网络协议栈流出时,就有了两层IP首部的封装。

换句话说,每一次看似由用户空间程序进行的额外封装,都意味着数据要从内核空间到用户空间,再到内核空间。

4、虚拟网卡设备tun/tap

tun、tap是Linux提供的两种可收发数据的虚拟网卡设备。

tun、tap作为虚拟网卡,除了不具备物理网卡的硬件功能外,它们和物理网卡的功能是一样的,此外tun、tap负责在内核网络协议栈和用户空间之间传输数据。

tun和tap的区别

tun和tap都是虚拟网卡设备,但是:

tun是三层设备,其封装的外层是IP头    

tap是二层设备,其封装的外层是以太网帧(frame)头

tun是PPP点对点设备,没有MAC地址

tap是以太网设备,有MAC地址

tap比tun更接近于物理网卡,可以认为,tap设备等价于去掉了硬件功能的物理网卡

这意味着,如果提供了用户空间的程序去收发tun/tap虚拟网卡的数据,所收发的内容是不同的:

收发tun设备的用户程序,只能间接提供封装和解封数据包的IP头的功能

收发tap设备的用户程序,只能间接提供封装和解封数据包的帧头的功能

注意,此处用词是【收发数据】而非【处理数据】,是【间接提供】而非【直接提供】,因为在不绕过内核网络协议栈的情况下,读写虚拟网卡的用户程序是不能封装和解封数据的,只有内核的网络协议栈才能封装和解封数据

虚拟网卡的两个主要功能是:

连接其它设备(虚拟网卡或物理网卡)和虚拟交换机(bridge)

提供用户空间程序去收发虚拟网卡上的数据

基于这两个功能,tap设备通常用来连接其它网络设备(它更像网卡),tun设备通常用来结合用户空间程序实现再次封装。换句话说,tap设备通常接入到虚拟交换机(bridge)上作为局域网的一个节点,tun设备通常用来实现三层的ip隧道。

欢迎关注:

往期相关:

linux下安装tun模块详细教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值