4. VXLAN协议深入解析

VXLAN(Virtual eXtensible LAN)是数据中心 Overlay 网络最主流的封装协议,它把二层以太网帧封装进 UDP 报文,在 IP 网络上构建出可跨三层转发的大二层网络。理解 VXLAN 的关键,不在于记住“它是什么”,而在于看清一个原始以太帧从进入 VTEP 到离开对端 VTEP 的完整封装变化,以及广播、未知单播、组播(BUM)流量如何被控制。本节围绕报文格式、VNI、VTEP、BUM 处理、ARP 抑制与泛洪机制逐层展开。

一、VXLAN 报文格式:从内层帧到外层 UDP

VXLAN 的封装结构可以理解为“原始帧被套上一层新的传输外壳”。内层是租户真实的以太网帧(含内层 MAC 头、可选 VLAN Tag、内层 IP 与载荷),外层依次是 VXLAN 头、UDP 头、外层 IP 头和外层以太网头。VXLAN 头固定 8 字节,字段如下:

字段长度含义
Flags8 bit最高位 I 位为 1 表示 VNI 有效,其余保留
Reserved24 bit保留字段,发送置 0,接收忽略
VNI24 bitVXLAN 网络标识,标识租户/二层域
Reserved8 bit保留字段

外层 UDP 目的端口默认使用 4789(早期部分实现使用 8472),源端口由内层帧的哈希计算得出,用于 ECMP 负载分担。外层 IP 头承载 VTEP 的源、目的地址,外层以太头则使用物理链路下一跳的 MAC。整个封装使内层帧对底层 IP 网络完全透明,底层只需按普通 IP 报文转发。

关键点:VNI 是 24 位,理论支持约 1600 万个二层网段,远超传统 VLAN 的 4094 个,这是 VXLAN 能支撑多租户大规模数据中心的核心原因。

二、VNI 与 VTEP:Overlay 的标识与端点

VNI(VXLAN Network Identifier)用于区分不同的租户或二层广播域。同一 VNI 内的主机处于同一逻辑二层网络,不同 VNI 之间默认二层隔离。VNI 与 VLAN 可以一对一映射,也可以多对一映射,映射关系由 VTEP 上的配置决定。

VTEP(VXLAN Tunnel End Point)是 VXLAN 隧道的端点,负责封装与解封装。每个 VTEP 拥有一个用于隧道通信的 IP 地址(通常为 Loopback 地址),称为源 VTEP 地址。VTEP 可以是硬件交换机、软件虚拟交换机(如 OVS),也可以是支持 VXLAN 的物理网卡。VTEP 上维护两类关键表项:

  • 本地 MAC 表:记录本地接入主机的 MAC 与对应接口/VNI。
  • 远端 VTEP 表(隧道表):记录“目的 MAC → 远端 VTEP IP”的映射,用于封装时填写外层目的 IP。

当 VTEP 收到一个内层帧,会先查本地 MAC 表;若命中且为本地接口,直接二层转发;若命中远端 VTEP,则按映射封装后发出;若未命中,则进入 BUM 处理流程。

三、BUM 流量处理:广播、未知单播、组播

BUM 是 Broadcast、Unknown unicast、Multicast 的统称。在传统二层网络中,这类流量会被泛洪到所有端口;在 VXLAN 中,泛洪范围被限制在同一 VNI 内,并通过以下两种方式之一实现:

  1. 组播模式:每个 VNI 映射一个组播组地址,VTEP 将 BUM 帧封装后发往该组播组,加入该组播组的 VTEP 都会收到。该模式依赖底层网络支持组播,配置简单但扩展性受限。
  2. 头端复制(Ingress Replication):源 VTEP 根据控制平面(如 EVPN)学习到的远端 VTEP 列表,将 BUM 帧逐一复制并单播发送给每个远端 VTEP。该模式不依赖组播,是现代数据中心的主流选择。

无论哪种模式,BUM 帧的封装格式与普通单播帧一致,区别仅在外层目的地址:组播模式填组播组 IP,头端复制模式填各远端 VTEP 的单播 IP。

四、ARP 抑制与泛洪机制

ARP 请求是典型的广播流量。若每个 ARP 请求都在 VXLAN 内泛洪,会带来大量 BUM 复制。ARP 抑制的核心思路是:VTEP 或控制平面提前学习并缓存“IP → MAC”映射,当收到 ARP 请求时,若本地已有对应表项,则直接代答,不再泛洪。

实现 ARP 抑制通常依赖控制平面(如 EVPN 的 Type 2 路由)将主机的 IP、MAC、VNI、VTEP 信息同步到所有相关 VTEP。这样,VTEP 在收到 ARP 请求时可直接以目的主机 MAC 回应,源主机无需等待泛洪响应。对于确实无法代答的 ARP,仍按 BUM 流程处理。

ARP 抑制显著降低广播泛洪,但要求控制平面表项及时、准确。若表项老化或缺失,仍会退化为泛洪,因此需要合理设置老化时间与同步机制。

五、封装与转发过程示例

假设主机 A(VNI 100,IP 10.0.0.1,MAC A)与主机 B(VNI 100,IP 10.0.0.2,MAC B)位于不同 VTEP 下。VTEP1 已通过控制平面学到 B 的映射:MAC B → VTEP2 IP。主机 A 发送目的 MAC 为 B 的帧:

内层帧: [Eth: A→B][IP: 10.0.0.1→10.0.0.2][Payload]
VTEP1 封装:
  外层 Eth: VTEP1_MAC → 下一跳MAC
  外层 IP : VTEP1_IP → VTEP2_IP
  UDP     : 源端口=哈希值, 目的端口=4789
  VXLAN   : Flags=0x08, VNI=100
VTEP2 解封装:
  校验 VNI=100 → 查本地 MAC 表 → 命中 B → 转发给主机 B

若 VTEP1 未学到 B 的映射,则该帧作为未知单播进入 BUM 流程:组播模式下发往 VNI 100 对应组播组;头端复制模式下复制并单播给 VNI 100 内所有已知远端 VTEP。VTEP2 收到后解封装、学习 A 的映射,并将帧转发给 B;B 的回应随后可单播回送,完成地址学习闭环。

VXLAN 封装结构与 BUM/ARP 抑制处理路径 主机 A VNI 100 · 10.0.0.1 VTEP1 本地MAC表 / 远端VTEP表 ARP抑制缓存 VXLAN 封装 外层Eth | 外层IP | UDP:4789 VXLAN头: Flags+VNI=100 内层: A→B 原始帧 VTEP2 解封装 · 查VNI 学习A的映射 主机 B VNI 100 · 10.0.0.2 BUM 流量处理(广播 / 未知单播 / 组播) 组播模式 VNI→组播组,封装后发组播 头端复制 按远端VTEP列表逐一单播 ARP 抑制机制 控制平面(EVPN Type 2)同步 IP→MAC→VTEP 映射 VTEP 收到 ARP 请求 → 本地有表项则代答,不泛洪 无表项 → 退化为 BUM 泛洪 图例 内层帧 封装隧道

六、实践中的观察与判断

在实际环境中验证 VXLAN 行为,可以从以下几个观察点入手:

  • 抓包看封装:在 VTEP 之间的物理链路上抓包,应能看到 UDP 目的端口 4789 的报文,展开后可见 VXLAN 头与内层原始帧。若看不到,说明封装未发生或路径未承载。
  • 查 VNI 映射:在 VTEP 上查看 VNI 与 VLAN、接口的映射关系,确认主机所在 VNI 正确。
  • 看 MAC 表与隧道表:确认远端主机 MAC 是否已学习到,且对应远端 VTEP IP 正确。若缺失,单播会退化为 BUM。
  • 验证 ARP 抑制:在主机上发起 ARP 请求,观察 VTEP 是否直接代答,以及是否产生泛洪。若泛洪频繁,需检查控制平面同步是否正常。
注意:VXLAN 本身不提供控制平面,VNI 与远端 VTEP 的映射需要依赖 EVPN、Flood-and-Learn 或 SDN 控制器。缺少控制平面时,只能依赖数据平面泛洪学习,规模受限且收敛慢。

总结来看,VXLAN 通过 8 字节头与 24 位 VNI 实现了大规模二层隔离,VTEP 承担封装解封装与表项维护,BUM 流量通过组播或头端复制受控泛洪,ARP 抑制则进一步压缩广播。理解这四者的配合关系,是掌握数据中心 Overlay 网络转发行为的基础。