VXLAN:背景、机制、报文字段与主机转发流程

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 的职责:

  1. 封装:本地虚拟机发出的原始二层帧,在 VTEP 处被加上 VXLAN 头、UDP 头、外层 IP 头后发往对端;
  2. 解封装:收到外层报文后,剥掉外层头,还原出原始二层帧,再交给本地虚拟机;
  3. 地址学习:维护「远端 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

逐步说明:

  1. VM-A 发起 ARP 请求 :VM-A 想给 192.168.1.20 发包,先发出 ARP Request 广播,询问谁是 192.168.1.20,源 MAC 为 MA;
  2. VTEP1 处理广播 :Host-1 上的 VTEP 收到 ARP 广播。由于 VTEP 之间尚未学习到目标 MAC,该广播需要在 VNI 100 内泛洪;
  3. VTEP1 封装泛洪 :VTEP1 将原始 ARP 广播帧封装,外层源 IP 为 10.0.0.1,外层目的 IP 为组播地址(用于 BUM 流量泛洪),VNI 填 100,通过底层 IP 网络转发给所有相关 VTEP;
  4. 底层 IP 网络转发:底层交换机/路由器只根据外层 IP 目的地址转发报文到各个 VTEP;
  5. VTEP2 解封装 :Host-2 上的 VTEP 收到后剥掉外层头,发现 VNI 为 100,将原始 ARP 广播还原并广播到本地属于 VNI 100 的虚拟接口,VM-B 收到;
  6. VM-B 回复 ARP :VM-B 发现问的是自己的 IP,单播回复 ARP Reply,携带自己的 MAC MB;
  7. VTEP2 封装单播 :VTEP2 将 ARP Reply 封装,外层目的 IP 为对端 VTEP IP 10.0.0.1;
  8. 底层 IP 网络转发:报文到达 VTEP1;
  9. 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 收到原始帧

逐步说明:

  1. VM-A 发送普通以太网帧,目的 MAC 为 MB;
  2. VTEP1 在内层查 MAC 表,得知 MB 对应的远端 VTEP IP 为 10.0.0.2;
  3. VTEP1 封装:外层目的 IP 直接填 10.0.0.2,外层源 IP 填 10.0.0.1,VNI 填 100;
  4. 报文在 Underlay IP 网络中逐跳三层路由转发到 Host-2;
  5. VTEP2 收到后解封装,确认 VNI 有效并还原原始帧;
  6. 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 解封装
目标主机

核心点:

  1. 内层报文的「目的 MAC」指向网关的虚拟 MAC,网关通常以 SVI(交换机虚拟接口) 或分布式网关形式存在;
  2. 报文先被送到网关 VTEP,解封装后在内层执行三层路由查找;
  3. 找到出口后,网关重新封装报文,将外层目的 IP 改为目标主机所在 VTEP 的 IP,VNI 改为目标网段对应的 VNI;
  4. 最终目标 VTEP 解封装后把报文交给目标主机。

6.4 关键转发结论

转发场景 内层目的 MAC 外层目的 IP 是否走网关
同 VNI 已知单播 目标主机 MAC 目标主机所在 VTEP IP 否
同 VNI BUM 流量 广播/组播 组播地址或泛洪列表 否
跨 VNI/跨网段 网关虚拟 MAC 网关 VTEP IP 是

7. 总结

VXLAN 的核心可以归纳为以下几点:

  1. 背景:解决 VLAN 4094 上限和大二层跨三层扩展问题;
  2. 机制:基于 MAC-in-UDP 的 Overlay 技术,通过 VTEP 实现封装与解封装;
  3. 标识:使用 24 bit 的 VNI 提供约 1600 万级别的逻辑隔离;
  4. 报文:原始二层帧外层依次封装 VXLAN 头、UDP 头、IP 头;UDP 目的端口固定为 4789;
  5. 转发:内层依靠 MAC 地址定位目标主机,外层依靠 IP 地址定位远端 VTEP;首次通信走泛洪学习,学习完成后走单播转发;
  6. 与 IP 结合:Underlay 只需保证 VTEP 之间 IP 可达,底层网络完全不感知租户二层内容。

理解 VXLAN,本质上就是理解「如何利用成熟的 IP 网络,承载一个虚拟的、可大规模扩展的二层网络」。掌握了背景、报文字段和两种转发流程,再去看 EVPN-VXLAN、VTEP 之间的 BGP EVPN 控制平面就有了坚实的基础。

相关推荐
乐维_lwops2 小时前
案例解读:大型综合性科创产业园运维监控落地实践
运维·网络·人工智能·安全·it监控·国产运维智能体
m0_715674434 小时前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
大数据·网络·人工智能·安全·网络安全·政务
AI 编程助手GPT4 小时前
curl 返回成功就能收文件?用本地 HTTP 验证错误页与超时
网络·网络协议·http
十碗饭吃不饱5 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络
从琳开始9897 小时前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php
xiaoye-duck9 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(下):流式响应实现和测试
网络·c++·语言模型·chatgpt
梦帮科技9 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
坤坤子吖11 小时前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
爱和冰阔落12 小时前
【Linux网络】TCP 服务器怎么写?从 listen、accept 到 read/write,手写完整 Echo Server
linux·运维·服务器·网络