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缺少租户标识,需要配合其他机制使用。

五种Overlay封装报文结构对比 VXLAN 外层以太头 外层IP头 UDP头 VXLAN头 原始以太帧 VNI 24位,UDP端口4789 GENEVE 外层以太头 外层IP头 UDP头 GENEVE头 TLV选项 原始以太帧 头部可变长,支持元数据 NVGRE 外层以太头 外层IP头 GRE头 原始以太帧 VSID 24位,协议号47 IP-in-IP 外层以太头 外层IP头 原始IP包 协议号4,无租户标识 GRE 外层以太头 外层IP头 GRE头 原始IP/以太帧 协议号47,可选字段

适用场景与选型逻辑

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 无(需扩展) 弱(可选字段) 低(无端口)
MTU规划提示:如果底层网络MTU为1500,VXLAN隧道内层MTU应设置为1450,并确保TCP MSS被相应调整(通常MSS=MTU-40=1410)。若底层支持Jumbo Frame(如9000),则内层MTU可设为8950,减少分片。

实际配置示例: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则更适合已有微软技术栈的环境。理解每种封装的报文结构、开销和适用边界,才能在实际部署中做出合理取舍。