1. 引言
VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网)是当前数据中心、云计算和容器网络中最主流的 Overlay 网络技术之一。它解决了传统 VLAN 在大规模多租户场景下的诸多限制,让二层网络可以跨越三层 IP 网络进行扩展。
本文面向初学者,按照「背景 → 机制 → 报文 → 字段含义 → 结合 IP 的主机转发流程」这条主线,把 VXLAN 的核心知识系统地串起来。
2. 背景:为什么需要 VXLAN
在了解 VXLAN 之前,先看传统 VLAN 遇到的两个核心问题。
2.1 VLAN 的 4096 上限
传统二层网络通过 VLAN 实现隔离,VLAN ID 在以太网 802.1Q 标签中只有 12 bit ,因此最多只能划分 4094 个 VLAN。在单机时代这个数量足够,但在大型云平台中:
- 一个云平台可能同时服务成千上万个租户;
- 每个租户往往需要多个独立的二层网段;
- 4094 个 VLAN 很快就被耗尽。
因此,需要一种能提供更多隔离标识的机制。
2.2 二层网络难以跨越三层边界
VLAN 本质上是二层技术,广播域被限制在同一个二层网络中。当虚拟机被调度到不同机架、不同机房,或者需要跨越三层 IP 网络时:
- 传统的 STP(生成树协议)会阻塞冗余链路,导致链路利用率低;
- 二层网络规模过大时,广播风暴、MAC 表膨胀等问题会急剧恶化;
- 数据中心希望所有主机都处在同一个「大二层」网络中,但底层物理网络却是三层的 IP 网络。
VXLAN 正是为了解决「大二层 + 多租户 + 跨三层」的矛盾而诞生。
3. VXLAN 核心机制
3.1 Overlay 与 Underlay
VXLAN 采用 Overlay(叠加网络) 思想:
- Underlay 网络:底层的物理 IP 网络,负责提供三层可达性,不关心上层业务;
- Overlay 网络:在 Underlay 之上构建的虚拟二层网络,承载租户的原始以太网帧。
可以把 Underlay 理解为「高速公路」,VXLAN 隧道理解为「在高速公路上跑的封闭摆渡车」------车里的内容(租户二层帧)对高速公路本身是透明的。
3.2 VTEP 端点
VTEP(VXLAN Tunnel End Point,VXLAN 隧道端点) 是 VXLAN 中的关键角色,通常集成在支持 VXLAN 的硬件交换机、虚拟交换机(如 Open vSwitch)上,也有独立部署的情况。
VTEP 的职责:
- 封装:本地虚拟机发出的原始二层帧,在 VTEP 处被加上 VXLAN 头、UDP 头、外层 IP 头后发往对端;
- 解封装:收到外层报文后,剥掉外层头,还原出原始二层帧,再交给本地虚拟机;
- 地址学习:维护「远端 MAC → 远端 VTEP IP」的映射关系。
3.3 VNI 网络标识
VXLAN 使用 VNI(VXLAN Network Identifier) 代替 VLAN ID 作为隔离标识。VNI 字段有 24 bit ,理论上可以支持 约 1600 万个隔离网络,彻底突破了 VLAN 的 4096 限制。
逻辑关系如下:
| 概念 | 作用 | 位宽 | 数量 |
|---|---|---|---|
| VLAN ID | 传统二层隔离 | 12 bit | 4094 |
| VNI | VXLAN 二层隔离 | 24 bit | 约 1677 万 |
4. VXLAN 报文格式
VXLAN 的本质是 MAC-in-UDP:完整的原始二层以太网帧作为「乘客数据」,被封装在 UDP 报文中传输。
4.1 整体封装结构
text
+---------------------------------------------------+
| Outer Ethernet Header | <- 底层物理网络承载
+---------------------------------------------------+
| Outer IP Header | <- 源/目的 VTEP IP
+---------------------------------------------------+
| Outer UDP Header | <- 目的端口固定为 4789
+---------------------------------------------------+
| VXLAN Header | <- 携带 VNI 等信息
+---------------------------------------------------+
| Original Ethernet Frame | <- 原始二层帧(乘客)
| (原始 MAC 头 + 原始 IP 头 + 原始数据) |
+---------------------------------------------------+
| FCS | <- 外层帧校验
+---------------------------------------------------+
4.2 VXLAN 头部字段详解
VXLAN 头部固定为 8 字节,位于 UDP 头之后、原始二层帧之前。
text
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中:第一行的 R 均为保留位,I 为 I 标志位。
| 字段 | 位宽 | 说明 |
|---|---|---|
| Flags(R/I) | 8 bit | 第 5 bit 为 I 标志位,置 1 表示 VNI 字段有效;其余为保留位,必须为 0 |
| Reserved | 24 bit | 紧随 Flags 之后,保留字段,必须为 0 |
| VNI | 24 bit | VXLAN 网络标识,用于识别所属虚拟二层网络 |
| Reserved | 8 bit | VNI 之后的保留字段,必须为 0 |
4.3 外层 UDP 报文
VXLAN 使用 UDP 承载,其中:
- 目的端口固定为 4789(IANA 分配的 VXLAN 标准端口);
- 源端口通常由 VTEP 根据内层报文的哈希值(如五元组)动态生成,这样可以使不同业务的流量分散到不同的等价路径上,便于 ECMP 负载均衡;
- UDP 让 VXLAN 能够依托成熟的 IP 网络进行转发,并利用五元组实现更好的负载分担。
4.4 外层 IP 头
外层 IP 头的源地址和目的地址分别是「本端 VTEP 的 IP」和「对端 VTEP 的 IP」。也就是说:
- 外层源 IP:发送方 VTEP 的 Underlay IP;
- 外层目的 IP:接收方 VTEP 的 Underlay IP。
底层 IP 网络只关注外层 IP 头进行转发,完全感知不到内层租户的二层帧。
5. VXLAN 与 IP 网络的结合
5.1 逻辑分层
VXLAN 把网络清晰地分成逻辑上的三层:
#mermaid-svg-ULVU9b2cIdIi3FD0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ULVU9b2cIdIi3FD0 .error-icon{fill:#552222;}#mermaid-svg-ULVU9b2cIdIi3FD0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ULVU9b2cIdIi3FD0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .marker.cross{stroke:#333333;}#mermaid-svg-ULVU9b2cIdIi3FD0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ULVU9b2cIdIi3FD0 p{margin:0;}#mermaid-svg-ULVU9b2cIdIi3FD0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .cluster-label text{fill:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .cluster-label span{color:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .cluster-label span p{background-color:transparent;}#mermaid-svg-ULVU9b2cIdIi3FD0 .label text,#mermaid-svg-ULVU9b2cIdIi3FD0 span{fill:#333;color:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .node rect,#mermaid-svg-ULVU9b2cIdIi3FD0 .node circle,#mermaid-svg-ULVU9b2cIdIi3FD0 .node ellipse,#mermaid-svg-ULVU9b2cIdIi3FD0 .node polygon,#mermaid-svg-ULVU9b2cIdIi3FD0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .rough-node .label text,#mermaid-svg-ULVU9b2cIdIi3FD0 .node .label text,#mermaid-svg-ULVU9b2cIdIi3FD0 .image-shape .label,#mermaid-svg-ULVU9b2cIdIi3FD0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-ULVU9b2cIdIi3FD0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .rough-node .label,#mermaid-svg-ULVU9b2cIdIi3FD0 .node .label,#mermaid-svg-ULVU9b2cIdIi3FD0 .image-shape .label,#mermaid-svg-ULVU9b2cIdIi3FD0 .icon-shape .label{text-align:center;}#mermaid-svg-ULVU9b2cIdIi3FD0 .node.clickable{cursor:pointer;}#mermaid-svg-ULVU9b2cIdIi3FD0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .arrowheadPath{fill:#333333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ULVU9b2cIdIi3FD0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ULVU9b2cIdIi3FD0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ULVU9b2cIdIi3FD0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ULVU9b2cIdIi3FD0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .cluster text{fill:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 .cluster span{color:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ULVU9b2cIdIi3FD0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ULVU9b2cIdIi3FD0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-ULVU9b2cIdIi3FD0 .icon-shape,#mermaid-svg-ULVU9b2cIdIi3FD0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ULVU9b2cIdIi3FD0 .icon-shape p,#mermaid-svg-ULVU9b2cIdIi3FD0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ULVU9b2cIdIi3FD0 .icon-shape .label rect,#mermaid-svg-ULVU9b2cIdIi3FD0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ULVU9b2cIdIi3FD0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ULVU9b2cIdIi3FD0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ULVU9b2cIdIi3FD0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 租户业务流量(原始二层帧)
VTEP 封装(Overlay)
UDP/IP 承载(Underlay)
底层 IP 网络路由转发
对端 VTEP 解封装
还原原始二层帧交给目标主机
5.2 Underlay 只需保证 VTEP 间 IP 可达
VXLAN 对底层网络的核心要求非常简单:所有 VTEP 之间三层 IP 可达。
- 底层可以是三层交换机、路由器,也可以是基于 BGP/OSPF 的 IP Fabric;
- 底层网络不需要学习租户的 MAC 地址;
- 底层网络只需要根据外层 IP 目的地址转发报文。
这种「把二层问题交给三层解决」的思路,极大简化了物理网络的设计,也避免了大规模二层网络的广播与 MAC 表问题。
6. 主机转发实际流程
下面通过两个典型场景说明数据从主机发出后,是如何在 VXLAN 网络中完成转发的。
6.1 场景一:同一 VNI 内不同主机互访(首次通信)
假设有两台虚拟机:
- VM-A :MAC 为
MA,IP 为192.168.1.10,挂载在主机Host-1,属于VNI 100; - VM-B :MAC 为
MB,IP 为192.168.1.20,挂载在主机Host-2,属于VNI 100; Host-1的 VTEP IP 为10.0.0.1,Host-2的 VTEP IP 为10.0.0.2。
假设 VM-A 第一次 ping VM-B,完整流程如下:
VM-B Host-2 VTEP 底层 IP 网络 Host-1 VTEP VM-A VM-B Host-2 VTEP 底层 IP 网络 Host-1 VTEP VM-A #mermaid-svg-65wmsRBB5Gdqn8Qj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-65wmsRBB5Gdqn8Qj .error-icon{fill:#552222;}#mermaid-svg-65wmsRBB5Gdqn8Qj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-65wmsRBB5Gdqn8Qj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-65wmsRBB5Gdqn8Qj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-65wmsRBB5Gdqn8Qj .marker.cross{stroke:#333333;}#mermaid-svg-65wmsRBB5Gdqn8Qj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-65wmsRBB5Gdqn8Qj p{margin:0;}#mermaid-svg-65wmsRBB5Gdqn8Qj .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-65wmsRBB5Gdqn8Qj text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-65wmsRBB5Gdqn8Qj .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-65wmsRBB5Gdqn8Qj .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-65wmsRBB5Gdqn8Qj #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-65wmsRBB5Gdqn8Qj .sequenceNumber{fill:white;}#mermaid-svg-65wmsRBB5Gdqn8Qj #sequencenumber{fill:#333;}#mermaid-svg-65wmsRBB5Gdqn8Qj #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-65wmsRBB5Gdqn8Qj .messageText{fill:#333;stroke:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-65wmsRBB5Gdqn8Qj .labelText,#mermaid-svg-65wmsRBB5Gdqn8Qj .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .loopText,#mermaid-svg-65wmsRBB5Gdqn8Qj .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-65wmsRBB5Gdqn8Qj .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-65wmsRBB5Gdqn8Qj .noteText,#mermaid-svg-65wmsRBB5Gdqn8Qj .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-65wmsRBB5Gdqn8Qj .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-65wmsRBB5Gdqn8Qj .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-65wmsRBB5Gdqn8Qj .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-65wmsRBB5Gdqn8Qj .actorPopupMenu{position:absolute;}#mermaid-svg-65wmsRBB5Gdqn8Qj .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-65wmsRBB5Gdqn8Qj .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-65wmsRBB5Gdqn8Qj .actor-man circle,#mermaid-svg-65wmsRBB5Gdqn8Qj line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-65wmsRBB5Gdqn8Qj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 原始 ARP Request(广播)2. 在本地 VNI 100 内广播3. 封装后经 IP 组播/泛洪发往远端 VTEP4. 转发到 VTEP25. 解封装还原 ARP 广播6. ARP Reply(单播)7. 封装后发回 VTEP18. 转发到 VTEP19. 解封装还原 ARP Reply
逐步说明:
- VM-A 发起 ARP 请求 :VM-A 想给
192.168.1.20发包,先发出 ARP Request 广播,询问谁是192.168.1.20,源 MAC 为MA; - VTEP1 处理广播 :Host-1 上的 VTEP 收到 ARP 广播。由于 VTEP 之间尚未学习到目标 MAC,该广播需要在
VNI 100内泛洪; - VTEP1 封装泛洪 :VTEP1 将原始 ARP 广播帧封装,外层源 IP 为
10.0.0.1,外层目的 IP 为组播地址(用于 BUM 流量泛洪),VNI 填100,通过底层 IP 网络转发给所有相关 VTEP; - 底层 IP 网络转发:底层交换机/路由器只根据外层 IP 目的地址转发报文到各个 VTEP;
- VTEP2 解封装 :Host-2 上的 VTEP 收到后剥掉外层头,发现 VNI 为
100,将原始 ARP 广播还原并广播到本地属于VNI 100的虚拟接口,VM-B 收到; - VM-B 回复 ARP :VM-B 发现问的是自己的 IP,单播回复 ARP Reply,携带自己的 MAC
MB; - VTEP2 封装单播 :VTEP2 将 ARP Reply 封装,外层目的 IP 为对端 VTEP IP
10.0.0.1; - 底层 IP 网络转发:报文到达 VTEP1;
- VTEP1 解封装:还原 ARP Reply 交给 VM-A。
说明:BUM 流量即 Broadcast(广播)、Unknown unicast(未知单播)、Multicast(组播),这类流量在 VXLAN 中需要泛洪。对于标准 VXLAN,底层依赖 IP 组播完成泛洪;对于 EVPN-VXLAN 或集中式控制平面,则通过控制平面同步 MAC 和 VTEP 信息,减少泛洪。
6.2 场景二:MAC 学习完成后的单播转发
当上面的 ARP 过程完成后,VTEP1 已经学习到映射关系:
text
远端 MAC:MB -> 远端 VTEP IP:10.0.0.2(VNI 100)
此时 VM-A 再次向 VM-B 发送 ICMP 请求,进入纯单播转发流程:
#mermaid-svg-DNkF8LqeejP7um3C{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DNkF8LqeejP7um3C .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DNkF8LqeejP7um3C .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DNkF8LqeejP7um3C .error-icon{fill:#552222;}#mermaid-svg-DNkF8LqeejP7um3C .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DNkF8LqeejP7um3C .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DNkF8LqeejP7um3C .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DNkF8LqeejP7um3C .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DNkF8LqeejP7um3C .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DNkF8LqeejP7um3C .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DNkF8LqeejP7um3C .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DNkF8LqeejP7um3C .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DNkF8LqeejP7um3C .marker.cross{stroke:#333333;}#mermaid-svg-DNkF8LqeejP7um3C svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DNkF8LqeejP7um3C p{margin:0;}#mermaid-svg-DNkF8LqeejP7um3C .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DNkF8LqeejP7um3C .cluster-label text{fill:#333;}#mermaid-svg-DNkF8LqeejP7um3C .cluster-label span{color:#333;}#mermaid-svg-DNkF8LqeejP7um3C .cluster-label span p{background-color:transparent;}#mermaid-svg-DNkF8LqeejP7um3C .label text,#mermaid-svg-DNkF8LqeejP7um3C span{fill:#333;color:#333;}#mermaid-svg-DNkF8LqeejP7um3C .node rect,#mermaid-svg-DNkF8LqeejP7um3C .node circle,#mermaid-svg-DNkF8LqeejP7um3C .node ellipse,#mermaid-svg-DNkF8LqeejP7um3C .node polygon,#mermaid-svg-DNkF8LqeejP7um3C .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DNkF8LqeejP7um3C .rough-node .label text,#mermaid-svg-DNkF8LqeejP7um3C .node .label text,#mermaid-svg-DNkF8LqeejP7um3C .image-shape .label,#mermaid-svg-DNkF8LqeejP7um3C .icon-shape .label{text-anchor:middle;}#mermaid-svg-DNkF8LqeejP7um3C .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DNkF8LqeejP7um3C .rough-node .label,#mermaid-svg-DNkF8LqeejP7um3C .node .label,#mermaid-svg-DNkF8LqeejP7um3C .image-shape .label,#mermaid-svg-DNkF8LqeejP7um3C .icon-shape .label{text-align:center;}#mermaid-svg-DNkF8LqeejP7um3C .node.clickable{cursor:pointer;}#mermaid-svg-DNkF8LqeejP7um3C .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DNkF8LqeejP7um3C .arrowheadPath{fill:#333333;}#mermaid-svg-DNkF8LqeejP7um3C .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DNkF8LqeejP7um3C .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DNkF8LqeejP7um3C .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DNkF8LqeejP7um3C .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DNkF8LqeejP7um3C .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DNkF8LqeejP7um3C .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DNkF8LqeejP7um3C .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DNkF8LqeejP7um3C .cluster text{fill:#333;}#mermaid-svg-DNkF8LqeejP7um3C .cluster span{color:#333;}#mermaid-svg-DNkF8LqeejP7um3C div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DNkF8LqeejP7um3C .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DNkF8LqeejP7um3C rect.text{fill:none;stroke-width:0;}#mermaid-svg-DNkF8LqeejP7um3C .icon-shape,#mermaid-svg-DNkF8LqeejP7um3C .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DNkF8LqeejP7um3C .icon-shape p,#mermaid-svg-DNkF8LqeejP7um3C .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DNkF8LqeejP7um3C .icon-shape .label rect,#mermaid-svg-DNkF8LqeejP7um3C .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DNkF8LqeejP7um3C .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DNkF8LqeejP7um3C .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DNkF8LqeejP7um3C :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} VM-A 发送帧
目的 MAC=MB
源 MAC=MA
VTEP1 查 MAC 表
MB -> 10.0.0.2
VTEP1 封装
外层源 IP=10.0.0.1
外层目的 IP=10.0.0.2
VNI=100
底层 IP 网络转发
VTEP2 解封装
还原原始帧
VM-B 收到原始帧
逐步说明:
- VM-A 发送普通以太网帧,目的 MAC 为
MB; - VTEP1 在内层查 MAC 表,得知
MB对应的远端 VTEP IP 为10.0.0.2; - VTEP1 封装:外层目的 IP 直接填
10.0.0.2,外层源 IP 填10.0.0.1,VNI 填100; - 报文在 Underlay IP 网络中逐跳三层路由转发到 Host-2;
- VTEP2 收到后解封装,确认 VNI 有效并还原原始帧;
- VM-B 收到与 VM-A 直连二层网络完全一致的原始帧。
6.3 跨网段转发(经过三层网关)
如果 VM-A(192.168.1.10)要访问另一 VNI 或另一网段的主机,则需要经过 VXLAN 三层网关。
简化流程如下:
#mermaid-svg-fJxT6AIdVh6waa73{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fJxT6AIdVh6waa73 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fJxT6AIdVh6waa73 .error-icon{fill:#552222;}#mermaid-svg-fJxT6AIdVh6waa73 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fJxT6AIdVh6waa73 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fJxT6AIdVh6waa73 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fJxT6AIdVh6waa73 .marker.cross{stroke:#333333;}#mermaid-svg-fJxT6AIdVh6waa73 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fJxT6AIdVh6waa73 p{margin:0;}#mermaid-svg-fJxT6AIdVh6waa73 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fJxT6AIdVh6waa73 .cluster-label text{fill:#333;}#mermaid-svg-fJxT6AIdVh6waa73 .cluster-label span{color:#333;}#mermaid-svg-fJxT6AIdVh6waa73 .cluster-label span p{background-color:transparent;}#mermaid-svg-fJxT6AIdVh6waa73 .label text,#mermaid-svg-fJxT6AIdVh6waa73 span{fill:#333;color:#333;}#mermaid-svg-fJxT6AIdVh6waa73 .node rect,#mermaid-svg-fJxT6AIdVh6waa73 .node circle,#mermaid-svg-fJxT6AIdVh6waa73 .node ellipse,#mermaid-svg-fJxT6AIdVh6waa73 .node polygon,#mermaid-svg-fJxT6AIdVh6waa73 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fJxT6AIdVh6waa73 .rough-node .label text,#mermaid-svg-fJxT6AIdVh6waa73 .node .label text,#mermaid-svg-fJxT6AIdVh6waa73 .image-shape .label,#mermaid-svg-fJxT6AIdVh6waa73 .icon-shape .label{text-anchor:middle;}#mermaid-svg-fJxT6AIdVh6waa73 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fJxT6AIdVh6waa73 .rough-node .label,#mermaid-svg-fJxT6AIdVh6waa73 .node .label,#mermaid-svg-fJxT6AIdVh6waa73 .image-shape .label,#mermaid-svg-fJxT6AIdVh6waa73 .icon-shape .label{text-align:center;}#mermaid-svg-fJxT6AIdVh6waa73 .node.clickable{cursor:pointer;}#mermaid-svg-fJxT6AIdVh6waa73 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fJxT6AIdVh6waa73 .arrowheadPath{fill:#333333;}#mermaid-svg-fJxT6AIdVh6waa73 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fJxT6AIdVh6waa73 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fJxT6AIdVh6waa73 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fJxT6AIdVh6waa73 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fJxT6AIdVh6waa73 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fJxT6AIdVh6waa73 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fJxT6AIdVh6waa73 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fJxT6AIdVh6waa73 .cluster text{fill:#333;}#mermaid-svg-fJxT6AIdVh6waa73 .cluster span{color:#333;}#mermaid-svg-fJxT6AIdVh6waa73 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fJxT6AIdVh6waa73 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fJxT6AIdVh6waa73 rect.text{fill:none;stroke-width:0;}#mermaid-svg-fJxT6AIdVh6waa73 .icon-shape,#mermaid-svg-fJxT6AIdVh6waa73 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fJxT6AIdVh6waa73 .icon-shape p,#mermaid-svg-fJxT6AIdVh6waa73 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fJxT6AIdVh6waa73 .icon-shape .label rect,#mermaid-svg-fJxT6AIdVh6waa73 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fJxT6AIdVh6waa73 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fJxT6AIdVh6waa73 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fJxT6AIdVh6waa73 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} VM-A
VTEP1 封装
目的=网关 VTEP IP
底层 IP 网络
VXLAN 网关(分布式/集中式)
解封装后查路由表
执行三层转发
重新封装
目的=目标 VTEP IP
底层 IP 网络
目标 VTEP 解封装
目标主机
核心点:
- 内层报文的「目的 MAC」指向网关的虚拟 MAC,网关通常以 SVI(交换机虚拟接口) 或分布式网关形式存在;
- 报文先被送到网关 VTEP,解封装后在内层执行三层路由查找;
- 找到出口后,网关重新封装报文,将外层目的 IP 改为目标主机所在 VTEP 的 IP,VNI 改为目标网段对应的 VNI;
- 最终目标 VTEP 解封装后把报文交给目标主机。
6.4 关键转发结论
| 转发场景 | 内层目的 MAC | 外层目的 IP | 是否走网关 |
|---|---|---|---|
| 同 VNI 已知单播 | 目标主机 MAC | 目标主机所在 VTEP IP | 否 |
| 同 VNI BUM 流量 | 广播/组播 | 组播地址或泛洪列表 | 否 |
| 跨 VNI/跨网段 | 网关虚拟 MAC | 网关 VTEP IP | 是 |
7. 总结
VXLAN 的核心可以归纳为以下几点:
- 背景:解决 VLAN 4094 上限和大二层跨三层扩展问题;
- 机制:基于 MAC-in-UDP 的 Overlay 技术,通过 VTEP 实现封装与解封装;
- 标识:使用 24 bit 的 VNI 提供约 1600 万级别的逻辑隔离;
- 报文:原始二层帧外层依次封装 VXLAN 头、UDP 头、IP 头;UDP 目的端口固定为 4789;
- 转发:内层依靠 MAC 地址定位目标主机,外层依靠 IP 地址定位远端 VTEP;首次通信走泛洪学习,学习完成后走单播转发;
- 与 IP 结合:Underlay 只需保证 VTEP 之间 IP 可达,底层网络完全不感知租户二层内容。
理解 VXLAN,本质上就是理解「如何利用成熟的 IP 网络,承载一个虚拟的、可大规模扩展的二层网络」。掌握了背景、报文字段和两种转发流程,再去看 EVPN-VXLAN、VTEP 之间的 BGP EVPN 控制平面就有了坚实的基础。