第178篇:VXLAN 报文封装与 UDP 端口
关键词
VXLAN、VNI、UDP 4789、MAC-in-UDP、VTEP、外层封装、MTU 适配
一、VXLAN 概述
1.1 什么是 VXLAN
VXLAN(Virtual Extensible LAN) 是一种 MAC-in-UDP 的隧道封装技术,由 VMware 和 Cisco 等提出(RFC 7348),用于在 IP 网络上构建二层 Overlay 网络。
1.2 为什么需要 VXLAN
传统 VLAN(802.1Q)只有 12 位标识符,最多 4094 个 VLAN,在数据中心多租户场景中远远不够:
VLAN ID:12 位 → 4,096 个
VXLAN VNI:24 位 → 16,777,216 个 → 1677 万个
VXLAN 解决了:
- VLAN 数量不足
- 数据中心网络规模限制(STP)
- 虚拟机迁移范围受限
二、VXLAN 封装结构
2.1 完整封装
原始客户以太网帧: | 客户 MAC 头 | 客户 IP 头 | 客户 Payload | FCS | | --- | --- | --- | --- |
VXLAN 封装后: | 外层 MAC头 | 外层 IP头 | 外层 UDP头 | VXLAN 头 | 原始客户以太网帧 (不包含客户 FCS) | 外层 FCS | | --- | --- | --- | --- | --- | --- | 14B 20B 8B 8B 1542B 4B (ETH) (IP) (UDP) (VXLAN)
2.2 各层详细说明
外层 MAC 头(14 字节):
目的 MAC:下一跳路由器(Spine)的 MAC
源 MAC:本地 VTEP 的 MAC
EtherType:0x0800(IPv4)
外层 IP 头(20 字节):
目的 IP:远端 VTEP 的 IP 地址
源 IP:本地 VTEP 的 IP 地址
Protocol:17(UDP)
外层 UDP 头(8 字节):
源端口:基于内层流的 Hash(用于 ECMP 负载均衡)
目的端口:4789(IANA 分配)或 8472(Linux 传统端口)
UDP Length:VXLAN 包总长
UDP Checksum:通常为 0(Linux)/ 可计算
VXLAN 头(8 字节):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|R|R|R|I|R|R|R| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| VXLAN Network Identifier (VNI) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
I bit = 1(VNI 有效)
VNI = 24 位网络标识符
Reserved = 保留位
三、UDP 端口与负载均衡
3.1 源端口 Hash
VXLAN 使用的源端口号基于内层数据流的 Hash:
源端口 = Hash(内层 MAC + IP + L4 Port) % 范围 + 49152
用途:使得不同的内层流有不同的外层 UDP 源端口
→ Spine 节点可以根据外层 UDP 源端口进行 ECMP 负载均衡
多条流通过 VXLAN 隧道:
流 1(TCP 10.1.1.1:1234 → 10.2.2.2:80)
→ 外层 UDP 源端口 = 49152
流 2(TCP 10.1.1.1:5678 → 10.2.2.2:443)
→ 外层 UDP 源端口 = 51234
流 3(TCP 10.1.1.2:1234 → 10.2.2.2:80)
→ 外层 UDP 源端口 = 53210
Spine 根据外层 UDP 源端口将三条流分配到不同 ECMP 路径
3.2 端口分配
| UDP 目的端口 | 使用方 | 说明 |
|---|---|---|
| 4789 | IANA 分配(RFC 7348) | 标准端口 |
| 8472 | Linux 内核 VXLAN | 早期 Linux 使用(VTEP 厂商兼容) |
注意:两个端口不兼容。部署时需确认所有 VTEP 使用相同的 UDP 端口号。
四、MTU 适配
4.1 VXLAN 额外开销
VXLAN 封装带来的开销:
| 封装层 | 字节数 |
|---|---|
| 外层 MAC 头 | 14 |
| 外层 IP 头 | 20 |
| 外层 UDP 头 | 8 |
| VXLAN 头 | 8 |
| 总计 | 50 |
客户 MTU = 1500 字节
VXLAN 封装后 = 1500 + 50 = 1550 字节
↓
Underlay 接口 MTU 必须 ≥ 1550!
4.2 解决方案
方案一:增大 Underlay MTU(推荐)
# 在所有 Underlay 接口上设置 MTU
# 华为设备
interface GigabitEthernet0/0/0
mtu 1600 # 确保 L3 MTU 足够大
#
# Cisco NX-OS
interface ethernet 1/1
mtu 9216 # 数据中心常用 jumbo frame
方案二:MSS Clamping(仅治标,适用于 TCP 流量)
# 在 VTEP 的三层接口配置
interface Vlanif100
tcp adjust-mss 1436 # 1500 - 20(IP) - 20(TCP) - 14(预留)
推荐做法:不是调整 MSS,而是直接使用 Jumbo Frame(MTU 9000)。
| 客户帧大小 | VXLAN 后大小 | 推荐 Underlay MTU |
|---|---|---|
| 1500 | 1550 | ≥ 1600 |
| 9000(Jumbo) | 9050 | ≥ 9100 |
五、VXLAN 与 VLAN 的对比
| 对比维度 | VLAN | VXLAN |
|---|---|---|
| 标识符大小 | 12 位 | 24 位 |
| 数量 | 4,096 | 1,677 万 |
| 封装 | 插入 4 字节 802.1Q 头 | MAC-in-UDP(50 字节开销) |
| 网络范围 | 二层广播域(STP 限制) | 跨 IP 网络(无限) |
| 底层要求 | 二层可达 | 三层 IP 可达 |
| MAC 表 | 所有 VTEP 都需要 MAC 表 | 仅本地 VTEP |
| 多租户 | VLAN 数量受限 | VNI 充足 |
六、VXLAN 的转发类型
6.1 已知单播
VTEP1 有 VTEP2 的 MAC 映射:
内层:CE1 MAC → CE2 MAC(客户帧)
外层:VTEP1 IP → VTEP2 IP
VXLAN: VNI = 100
UDP: 源端口(Hash) → 4789
6.2 BUM(广播/未知单播/组播)
BUM 的转发方式决定 VTEP 发现和泛洪策略:
| BUM 方式 | 说明 | 适用场景 |
|---|---|---|
| 组播 | Underlay 组播群组承载 BUM | 传统方案(需组播支持) |
| Ingress Replication | VTEP 逐个复制到所有远端 VTEP | 当前主流(无需组播) |
| P2MP 隧道 | 核心层复制 | 大规模场景 |
七、VXLAN 配置示例(华为)
7.1 基本配置
# VTEP1 配置
bridge-domain 10
vxlan vni 100 # VNI = 100
#
interface Nve1 # NVE = Network Virtual Endpoint
source 1.1.1.1 # VTEP 源 IP(Loopback)
vni 100 head-end peer-list protocol bgp # 通过 BGP EVPN 学习对端
#
interface GigabitEthernet0/0/0.100
vlan-type dot1q 100
bridge-domain 10
7.2 验证
# 查看 VXLAN 隧道
<VTEP1> display vxlan tunnel
Tunnel ID Source Destination VNI State
0x1000001 1.1.1.1 2.2.2.2 100 Up
# 查看 VNI 信息
<VTEP1> display vxlan vni 100
VNI : 100
Bridge-domain : 10
State : Up
Tunnels : 1
Source : 1.1.1.1
八、总结
| 知识点 | 核心要点 |
|---|---|
| VXLAN 封装 | MAC-in-UDP,外层 IP/UDP + VXLAN 头 |
| VNI | 24 位标识,1677 万个虚拟网络 |
| UDP 目的端口 | 4789(标准)或 8472(Linux) |
| UDP 源端口 | 基于内层流的 Hash,用于 ECMP |
| MTU 开销 | 50 字节,需调大 Underlay MTU |
| BUM 方式 | Ingress Replication 为主,组播/ P2MP 为辅 |
九、思考
- VXLAN 封装包括哪些层次?从内到外依次是什么?
- VNI 和 VLAN ID 的位数分别是多少?VXLAN 为什么能支持更多租户?
- VXLAN 的 UDP 源端口为什么要基于内层流进行 Hash?
- VXLAN 带来的 MTU 开销是多少?如何解决 MTU 问题?
- Ingress Replication 转发 BUM 流量的原理是什么?
下篇预告:第179篇《VXLAN 隧道与 VTEP 发现》——VTEP 之间如何发现对方?VXLAN 隧道的建立维护和 Head-end 复制。