知识卡片

tun/tap与veth两种虚拟网卡方案的适用场景差异

普通读书笔记卡

内容

虚拟化网络设备里,两种主流虚拟网卡方案定位完全不同。tun/tap(更早出现, 2000年前后为实现隧道协议而生)一端连接网络协议栈,另一端连接用户态 程序——tap模拟以太网设备操作二层数据包,tun模拟网络层设备操作三层 IP报文。它的价值在于让用户态程序能截获协议栈数据包、任意加工后再发回 链路,VPN正是典型应用:应用发给tun0的数据包被VPN程序截获、加密后重新 封装进发给另一地址的新数据包(这种”包套包”的处理方式叫”隧道”)。代价 是数据要经过两次协议栈,有明显性能损耗。veth(Linux Kernel 2.6起,伴随 网络名称空间隔离一起出现)本质是一对设备(veth pair),类比成物理设备 更接近”一对由交叉网线连接的网卡”——数据从一端进去,原样从另一端出来, 不需要反复经过协议栈,性能比tun/tap更好,内核实现也极简单(几十行代码 的数据复制函数)。但veth要求设备成对出现、数据原样传输,没有tun/tap那样 “程序员完全掌控加工逻辑”的灵活性。因此容器对容器的直接通信,条件允许时 优先选veth(性能更好),需要在传输过程中做压缩、加密、透明代理这类 加工时才用tun/tap(灵活性更高)——这是一条贯穿本章的选择逻辑:性能和 灵活性往往是此消彼长的两个维度。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第12章"容器间网络"12.1.3节 "虚拟化网络设备"(源文件:_epub-src对应OEBPS/Text/chapter147.xhtml) - 结论依据:原文详述tun/tap一端连协议栈一端连用户态程序、可用于VPN隧道 加工但需两次协议栈的性能代价,以及veth pair原样传输、性能更好但缺乏 加工灵活性,并说明容器间直接通信优先选veth,直接支撑本卡片结论。 - 原始内容:使用tun/tap设备传输数据需要经过两次协议栈,不可避免地会有 一定的性能损耗,如果条件允许,容器对容器的直接通信并不会把tun/tap 作为首选方案,一般是基于稍后介绍的veth来实现的……由于两个容器之间 采用veth通信不需要反复多次经过网络协议栈,这让veth有比tap/tun更好的 性能。