3. 主流Overlay封装技术对比
Overlay网络的核心动作,是把一个原始以太网帧或IP包“装进”另一个外层报文中,再通过底层Underlay网络转发。不同封装技术决定了外层头部长度、可携带的元数据能力、对硬件的依赖程度,以及最终的性能开销。理解这些差异,才能在多云环境中选对隧道类型。
封装格式与报文结构
先看最常用的VXLAN。它把原始二层帧封装在UDP中,外层结构为:外层以太头、外层IP头、UDP头(目的端口默认4789)、8字节VXLAN头,最后是原始以太帧。VXLAN头中的24位VNI(VXLAN Network Identifier)用于标识租户或网段,理论上支持约1600万个隔离网络。由于基于UDP,VXLAN可以穿越大多数三层网络,并且能被网卡硬件卸载。
GENEVE(Generic Network Virtualization Encapsulation)同样基于UDP,但设计更灵活。它的头部长度可变,基础头为8字节,之后可携带TLV(Type-Length-Value)选项,用于传递策略、安全上下文、服务链信息等。GENEVE不绑定固定语义,VNI只是其中一种可选字段,因此更适合需要携带额外元数据的云原生场景。
NVGRE由微软提出,把原始二层帧封装在GRE中,外层IP协议号为47。NVGRE使用24位VSID(Virtual Subnet ID)标识虚拟子网,报文结构为:外层以太头、外层IP头、GRE头、原始以太帧。由于GRE头本身不包含端口号,NVGRE在ECMP(等价多路径)场景下容易因外层IP相同而被哈希到同一条路径,导致负载不均。
IP-in-IP是最简单的封装之一,直接把原始IP包作为外层IP包的载荷,协议号4。它没有额外标识字段,因此无法在同一隧道内区分多个租户,通常只用于点对点或简单路由场景。GRE则更通用,既能封装IP也能封装其他协议,支持可选字段和校验和,但标准GRE缺少租户标识,需要配合其他机制使用。
适用场景与选型逻辑
VXLAN是目前数据中心和云网络的事实标准,适合大规模多租户二层扩展,硬件卸载成熟,主流交换机和智能网卡都支持。GENEVE更适合需要携带策略元数据的场景,例如Kubernetes CNI中传递Pod安全组、服务链标识,或者与SDN控制器配合实现动态策略下发。NVGRE在Windows Hyper-V和Azure早期环境中使用较多,但跨厂商支持不如VXLAN广泛。IP-in-IP结构最简单,适合点对点隧道或临时路由,但缺乏多租户能力。GRE通用性强,适合封装非IP协议或需要校验和的场景,但同样缺少租户隔离字段。
选型时先问三个问题:是否需要多租户隔离?是否需要携带额外元数据?底层网络是否支持ECMP?如果三个答案都是“是”,GENEVE或VXLAN更合适;如果只需要简单隧道,IP-in-IP或GRE足够。
性能开销与关键参数
封装开销直接体现在MTU上。以VXLAN为例,外层以太头14字节、外层IP头20字节、UDP头8字节、VXLAN头8字节,合计50字节。如果底层物理MTU为1500字节,则内层可用MTU为1450字节。GENEVE基础头8字节,加上TLV后可能超过50字节,需要根据实际选项计算。NVGRE和GRE的外层开销为:以太头14字节、IP头20字节、GRE头4字节(基础),合计38字节,内层MTU为1462字节。IP-in-IP开销为14+20=34字节,内层MTU为1466字节。
下面给出一个示例参数表,用于对比五种封装在典型配置下的开销与能力。表中数值为教学示例,实际部署需根据具体实现和选项调整。
| 封装技术 | 外层协议 | 基础开销(字节) | 内层MTU(底层1500) | 租户标识 | 元数据能力 | ECMP友好度 |
|---|---|---|---|---|---|---|
| VXLAN | UDP | 50 | 1450 | VNI 24位 | 无 | 高(有UDP端口) |
| GENEVE | UDP | 50+TLV | ≤1450 | VNI可选 | 强(TLV) | 高(有UDP端口) |
| NVGRE | GRE | 38 | 1462 | VSID 24位 | 无 | 低(无端口) |
| IP-in-IP | IP | 34 | 1466 | 无 | 无 | 低(无端口) |
| GRE | GRE | 38 | 1462 | 无(需扩展) | 弱(可选字段) | 低(无端口) |
实际配置示例:VXLAN隧道端点
以Linux环境为例,在两台主机之间建立VXLAN隧道,VNI为100,组播组为239.1.1.1,底层接口为eth0。以下命令在主机A和主机B上分别执行:
# 创建VXLAN接口,指定VNI、本地IP、组播组和底层设备
ip link add vxlan100 type vxlan \
id 100 \
dev eth0 \
group 239.1.1.1 \
dstport 4789
# 启用接口并分配IP
ip link set vxlan100 up
ip addr add 10.0.100.1/24 dev vxlan100
# 查看接口状态与MTU
ip -d link show vxlan100
执行后,ip -d link show vxlan100会显示vxlan接口的详细信息,包括VNI、本地IP、组播组和MTU。此时两台主机上的10.0.100.0/24网段即可互通。若需要验证封装是否生效,可在eth0上抓包,观察UDP端口4789的报文,并用tcpdump -i eth0 udp port 4789 -vv查看VXLAN头中的VNI字段。
remote参数指定对端IP,或使用控制器下发FDB表项。NVGRE和GRE在Linux中分别使用ip link add nvgre0 type nvgre和ip link add gre0 type gre创建,但NVGRE的VSID配置需要额外参数,且内核支持程度因版本而异。
性能开销的深层影响
封装不仅增加字节数,还影响CPU和网卡处理路径。VXLAN和GENEVE基于UDP,可以利用网卡的UDP校验和卸载、TSO和GRO,现代智能网卡甚至支持VXLAN/GENEVE的硬件封装与解封装,把开销降到接近线速。NVGRE和GRE由于协议号特殊,部分网卡卸载支持有限,更多依赖CPU处理。IP-in-IP最简单,但缺乏端口导致ECMP哈希不均衡,在大型叶脊网络中可能造成部分链路拥塞。
另一个关键点是控制平面。VXLAN通常配合EVPN作为控制平面,通过BGP传递MAC/IP可达性,避免依赖组播或手动配置。GENEVE则常与SDN控制器或Kubernetes CNI配合,由控制器下发隧道端点和策略。NVGRE在Azure中由网络控制器管理。IP-in-IP和GRE更多用于静态隧道或路由协议承载,控制平面相对简单。
综合来看,多云Overlay选型没有唯一答案。如果追求生态成熟和硬件卸载,VXLAN是稳妥选择;如果需要携带策略元数据并面向云原生,GENEVE更合适;如果只是简单隧道或临时互联,IP-in-IP和GRE可以快速落地;NVGRE则更适合已有微软技术栈的环境。理解每种封装的报文结构、开销和适用边界,才能在实际部署中做出合理取舍。