系列文章入口如下:

网工进阶必看:《从TCP/IP到AI智算网络》系列总目录(持续更新)-CSDN博客

一、为什么需要 VXLAN?——从 VLAN 的 4094 到 VXLAN 的 1600 万

前11篇我们覆盖了从 Ethernet 到 BGP 的完整协议栈。在 AI 智算网络和数据中心中,传统二层技术遇到了根本性瓶颈:

维度

VLAN (802.1Q)

VXLAN

隔离数量

4094 个(12位 VLAN ID)

1600 万个(24位 VNI)

网络边界

受限于二层广播域(通常一个机架)

跨越三层 IP 网络(跨机房/跨城市)​

虚拟机/GPU容器迁移

需保持同一二层子网

任意物理位置,IP 不变,网络不断​

报文封装

在以太帧头插入 4 字节 Tag

MAC-in-UDP 隧道封装(整个帧打包)​

对中间设备要求

所有交换机需识别 802.1Q

中间路由器只需 IP 转发,完全无感知​

广播处理

同一 VLAN 内泛洪

可通过 EVPN 控制平面抑制广播​

典型场景

传统企业网

云数据中心、AI 训练集群、多租户隔离


二、VXLAN 到底是什么?——从"快递包裹"说起(原理通俗版)

1. 先搞懂一个问题:为什么二层网络走不远?

要理解 VXLAN,先得理解传统二层网络的致命缺陷。

电脑之间通信靠 MAC 地址(二层)或 IP 地址(三层):

  • 二层(MAC):只能在"同一个广播域"内通信,就像同一个办公室里喊一嗓子,大家都能听见。二层靠"泛洪+学习"来发现邻居——不知道 MAC 地址就广播问所有人。设备越多,广播流量越大,网络就堵死了。所以二层网络通常只能局限在一个机架甚至一个交换机下面。
  • 三层(IP):可以跨网络路由,就像寄快递,经过多个中转站最终送到。IP 网络没有广播域限制,可以无限扩展(互联网就是证明)。

传统 VLAN(802.1Q)能解决网络隔离问题,但它只有 12 位 VLAN ID,最多 4094 个隔离网络——云数据中心动辄需要数万个虚拟网络,VLAN 根本不够用。

2. VXLAN 的核心思想:给二层帧"穿上 IP 的外套"

VXLAN 的发明者想了一个绝妙的办法:

既然三层 IP 网络可以走很远,那我把二层以太网帧"打包"进 UDP/IP 报文里,让它搭 IP 网络的"顺风车",不就能跨越千山万水了吗?

打个比方:

概念

类比

内层以太网帧

你要寄的一封信(写着收件人/发件人的真实地址)

VXLAN 封装

把信装进快递盒子,盒子上写的是快递站的地址(不是信上的地址)

外层 UDP/IP

快递盒外面的物流标签(源快递站 → 目的快递站)

VTEP

快递站(负责收信装箱 / 拆箱送信)

Underlay 网络

物流运输网络(高速公路、中转站)

Overlay 网络

逻辑上"直接连通"的虚拟网络(看起来像在同一间办公室)

关键点:中间的路由器只认外层 IP(快递站地址),完全不知道盒子里装的是什么(内层 MAC 帧)。就像快递员不需要拆开包裹就知道往哪送。

3. VXLAN 报文长什么样?逐层拆解

┌────────────────────────────────────────

│ 外层以太网头(14字节)                                       │

│   DMAC: 下一跳路由器的 MAC                                    │

│   SMAC: 本机物理网卡的 MAC                                    │

│   Type: 0x0800 (IPv4)                                       │

├────────────────────────────────────────

│ 外层 IP 头(20字节)                                         │

│   SIP: 本端 VTEP 的 IP(如 192.168.164.128)                  │

│   DIP: 对端 VTEP 的 IP(如 192.168.164.129)                  │

│   TTL: 64                                                   │

│   Protocol: 17 (UDP)                                        │

├────────────────────────────────────────

│ 外层 UDP 头(8字节)                                          │

│   Src Port: 随机端口(由内层帧哈希生成,用于 ECMP 负载均衡)     │

│   Dst Port: 4789 (VXLAN 标准端口)                             │

├────────────────────────────────────────

│ VXLAN 头(8字节)                                            │

│   Flags: 0x08 (I 位 = 1,表示 VNI 有效)                      │

│   Reserved: 24 位全 0                                        │

│   VNI: 虚拟网络标识(24位,范围 1~16777215)                   │

│   Reserved: 8 位全 0                                         │

├────────────────────────────────────────

│ 内层以太网帧(原始二层帧,完整保留)                            │

│   DMAC: 目的虚拟机的 MAC                                      │

│   SMAC: 源虚拟机的 MAC                                        │

│   EtherType: 0x0800 (IPv4) / 0x0806 (ARP) / ...              │

│   Payload: 原始数据(如 ICMP、TCP 等)                         │

│   FCS: 帧校验序列                                             │

└────────────────────────────────────────

总封装开销 = 50 字节(外层以太14 + IP 20 + UDP 8 + VXLAN 8 = 50,不含内层以太头)。生产环境需调大 MTU 避免分片。

4. VXLAN 是怎么工作的?——完整通信流程

假设两台虚拟机 VM-A(10.0.0.1)和 VM-B(10.0.0.2)分别接在不同物理服务器上,但属于同一个 VXLAN 虚拟网络(VNI=100):

步骤 1:VM-A 发出原始帧

VM-A 要 ping VM-B(10.0.0.2),先 ARP 解析 MAC。发出的原始以太网帧:DMAC = VM-B 的 MAC,SMAC = VM-A 的 MAC,Payload = ICMP Echo Request。

步骤 2:VTEP-A 拦截并封装

VTEP-A 收到这个帧后:

  1. 查本地 FDB(转发数据库),知道 VM-B 的 MAC 对应远程 VTEP-B(192.168.164.129)
  2. 给原始帧"套娃":加上 VXLAN 头(VNI=100)→ UDP 头(Dst Port 4789)→ IP 头(SIP=128, DIP=129)→ 以太网头

步骤 3:穿越 Underlay

这个 UDP/IP 包在物理网络中像普通数据包一样被路由转发。中间路由器完全不关心 VNI 是什么,只管把 IP 包送到 192.168.164.129。

步骤 4:VTEP-B 解封装

VTEP-B 收到后:识别 Dst Port = 4789 → 解封装提取内层以太网帧 → 根据 VNI=100 确定目标虚拟网络 → 将原始帧转发给 VM-B。

步骤 5:VM-B 收到原始帧

VM-B 完全不知道中间经历了 VXLAN 封装/解封装,以为自己和 VM-A 就在同一个二层交换机下面。

5. VTEP 是怎么"知道"对端在哪的?——三种 MAC 学习方式

方式

原理

适用场景

泛洪+学习(数据平面)​

未知目的 MAC 时泛洪到所有 VTEP,收到回复后记录 MAC→VTEP 映射

小规模实验(本文采用)

多播(组播)​

利用 Underlay 的 IGMP/PIM 多播将 BUM 流量发给组内所有 VTEP

中规模部署

EVPN 控制平面(BGP)​

用 BGP 协议分发 MAC/IP 可达性信息,完全替代泛洪​

大规模数据中心/智算集群

泛洪+学习的具体过程:

  1. VTEP-A 收到 VM-A 发出的 ARP 请求(广播帧)
  2. VTEP-A 将其封装为 VXLAN 组播包,发给所有已知 VTEP
  3. VTEP-B 收到后解封装,转发给本地 VM-B
  4. VM-B 回复 ARP 响应(单播),VTEP-B 封装后发给 VTEP-A
  5. VTEP-A 从响应中提取 VM-B 的 MAC → VTEP-B 映射,写入本地 FDB
  6. 后续 VM-A 再发数据给 VM-B,VTEP-A 直接查表单播封装,不再泛洪

6. 什么是 Underlay 和 Overlay?

  • Underlay(底层网络):物理交换机、路由器组成的真实 IP 网络,负责把数据包从 A 送到 B。你跑 OSPF、BGP 就是在 Underlay 上。
  • Overlay(叠加网络):逻辑上构建在 Underlay 之上的虚拟网络,有自己的二层拓扑。VXLAN 就是 Overlay 的一种实现。

类比:Underlay 是"地面公路网",Overlay 是"公路上跑的集装箱卡车"——卡车里装的是什么(虚拟网络),公路完全不关心。

7. VXLAN 核心术语速查

术语

说明

VTEP(VXLAN Tunnel Endpoint)​

隧道端点,负责封装/解封装,通常是服务器或交换机

VNI(VXLAN Network Identifier)​

24 位虚拟网络标识(类似 VLAN ID,但空间大 4000 倍)

Underlay​

底层物理网络(IP 可达,跑 OSPF/BGP)

Overlay​

叠加在 Underlay 上的虚拟二层网络(VXLAN 隧道内)

BUM 流量​

Broadcast(广播)、Unknown unicast(未知单播)、Multicast(多播),传统需泛洪


三、实验环境搭建(Linux 原生 VXLAN + VMware)

拓扑

配置步骤

节点 A(.128):

# 创建 VXLAN 接口(点对点模式,适合实验)

sudo ip link add vxlan0 type vxlan \

  id 100 \

  dstport 4789 \

  local 192.168.164.128 \

  remote 192.168.164.129 \

  dev ens33

# 配置 Overlay IP

sudo ip addr add 10.0.0.1/24 dev vxlan0

sudo ip link set up dev vxlan0

# 验证

ip link show vxlan0

ip addr show vxlan0

节点 B(.129):

sudo ip link add vxlan0 type vxlan \

  id 100 \

  dstport 4789 \

  local 192.168.164.129 \

  remote 192.168.164.128 \

  dev ens33

sudo ip addr add 10.0.0.2/24 dev vxlan0

sudo ip link set up dev vxlan0

验证连通性

# 从 .128 ping overlay IP

ping 10.0.0.2

# 查看 FDB(转发数据库,含 MAC→VTEP 映射)

bridge fdb show dev vxlan0

1. 全零 MAC 条目(默认泛洪路由)

00:00:00:00:00:00 dst 192.168.164.129 via ens33 self permanent

  • 00:00:00:00:00:00:全零 MAC 地址,代表未知单播、广播、组播(BUM)流量的默认转发目标。
  • dst 192.168.164.129:在对端 IP 为 192.168.164.129 的 VTEP 上终结(本文实验采用静态单播点对点模式)。
  • via ens33:底层(Underlay)物理出口网卡为 ens33,封装后的 UDP 包从此发出。
  • self:表示该条目属于本设备(vxlan0 接口自身维护)。
  • permanent:永久静态条目,由人工配置(如 remote 参数)生成,不会老化消失。这是 VXLAN 泛洪流量的“兜底”路径。

2. 具体 MAC 条目(动态学习结果)

e6:6f:7f:06:6a:b3 dst 192.168.164.129 self

  • e6:6f:7f:06:6a:b3:对端(或跨 VXLAN 通信的远端主机)的具体 MAC 地址,通常是 Overlay 网络内的对端设备 MAC。
  • dst 192.168.164.129:该 MAC 对应的 VTEP 对端 IP。
  • self:同样属于本接口。
  • (无 permanent):此条目通常为动态学习(泛洪后收到对端回复,自动记录映射),会随流量老化(若开启老化机制);若实验手动添加也会显示 permanent,此处未标注则多为动态。


四、Wireshark 抓包解析

0. 抓包实操,开两个终端进行抓包,不要直接打开wireshark抓包,不然抓不到vxlan完整报文 

# 在 128 上执行(物理网卡 ens33)

sudo tcpdump -i ens33 udp port 4789 -w vxlan_outer.pcap

# 另开窗口触发流量

ping 10.0.0.2

抓包结果默认存在home文件夹

打开一个报文,可以先看到有VXLAN标识:

报文展开具体内容如下:

1. 外层以太网头(Underlay 物理网络)

  • 源 MAC:00:50:56:37:cb:08(VMware 虚拟网卡,即 128 的 ens33)
  • 目的 MAC:00:0c:29:48:5d:fa(对端 129 的 ens33)
  • 含义:这是物理(或虚拟网桥)链路上的真实二层帧头,中间 Underlay 设备只关注这一层。

2. 外层 IP + UDP 头(VXLAN 封装载体)

  • 外层 IP:源 192.168.164.128,目的 192.168.164.129(即两个 VTEP 的 Underlay IP)。
  • TTL:64,协议号 17(UDP)。
  • UDP 头:
    • 目的端口:4789(IANA 标准 VXLAN 端口,Wireshark 据此自动解析)。
    • 源端口:37535(由内层报文哈希生成,用于 Underlay 的 ECMP 负载均衡)。
    • 长度:114 字节(包含 8 字节 UDP 头 + 8 字节 VXLAN 头 + 98 字节内层帧)。

3. VXLAN 头(隧道标识)

  • Flags:0x0800,其中 I 位(VNI 有效位)置 1。
  • VNI:100(对应你配置的 id 100,实现多租户隔离)。
  • 含义:标志着内层二层帧属于哪个虚拟网络,对端 VTEP 据此决定解封装后交给哪个本地桥接端口。

4. 内层以太网头(Overlay 虚拟网络)

  • 源 MAC:8a:9d:e0:15:83:da(128 的 vxlan0 虚拟 MAC,与前轮抓包一致)。
  • 目的 MAC:e6:6f:7f:06:6a:b3(129 的 vxlan0 虚拟 MAC,正是前文 FDB 表中学习到的条目)。
  • 类型:IPv4(0x0800)。
  • 含义:这是被“装进箱子”的原始二层帧,Underlay 设备完全不可见此 MAC。

5. 内层 IP + ICMP(真实业务流量)

  • 内层 IP:源 10.0.0.1,目的 10.0.0.2(Overlay 网络的真实通信 IP)。
  • 内层 IP 总长:84 字节(20 字节头 + 64 字节 ICMP)。
  • ICMP:Type 8(Echo Request / Ping),标识符 28,序列号 1,数据 48 字节。
  • 关联验证:Wireshark 标记 [Response frame: 2],证明往返互通;此 98 字节(14 以太头 + 84 IP/ICMP)正是前轮在 vxlan0 上抓到的“纯净报文”。

6. 抓包排障要点

现象

可能原因

排查方向

抓不到任何 4789 包

Overlay 无流量 / 抓包接口选错

确认 ping 10.0.0.2 正在执行;换 -i any 试

有 4789 包但内层不是 ICMP

其他 Overlay 流量干扰

过滤 vxlan && icmp 精准定位

VXLAN 头 Flags 不是 0x08

抓到异常报文或非标准实现

检查对端 VTEP 配置

内层 IP 不对

本地 overlay 接口 IP 配错

ip addr show vxlan0 确认


五、VXLAN 与智算网络的关联(系列主线)

1. 为什么 AI 训练集群需要 VXLAN?

场景

传统网络

VXLAN 方案

GPU 服务器跨机架通信

二层受限,需绕行

VXLAN 隧道直连,逻辑二层打通

租户隔离

VLAN 4094 上限

1600 万 VNI,每个训练任务独立网络

RDMA 跨三层

需复杂路由配置

VXLAN overlay 透明承载 RoCEv2

容器化部署

网络插件复杂

K8s CNI(Calico/Cilium)底层用 VXLAN

虚拟机/GPU容器热迁移

IP 必须不变

Overlay 网络屏蔽物理位置,迁移无感知

2. VXLAN + RDMA = 智算网络终极方案

 RDMA 系列(RoCEv2)需要三层 IP 可达。在大规模 AI 集群中:

  • Underlay:用 BGP(第11篇)提供 IP 可达性。
  • Overlay:用 VXLAN 创建虚拟二层网络,让 RDMA 流量在隧道内传输,避免广播风暴。
  • 控制平面:后续将引入 EVPN 替代泛洪学习,或结合 SRv6 实现更灵活的流量工程。

3. 性能考量

VXLAN 封装引入 50 字节额外开销。在 1500 MTU 网络中,内层有效载荷减少,可能导致分片。生产环境建议:

  • 增大 Underlay MTU 到 1600+(推荐 9000,即 Jumbo Frame)。
  • 启用 TSO/GSO 卸载(CPU 减负)。
  • 使用硬件 VTEP(智能网卡/DPU 卸载 VXLAN 封装)。


六、FRR / Linux 实测踩坑记录

坑 1:VXLAN 接口创建失败

bash

# 报错:RTNETLINK answers: Operation not supported# 原因:内核未加载 VXLAN 模块# 解决:sudo modprobe vxlan# 验证:lsmod | grep vxlan

坑 2:ping 不通 overlay IP

bash

# 排查步骤:# 1. 确认 Underlay 连通性

ping 192.168.164.129

# 2. 确认 VXLAN 接口状态

ip link show vxlan0  # 需为 UP

# 3. 确认 FDB 条目

bridge fdb show dev vxlan0  # 应有对端 MAC→VTEP 映射

# 4. 抓包确认封装sudo tcpdump -i ens33 udp port 4789 -n

坑 3:MTU 问题导致大包丢弃

bash

# 现象:小包 ping 通,大包(>1400)不通# 原因:VXLAN 封装后超过 1500 字节,中间设备丢包# 解决:增大 overlay 接口 MTUsudo ip link set vxlan0 mtu 1450# 或增大物理接口 MTU(需交换机配合,推荐 9000)

坑 4:多播 vs 单播模式

bash

# 本文用 static remote(单播点对点),适合小规模实验# 生产环境用多播(需 Underlay 支持 IGMP/PIM):sudo ip link add vxlan0 type vxlan \

  id 100 \

  dstport 4789 \

  local 192.168.164.128 \

  group 239.1.1.1 \

  dev ens33

坑 5:重启后配置丢失

bash

# ip link add 是临时配置,重启消失# 解决:写入 netplan 或 /etc/rc.local# netplan 示例(/etc/netplan/01-vxlan.yaml):

network:

  version: 2

  tunnels:

    vxlan0:

      mode: vxlan

      local: 192.168.164.128

      remote: 192.168.164.129

      id: 100

      port: 4789

      link: ens33


七、本文要点速览

要点

说明

VXLAN = MAC-in-UDP 隧道

二层帧封装在 UDP/IP 中,穿越三层网络

VNI 24 位

1600 万虚拟网络,远超 VLAN 的 4094

标准端口 4789

外层 UDP 目的端口,Wireshark 据此解析

VTEP 是封装端点

服务器或交换机承担,负责"装箱/拆箱"

三种 MAC 学习方式

泛洪+学习 → 多播 → EVPN(最优)

Underlay + Overlay

Underlay 跑 BGP(IP 可达),Overlay 跑 VXLAN

智算网络价值

RDMA 跨三层、多租户隔离、GPU 跨机架通信

MTU 需调优

封装开销 50 字节,建议 Jumbo Frame

附录:命令速查卡

bash

# 创建 VXLAN 接口(点对点)

ip link add vxlan0 type vxlan id <VNI> dstport 4789 \

  local <本地IP> remote <对端IP> dev <物理接口>

ip addr add <overlay_IP>/24 dev vxlan0

ip link set up dev vxlan0

# 查看状态

ip link show vxlan0

bridge fdb show dev vxlan0

ip -d link show vxlan0    # 详细参数

# 抓包

tcpdump -i <物理接口> udp port 4789 -w vxlan.pcap

# 清除

ip link del vxlan0

# 内核模块检查

lsmod | grep vxlan

modprobe vxlan


系列进度:第12篇 VXLAN 完成。下一篇将进入 SRv6(Segment Routing IPv6),基于 IPv6 数据平面的段路由技术,实现智算网络的灵活流量工程与业务链编排。敬请期待!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐