一.为什么需要VXLAN

传统 VLAN 的封装位置和局限性

1. VLAN 封装在哪里?

传统 VLAN 的标签是在二层以太网帧的头部进行封装的,具体位置如下:

text

【传统以太网帧(无VLAN)】
| 目标MAC (6) | 源MAC (6) | 类型 (2) | 数据 | FCS |

text

【802.1Q VLAN 帧】
| 目标MAC (6) | 源MAC (6) | **0x8100 (2)** | **PCP(3)+DEI(1)+VID(12)** | 类型 (2) | 数据 | FCS |
  • 关键字段

    • TPID:固定为 0x8100,标识这是一个带 802.1Q 标签的帧。

    • TCI:包含:

      • VLAN ID12位,这就是问题的核心。它最大值为 2^12 - 2 = 4094(0 和 4095 保留)。

VLAN 标签是由交换机添加和移除的,只在同一个二层广播域内有效。 一旦数据包需要通过路由器进行三层路由,VLAN 标签通常就会被剥离。

2. 为什么传统 VLAN 在云时代不够用了?

VLAN 的 4094 个限制在传统企业网中可能足够,但在云计算和多租户数据中心中带来了严重问题:

  1. 数量限制:一个大型云提供商可能有成千上万个租户(客户),4094 个完全不够用。

  2. 隔离性弱:VLAN 的隔离依赖于 MAC 地址表。在大规模网络中,MAC 地址表可能被攻破或配置错误,导致"VLAN 跳跃"攻击。

  3. 网络范围受限:VLAN 本质上是一个二层概念。它无法跨越一个三层的 IP 网络。这意味着虚拟机被限制在同一个物理数据中心、同一个子网内,无法自由迁移。


3.为什么需要 VXLAN?

VXLAN 就是为了解决上述所有问题而设计的。

1. 巨大的扩展性
  • VXLAN 使用 24 位的 VNI 来标识虚拟网络。

  • 最大数量为 2^24 = 16,777,216(约 1600 万)个。

  • 这足以让每个云租户都有自己的逻辑网络,甚至一个租户可以有多个。

2. 克服物理位置限制

这是 VXLAN 最核心的价值之一。

  • 场景:公司A在北京和上海都有数据中心。他们希望两个数据中心的服务器属于同一个子网(例如 10.1.1.0/24),以便应用能够无缝通信或进行虚拟机热迁移。

  • 传统 VLAN 无法实现:因为北京和上海的数据中心之间是通过三层 IP 网络互联的,VLAN 标签无法穿越。

  • VXLAN 解决方案

    • VXLAN 将虚拟机发出的原始以太网帧(包括它的 VLAN 标签,如果有的话)整个封装在一个 UDP/IP 包中

    • 这个 UDP/IP 包可以通过任何 IP 网络进行路由,就像普通的网页流量一样,从北京到达上海。

    • 目的地的 VTEP 解封装后,将原始帧交给目标虚拟机。

  • 效果:VXLAN 在三层 IP 网络之上,构建了一个庞大的、虚拟的"二层 overlay 网络"

3. 更好的隔离性
  • VXLAN 的隔离基于 VNI

  • 通信的建立依赖于控制平面(如 EVPN),更加安全和可控。

  • 一个 VNI 中的 MAC 地址不会泄漏到另一个 VNI 中。

二. underlay 和overlay

1. Underlay 网络

这是传统的物理IP网络,是所有流量的承载基础。

  • 角色:为 VXLAN 的封装包提供IP可达的传输路径

  • 技术:就是你现在已经很熟悉的三层路由协议(如 OSPF, IS-IS, BGP)和二层交换技术。目标非常简单:让网络中的任何两台物理交换机(特别是担任VTEP角色的交换机)之间都能够通过IP地址相互访问。

  • 关注点

    • 可达性:确保网络中没有路由黑洞。

    • 可靠性:使用快速收敛协议,确保链路或设备故障时能快速切换。

    • 性能:保证足够的带宽和低延迟,因为Underlay的性能直接影响Overlay的质量。

  • 简单来说:Underlay 就是让 VTEP 之间能够通过 IP 互相 Ping 通 的那个网络。

2. Overlay 网络

这是建立在 Underlay 之上的虚拟化、逻辑的网络

  • 角色:实现虚拟机/容器之间的逻辑二层或三层互联,不受物理网络位置的限制。

  • 技术核心 - VXLAN

    • 封装:Overlay 将虚拟机发出的原始数据帧(比如一个以太网帧),整个封装在一个新的 UDP 数据包中。

    • VXLAN 头部:这个新的UDP包有一个 VXLAN 头部,里面最重要的字段是 VNI,这是一个 24-bit 的标识符,类似于 VLAN ID,但规模大得多(1600万 vs 4094),用于隔离不同的虚拟网络(租户)。

    • IP 头部:在 VXLAN/UDP 头部外面,再封装一个新的 IP 头部。这个IP头部的源IP是源VTEP的IP,目的IP是目的VTEP的IP。这个IP地址是在 Underlay 网络中路由的。

  • 关键组件 - VTEP

    • VXLAN 隧道端点 是 Overlay 和 Underlay 的边界和桥梁。它通常是物理交换机(硬件VTEP)或虚拟交换机(如vSphere的vDS,Linux bridge,软件VTEP)。

    • 职责:执行“封装”和“解封装”操作。它就像是物流系统中的“本地转运中心”。

  • 简单来说:Overlay 就是通过 VTEP 的封装技术,在 Underlay 的 IP 网络上“模拟”出一个庞大的、虚拟的二层广播域

三.VXLAN 报文整体结构

一个完整的 VXLAN 报文就像是一个“俄罗斯套娃”,从外到内依次是:

外层 Ethernet 头 -> 外层 IP 头 -> 外层 UDP 头 -> VXLAN 头 -> 原始的内层以太网帧

  1. 两层封装:VXLAN 创建了两套独立的寻址系统。

    • 外层头:用于在 Underlay(物理网络)中路由,使用 VTEP 的 IP

    • 内层头:用于在 Overlay(虚拟网络)中通信,使用 虚拟机的 MAC/IP

  2. VNI 是关键VNI 提供了网络隔离,类似于 VLAN ID,但规模巨大。只有拥有相同 VNI 的虚拟机才能相互通信。

  3. 负载均衡:UDP 源端口由哈希计算得出,这使得网络设备可以将不同的 VXLAN 流映射到不同的物理路径上,充分利用所有可用链路。

  4. 对中间网络透明:Underlay 网络中的路由器和交换机完全不需要理解 VXLAN 头或内层帧的内容。它们只根据最外层的 IP 和 MAC 地址进行转发,就像处理任何一个普通的 IP 数据包一样。

VXLAN 在技术上利用 UDP 作为其传输层协议,但它本质上是一个服务于网络虚拟化的隧道协议,而非一个面向最终用户的应用层协议。

四. 报文封装解析

假设我们有一个数据中心,里面运行着两个虚拟机:

  • VM-A

    • MAC 地址: 00:11:22:33:44:AA

    • IP 地址: 192.168.10.10

    • 所在物理服务器上的 VTEP-1 的 IP 是 10.1.1.100

  • VM-B

    • MAC 地址: 00:11:22:33:44:BB

    • IP 地址: 192.168.10.20

    • 所在物理服务器上的 VTEP-2 的 IP 是 10.1.2.200

  • VXLAN 网络标识符VNI = 5000

现在,VM-A 要 Ping VM-B


第1步:原始以太网帧(Overlay 网络流量)

在 VTEP-1 进行封装之前,VM-A 发出的原始 ICMP 请求帧是这样的:

text

【 原始以太网帧 - 由 VM-A 发出 】
-------------------------------------------------------------------
| 字段             | 值                                               |
-------------------------------------------------------------------
| 目的 MAC地址     | 00:11:22:33:44:BB (VM-B的MAC)                   |
| 源 MAC地址       | 00:11:22:33:44:AA (VM-A的MAC)                   |
| Ethertype        | 0x0800 (表示载荷是IPv4)                         |
| ----------------------------------------------------------------- |
| 【内层IP头】                                                      |
| 源IP地址         | 192.168.10.10 (VM-A)                           |
| 目的IP地址       | 192.168.10.20 (VM-B)                           |
| 协议             | 1 (ICMP)                                       |
| ----------------------------------------------------------------- |
| 【内层ICMP数据】                                                  |
| Type/Code        | 8/0 (Echo Request)                             |
| 校验和           | ... (计算得出)                                  |
| 数据             | "Ping Data"                                    |
-------------------------------------------------------------------

这个帧就是需要被运送的“货物”。


第2步:VTEP-1 进行 VXLAN 封装

VTEP-1 收到这个原始帧后,会执行以下操作:

  1. 识别出目标 VM-B 位于另一个 VTEP(VTEP-2)后面。

  2. 决定将这个原始帧封装到一个 VXLAN 包中,发往 10.1.2.200

  3. 开始“打包”,添加各层头部。

封装后的完整 VXLAN 报文如下:

text

【 完整的 VXLAN 封装报文 】
===================================================================
【外层以太网头 - 用于物理网络第一跳】
-------------------------------------------------------------------
| 目的 MAC地址     | (例如: 00:50:56:XX:XX:XX) // 去往10.1.2.200的下一跳路由器MAC |
| 源 MAC地址       | (例如: 00:50:56:YY:YY:YY) // VTEP-1的物理MAC        |
| Ethertype        | 0x0800 (表示外层载荷是IPv4)                    |
-------------------------------------------------------------------

【外层IP头 - Underlay网络路由的依据】
-------------------------------------------------------------------
| 版本/IHL         | 4                                              |
| 服务类型         | ...                                            |
| 总长度           | (原始帧长 + 50字节左右的VXLAN开销)              |
| 标识符           | ...                                            |
| 标志/片偏移      | ...                                            |
| TTL              | 64                                             |
| 协议             | 17 (表示后面是UDP)                             |
| 头部校验和       | ...                                            |
| 源IP地址         | 10.1.1.100 (VTEP-1的IP)                       |
| 目的IP地址       | 10.1.2.200 (VTEP-2的IP)                       |
-------------------------------------------------------------------

【外层UDP头 - VXLAN的传输载体】
-------------------------------------------------------------------
| 源端口           | 54321 // VTEP-1动态计算生成,用于负载均衡       |
| 目的端口         | 4789 // VXLAN标准端口号                        |
| UDP长度          | (原始帧长 + 8字节VXLAN头 + 8字节UDP头)         |
| UDP校验和        | 0x0000 (可能被禁用) 或 ...                     |
-------------------------------------------------------------------

【VXLAN头 - Overlay网络的标识】
-------------------------------------------------------------------
| Flags            | 0x08 (二进制: 00001000, 第5位'I'位=1,有效)    |
| Reserved         | 0x000000 (24位保留)                           |
| VNI              | 0x01388 (24位, 十进制5000) // 关键!标识租户   |
| Reserved         | 0x00 (8位保留)                                |
-------------------------------------------------------------------

【原始以太网帧 - 作为载荷被完整封装】
-------------------------------------------------------------------
| 目的 MAC地址     | 00:11:22:33:44:BB (VM-B的MAC) // 内层帧开始    |
| 源 MAC地址       | 00:11:22:33:44:AA (VM-A的MAC)                 |
| Ethertype        | 0x0800                                        |
| ----------------------------------------------------------------- |
| 【内层IP头】                                                      |
| 源IP地址         | 192.168.10.10 (VM-A)                          |
| 目的IP地址       | 192.168.10.20 (VM-B)                          |
| 协议             | 1 (ICMP)                                      |
| ----------------------------------------------------------------- |
| 【内层ICMP数据】                                                  |
| Type/Code        | 8/0 (Echo Request)                            |
| 校验和           | ...                                           |
| 数据             | "Ping Data"                                   |
-------------------------------------------------------------------
===================================================================

关键点解析

  1. 两层寻址

    • 外层头源IP: 10.1.1.100 -> 目的IP: 10.1.2.200。Underlay 网络的路由器只关心这个,它们把整个包当作一个普通的 UDP 数据包来路由。

    • 内层头源IP: 192.168.10.10 -> 目的IP: 192.168.10.20。Overlay 网络中的 VM-A 和 VM-B 只关心这个。它们完全不知道自己的数据包被封装了。

  2. VNI 的作用:VTEP-2 收到包后,通过查看 VNI=5000,就知道这个包属于哪个逻辑网络,然后只将其转发给同样属于 VNI 5000 的虚拟机。

  3. 负载均衡:UDP 源端口 54321 是计算出来的。如果 VM-A 同时有多个流发往 VM-B,每个流的源端口可能不同,这样 Underlay 网络就可以将这些流分散到不同的链路上。

总结

通过这个例子,你可以清晰地看到 VXLAN 如何将一个 二层以太网帧 “装进” 一个 四层 UDP 包 里,然后利用三层的 IP 网络进行传输。这正是“Overlay over Underlay”思想的完美体现:在基础的 IP 网络(Underlay)之上,构建一个虚拟的二层网络(Overlay)

五、UDP 的源端口是随机的,可用于多路径负载分担?怎么理解,负载分担的几要素,五元组:源ip,目的ip,协议号,源端口,目的端口,一定要一个不同的,保证哈希均匀,做哈希的时候。ecmp ,代价,芯片有算法。

为什么需要不同的五元组?

ECMP(等价多路径路由)的核心思想是:通过网络设备(通常是交换机或路由器)上的硬件芯片,将不同的“数据流”分散到多条并行的物理链路上,以充分利用带宽。

这个“区分数据流”的依据,就是您提到的 五元组

  • 源 IP

  • 目的 IP

  • 协议号

  • 源端口

  • 目的端口

芯片会对这五个字段进行一个哈希运算,得到一个数值。然后根据这个哈希值,从可用的路径中选择一条(例如,哈希值 % 路径数)。

关键在于如果两个数据包的五元组完全相同,它们的哈希结果也必然相同,从而会被始终分配到同一条路径上。 这就无法实现负载分担。

一个具体的例子

假设 VTEP-1 (10.1.1.100) 和 VTEP-2 (10.1.2.200) 之间有 4 条物理链路做 ECMP。

场景 1:没有动态源端口(所有流量哈希结果相同)

  • VM1 (192.168.10.10) 向 VM2 (192.168.10.20) 传输一个大文件。

  • VM1 又向 VM2 发起一个视频会议流。

  • 如果没有动态源端口,假设 VTEP-1 使用固定源端口 12345

  • 那么这两个应用流量的外层五元组完全一样,哈希结果一样,两条流量会被压到同一条物理链路上,而其他3条链路空闲。负载分担失败。

场景 2:有动态源端口(不同流量哈希结果不同)

  • 文件传输流:内层字段是 (Src=192.168.10.10, Dst=192.168.10.20, Proto=TCP, SrcPort=12345, DstPort=22)。哈希后,VTEP-1 为其分配 UDP 源端口 34567

  • 视频会议流:内层字段是 (Src=192.168.10.10, Dst=192.168.10.20, Proto=UDP, SrcPort=54321, DstPort=5000)。哈希后,VTEP-1 为其分配 UDP 源端口 45678

现在,两个 VXLAN 包的外层头部分别是:

  1. 文件传输包:(SrcIP=10.1.1.100, DstIP=10.1.2.200, Proto=UDP, SrcPort=34567, DstPort=4789)

  2. 视频会议包:(SrcIP=10.1.1.100, DstIP=10.1.2.200, Proto=UDP, SrcPort=45678, DstPort=4789)

对于 Underlay 网络的 ECMP 交换机来说

  • 它看到的是两个五元组不同的普通 UDP 数据包。

  • 它对这两个包计算哈希,结果很可能不同。

  • 于是,它可能将文件传输流分配到 路径1,将视频会议流分配到 路径2

  • 成功实现了负载分担!


关于“代价”和“芯片”

您提到的“代价”和“芯片有算法”也非常到位。

  • 代价

    • 计算开销:VTEP 需要对每个流的第一个包进行内层字段的哈希计算以确定源端口。这是一个轻微的性能代价,但通常由专用硬件或优化的软件实现,影响很小。

    • 状态跟踪:为了确保同一个“流”(如一个TCP连接)的所有包使用相同的源端口(避免乱序),VTEP 需要维护一个流表,记录内层流到外层UDP端口的映射。

  • 芯片有算法

    • 现代交换机和路由器的转发 ASIC 就是为了高速处理这类任务而生的。

    • 哈希算法:芯片内置了高效的哈希算法(如 CRC32, XOR),可以在纳秒级别完成五元组的哈希计算。

    • ECMP 表:芯片维护一个 ECMP 组表,里面包含了多条下一跳的路径。哈希计算的结果直接作为索引,从这个表中选取一条路径,整个过程在硬件流水线中一气呵成,几乎没有延迟。

总结

VXLAN 使用动态的 UDP 源端口,是一个为了解决 Underlay 网络 ECMP 负载分担 而精心设计的机制。

  1. 目的:为固定的 VTEP 对之间的流量创造差异性

  2. 方法:通过对内层流量的多个字段进行哈希,将结果映射到 UDP 源端口上。

  3. 效果:使得 Underlay 网络设备能够基于完整且多变的外层五元组进行高效的哈希计算,将不同的 Overlay 流量流分散到不同的物理路径上,从而充分利用网络带宽,避免拥塞。

这是一个完美结合了四层协议特性和三层路由技术的经典设计。

六.水平分割

水平分割的核心原则非常简单直接:

从一个接口学到的路由信息,不再从同一个接口发送出去。

这是一种用于防止路由环路和广播风暴的基本机制。


1. 三层网络中的水平分割

这主要应用于运行距离矢量路由协议的网络中,如 RIP 和 EIGRP。

  • 工作原理:路由器认为,如果它从某个邻居路由器那里学到了一条去往网络 A 的路由,那么它就不应该再把这个路由信息回传给同一个邻居。因为那个邻居本来就知道这条路,再告诉它纯属多余,更糟糕的是,在拓扑变化时这可能形成环路。

举个例子:

假设有三台路由器连接成一个环:

text

      [Router A] --- [Router B] --- [Router C]
         |                             |
         --------------[----------------
  1. 没有水平分割时(可能产生环路):

    • C 连接网络 10.1.1.0/24。它告诉 B:“我能到达 10.1.1.0/24”。

    • B 学习到这条路由,然后告诉 A:“我能到达 10.1.1.0/24”。

    • A 学习到这条路由,然后告诉 C:“我能到达 10.1.1.0/24”。

    • 此时,如果 C 到 10.1.1.0/24 的链路故障,但 C 还没来得及通知所有人,它可能会错误地从 A 那里学到一条去往自己直连网络的路由,从而形成环路:C -> A -> B -> C。

  2. 有水平分割时(避免环路):

    • C 告诉 B:“我能到达 10.1.1.0/24”。

    • B 从与 C 相连的接口学到了这条路由。根据水平分割原则,B 不会再从这个相同的接口发消息告诉 C “我能到达 10.1.1.0/24”。

    • B 会从其他接口(比如朝向 A 的接口)告诉 A。

    • A 学到后,也不会把它发回给 B。

    • 这样就从根源上切断了环路的可能性。

在三层网络中,水平分割通常是默认启用的。


2. 二层网络中的水平分割

这主要应用于传统的 二层交换网络 和 帧中继 等环境中。

  • 工作原理:交换机从一个端口收到广播、组播或未知单播帧时,会将其从所有其他端口泛洪出去。但如果启用了水平分割,交换机不会将这个帧再发回它接收到的那个端口。

举个例子:

假设一个简单的 Hub-and-Spoke 拓扑:

text

      [Server A]
          |
      [Switch S]
         / \
    [PC B] [PC C]
  1. 没有水平分割时(产生不必要的流量):

    • PC B 发送一个广播帧(例如 ARP 请求)。

    • 交换机 S 从连接 B 的端口收到该帧。

    • 交换机 S 将其泛洪到所有其他端口,即发往 Server A 和 PC C。

    • 同时,它也可能愚蠢地将其发回给 PC B(虽然 PC B 会丢弃自己发出的帧,但这仍然浪费了带宽和设备的处理能力)。

  2. 有水平分割时(优化流量):

    • PC B 发送广播帧。

    • 交换机 S 从连接 B 的端口收到该帧。

    • 根据水平分割,交换机 S 绝不会再将这个帧从端口 B 发回去。它只泛洪到其他端口(A 和 C)。

    • 这减少了网络上的冗余流量。

在复杂的二层网络(尤其是存在多条路径时),仅仅依靠水平分割不足以防止环路,因此需要 STP 来阻塞冗余路径。

水平分割与 VXLAN

在 VXLAN 环境中,情况变得有些特殊:

  1. 逻辑上的二层网络,物理上的三层网络

    • 在 Overlay 层面,它是一个大的二层广播域。

    • 在 Underlay 层面,它是一个三层 IP 网络。

  2. 水平分割的应用

    • 在 Underlay 中:Underlay 通常运行 OSPF 或 BGP 等链路状态或路径矢量协议。水平分割不用于 OSPF。对于 BGP,则有自己更复杂的环路防止机制(如 AS_PATH)。

    • 在 Overlay 中:VTEP 之间建立了全互联的 VXLAN 隧道。对于一个 VTEP 来说,它从某个 VXLAN 隧道口(这是一个逻辑接口)收到 BUM(广播、未知单播、组播)流量后,不应该再将其从同一个隧道口发回去。这本质上也是一种水平分割思想。

    然而,VXLAN 控制平面(如 EVPN)通过 BGP 分发 MAC/IP 路由信息,其环路防止依赖于 BGP 本身的机制,而不是简单的接口级水平分割。

总结

特性 三层网络(RIP/EIGRP) 二层网络(传统交换) VXLAN Overlay
目的 防止路由环路 防止广播风暴和优化流量 防止在逻辑隧道间形成环路
实现方式 不从接收接口回传路由更新 不从接收端口回泛洪帧 控制平面通过 BGP 规则,数据平面逻辑上不向入隧道回传 BUM 流量
关键点 距离矢量协议的基本特性 STP 的补充 由更复杂的控制平面协议(如 EVPN)保障

简单来说,水平分割是一种“知恩不图报”的智慧:“你告诉我的路,我绝不会再原路指回给你,因为这既没必要,又很危险。”

七.VXLAN VTEP ARP/ND

在 VXLAN 环境中,ARP(IPv4) 和 ND(Neighbor Discovery,IPv6 的等效协议) 的行为与传统二层网络有显著不同。VTEP 在其中扮演着至关重要的角色。


核心问题:广播域的延伸与限制

在传统局域网中,ARP 依靠广播来工作。但在 VXLAN 中:

  • Overlay 是一个巨大的逻辑二层广播域

  • Underlay 是一个三层 IP 网络,默认不转发二层广播。

那么,当一个虚拟机发出一个 ARP 请求(广播帧)时,它如何穿越 Underlay 网络到达另一台主机上的目标虚拟机呢?

VTEP 通过两种主要机制来解决这个问题:


机制一:多播泛洪与学习(传统方式,Flood-and-Learn)

这是 VXLAN 最初定义的基础工作方式。

1. ARP 请求的处理(BUM 流量)

  • 场景:VM1 (192.168.10.10) 想知道 VM2 (192.168.10.20) 的 MAC 地址。

  • 过程

    1. VM1 发出一个广播 ARP 请求:"谁是 192.168.10.20?"

    2. 源 VTEP-1 收到这个广播帧。它识别出这是 BUM(广播、未知单播、组播)流量。

    3. VTEP-1 将这个原始 ARP 请求帧进行 VXLAN 封装。关键点在于:

      • 外层目的 IP 地址:不再是一个单播 IP,而是一个预配置的 Underlay 多播组地址(例如 239.1.1.100)。

      • VNI 被设置在 VXLAN 头中。

    4. 这个多播包在 Underlay 网络中被路由。所有加入了该多播组的 VTEP(即所有属于同一 VXLAN 段的 VTEP)都会收到这个包。

    5. 这些 VTEP(包括 VTEP-2)解封装报文,还原出原始的 ARP 广播帧。

    6. VTEP-2 将这个帧发送给其本地的 VM2。

  • 结果:一次 ARP 请求,通过 Underlay 的多播,被泛洪到了所有相关的 VTEP 和虚拟机。

2. ARP 回复的处理(单播流量)

  • 过程

    1. VM2 收到 ARP 请求,并发送一个单播 ARP 回复:"我是 192.168.10.20,我的 MAC 是 BB:BB:BB:BB:BB:BB"。

    2. VTEP-2 收到这个回复。此时,它已经知道了 VM1 的 MAC 地址(从收到的 ARP 请求中学习到)。

    3. VTEP-2 进行 VXLAN 封装,但这次外层目的 IP 是 VTEP-1 的单播 IP 地址 (10.1.1.100)。

    4. 这个单播包通过 Underlay 网络直接发送给 VTEP-1。

    5. VTEP-1 解封装后,将 ARP 回复交给 VM1。

  • 同时,VTEP 会学习:在这个过程里,VTEP-1 和 VTEP-2 都学习到了 VM1 MAC <-> VTEP-1 IP 和 VM2 MAC <-> VTEP-2 IP 的映射关系,并存入本地表项。

缺点:这种方式会产生大量 BUM 流量,效率较低。


机制二:控制平面学习(现代方式,常与 EVPN 结合)

这是现代数据中心更高效、更常用的方式。它避免了泛洪 ARP 请求

GARP 的用途

  • 核心思想:使用一个控制协议(如 EVPN)在 VTEP 之间同步和分发 MAC 和 IP 的映射关系。

  • 过程

    1. 当 VM2 第一次启动并获得 IP 地址时,它可能会发送一个 GARP(无偿 ARP) 包宣告自己的存在。

    2. VTEP-2 收到这个包,它不仅学习到 VM2 的 MAC 地址,还会通过 EVPN 控制平面 向其他所有 VTEP 发送一条路由信息,内容大致是:"主机 BB:BB:BB:BB:BB:BB (IP 192.168.10.20) 在我这里(VTEP-2 10.1.2.200),属于 VNI 5000"。

    3. VTEP-1 通过控制平面提前学习到了这条信息,并保存在它的 ARP 抑制表 或 代理 ARP 表 中。

    4. 当 VM1 后来发送查询 192.168.10.20 的 ARP 请求时:

      • 请求到达 VTEP-1。

      • VTEP-1 检查本地表项,发现它已经知道答案。

      • VTEP-1 直接代答!它代替 VM2 发送一个 ARP 回复给 VM1:"我是 192.168.10.20,我的 MAC 是 BB:BB:BB:BB:BB:BB"。

      • 这个 ARP 请求永远不会被泛洪到 Underlay 网络。

  • 关键结论

    1. VTEP 是 ARP/ND 的智能网关:在 VXLAN 网络中,VTEP 不再是一个简单的二层交换机。它积极参与到 ARP/ND 过程中,要么负责泛洪,要么直接代理应答。

    2. 目标是减少泛洪:现代 VXLAN 设计的核心趋势是尽可能使用控制平面来分发主机信息,从而最大限度地减少对数据平面泛洪的依赖。这大大提升了网络的效率和可扩展性。

    3. 对虚拟机透明:无论 VTEP 采用哪种机制,对于虚拟机 VM1 和 VM2 来说,它们感知到的仍然是一个普通的二层网络。ARP 请求和回复的过程在它们看来与传统网络毫无二致。

  • GARP 是什么报文?

    GARP 的全称是 Gratuitous ARP,中文常翻译为"无偿 ARP"或"** gratuitous ARP**"。

    核心概念

    GARP 是一个主机主动、未经请求地发送的 ARP 报文,其目的是宣告更新自己的 IP-MAC 映射关系,而不是为了查询某个 IP 对应的 MAC 地址。

    报文特点

    一个典型的 GARP 报文有以下关键特征:

  • 操作类型:仍然是 ARP 请求

  • 源 IP 和 源 MAC:发送方自己的 IP 和 MAC 地址。

  • IP 地址冲突检测

    • 当一台主机配置了一个 IP 地址后,它会发送一个 GARP 来询问:"有没有人的 IP 地址是 X.X.X.X?"

    • 如果收到回应,说明这个 IP 已经被使用,就会报告地址冲突。

  • 主动更新邻居的 ARP 缓存(这是 VXLAN 场景下最重要的用途):

    • 主机通过 GARP 宣告:"大家好!我是 IP 地址 X.X.X.X,我的 MAC 地址是 YY:YY:YY:YY:YY:YY。请更新你们的 ARP 表!"

    • 收到这个广播的所有主机,都会用这个新的信息更新它们自己的 ARP 表。

  • 高可用性(HA)场景

    • 当备用服务器接管了主服务器的服务 IP 时,它会发送 GARP,通知网络上的交换机和其他主机:"这个 IP 现在对应的 MAC 地址是我了!" 从而将流量引导到新的设备。

    • 目标 IP 和 目标 MAC

      • 目标 IP 地址也是发送方自己的 IP 地址(这是与普通 ARP 请求最根本的区别)。

      • 目标 MAC 地址:通常是全零 (00:00:00:00:00:00) 或广播地址 (FF:FF:FF:FF:FF:FF),具体实现可能不同。

    • 发送方式广播,让整个广播域内的所有主机都能听到。

八.Multi-homing - 多宿(您所说的“双规”)

这指的是一个网络(例如用户站点CE)通过多条链路连接到同一个或不同的服务提供商,以实现冗余和负载分担。这正是您描述的“多PE双规”场景。

核心特点:

关注点一个站点 的 入网方式

目的:提供冗余、负载均衡、提高可靠性。

在MPLS VPN中的典型Multi-homing架构:

如图所示,一个CE设备通过两条链路分别连接到两个不同的PE路由器,这就是典型的Multi-homing

    • 场景:一个公司的总部通过两条不同的运营商线路(或者同一运营商的两个不同接入点)接入互联网或MPLS VPN。

DF 选举的设计目标和用武之地。

定义:一台 CE 设备或一个站点,通过多条链路连接到多个 PE 设备。这种连接方式在 EVPN 中称为 Ethernet Segment

text

       [PE1]
         |
    (链路1)  
         |
[CE] - (链路2)   <- 这个逻辑组就是一个 Ethernet Segment (ES)
         |
       [PE2]

问题:当网络中有广播、未知单播或组播流量需要从 VXLAN 网络发往这个 CE 时,应该由 PE1 还是 PE2 来发送?

  • 如果 PE1 和 PE2 都发送,CE 会收到两份完全相同的数据帧,造成重复流量

  • 这不仅是浪费,还可能给终端设备造成问题。

解决方案:DF 选举

  • EVPN 为每个 Ethernet Segment 设计了一个选举机制。

  • 所有连接到同一个 ES 的 PE 之间会通过交换 EVPN 路由(包含 ESI 和 DF 选举社区属性)来进行选举。

  • 选举出的 DF 负责:

    1. 将网络侧的 BUM 流量转发给 CE。

    2. 处理来自 CE 的 ARP 请求并将其广播到 VXLAN 网络中。

  • 非 DF 则在这些方面保持沉默,避免重复流量。

结果:对于一个特定的 ES,在任一时刻,有且只有一个 PE 被选举为 DF

DF 选举的过程简介

选举通常基于以下因素(不同厂商实现可能有细微差别):

  • Ethernet Segment Identifier:选举在每个独立的 ES 内进行。

  • VTEP IP 地址:最常用的算法是取所有候选 PE 的 IP 地址,按一定规则排序,并基于一个 Modulo 运算来选出 DF。

  • 可配置的优先级:允许管理员干预选举结果,指定优先的 PE 作为 DF。

Ethernet Segment Identifier:选举在每个独立的 ES 内进行。

VTEP IP 地址:最常用的算法是取所有候选 PE 的 IP 地址,按一定规则排序,并基于一个 Modulo 运算来选出 DF。

结果:对于一个特定的 ES,在任一时刻,有且只有一个 PE 被选举为 DF

    • 可配置的优先级:允许管理员干预选举结果,指定优先的 PE 作为 DF。

Single-Homing 场景

  • 定义:一台 CE 设备(服务器、交换机)或一个站点,只通过一条链路连接到一个 PE 设备。

    text

    [CE] --- (单条链路) --- [PE]
  • DF 选举情况

    • 不需要选举:因为只有一个 PE,这个 PE 理所当然地就是转发流量的唯一出口和入口。

    • 即使有选举机制运行,结果也是确定的,只有它自己,所以它永远是 DF。

    • 在这个场景下,讨论 DF 选举是多余的。 所有 BUM 流量都由这个唯一的 PE 负责转发给 CE,不存在冲突或重复。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐