计算机系统通常由一个或一组网络设备组成,如eth0,eth1等网络设备。这些网络设备对应物理网络设备,负责对网络上的数据进行收发。
而在系统内部,常常也需要内部通道来对数据报文进行修改、隧道和转发,这种内部通道就是使用虚拟网络设备构建的,如 TUN, TAP和 Veth Pairs设备。
TUN/TAP
TUN/TAP为用户态程序提供报文接收和传输功能,它可以看作是一个简单的点对点或以太网设备,只不过它不是从物理设备接收数据包,而是从用户态程序接收数据包,将它们写入用户态程序。
TUN/TAP 驱动程序在 Linux 主机上创建了虚拟网络接口,该接口的功能与其他接口一样,可以为其分配IP,分析流量,将流量路由到这个接口。
TUN/TAP 有 2 种驱动程序模式,也就是 TUN 和 TAP。
- TUN(隧道)设备在第 3 层运行,这意味着从文件描述符接收的数据将基于 IP 协议栈。写回设备的数据也必须采用 IP 报文的形式。
- TAP(网络Tap口)的操作与 TUN 非常相似,但是它是基于二层实现的,用于处理以太网报文。在基于 KVM/Qemu 的虚拟化中经常能看到TAP设备创建并传给Guest系统。
Veth Pairs
Veth Pair是一对互连的虚拟以太网接口,可以当作网络上的跳线,从一端输出的数据会从另一端出来。这使得 Veth Pair 非常适合将不同的虚拟网络组件连接在一起,例如 Linux 网桥、OVS 网桥等等。
OpenStack的Neutron组件大量使用了这种设备,将多个网桥连接在一起,这是目前无法通过基于tap的设备做到的。
下图是这三种虚拟网络设备的总结和比较。