为了更好地了解 VXLAN,让我们首先了解什么是子网划分和 VLAN。

假设我们有一个物理 LAN,其中网络中有多个具有 IP 的主机10.1.2.0/24,每个主机都可以单独使用交换机与其他主机通话,现在,我们要对一组主机进行分组并将它们彼此分开,我们有哪些选择?

IP子网划分

我想到的第一个想法是 IP 子网划分,它可以防止不同子网中的两台主机相互通信,除非我们明确允许它使用路由器。

假设现在我们有两个子网,10.1.2.0/25其中两个范围是10.1.2.1 - 10.1.2.12610.1.2.129 - 10.1.2.254,第一个子网的广播地址是10.1.2.127,第二个子网的广播地址是10.1.2.255

但是,它们仍然具有相同的第 2 层广播域。

如下图,其中即使主机 ( 10.1.2.2) 无法 ping 其他主机(10.1.2.13010.1.2.134),但它可以在其他子网中广播,因为第 2 层的广播域是相同的,并且交换机将广播所有帧与目的地FFFF.FFFF.FFFF到不论层3的源/目标IP的所有端口。

在存在允许两个子网相互通信的路由器的情况下,行为是相同的,因为交换机在第 2 层运行。

VLAN

那么我们如何分割子网的广播域呢?这就是 VLAN 的用武之地,VLAN 可用于分隔广播域。

VLAN 帧由交换机根据它们到达的端口进行标记,VLAN 报头长 4 个字节,位于以太网帧中的类型字段之前,它包含一个 12 位的 VLAN 标识符 (VID),用于标识它所属的帧。

在下面的示例中,主机 ( 10.1.2.3,10.1.2.210.1.2.135) 位于同一 vlan ( vlan1) 中,其余主机属于不同的 vlan。和之前的实验一样,10.1.2.127从主机ping 广播地址 10.1.2.3

请注意,在这种情况下,无论子网如何,数据包只会广播到属于同一 vlan 的主机,主机 ( 10.1.2.35) 将丢弃数据包,因为目的地属于不同的子网,而且我们没有设置默认网关,其他 vlan 中的主机不会收到icmp请求。

12 位标识符将 vlan 的最大数量限制为 4096,但是,随着最近虚拟化环境的涌入,这还不够,而且 VLAN 对大量多租户拓扑不够友好,因此提出了 VXLAN 的建议。

VXLAN

VXLAN 代表虚拟可扩展局域网,它是第 3 层覆盖隧道中的第 2 层,更具体地说,UDP 隧道中的以太网,VXLAN 的思想类似于 VLAN,因为它提供了跨物理网络边界的专用网络的逻辑分离。

继续上面的讨论,假设我们需要能够在逻辑上进一步分离网络,在存在多租户的情况下,我们希望提供第 3 层的逻辑分离,看看下图中的网络拓扑,网络 A 和 B 是由外部网络分隔的同一专用网络的一部分,AP、BQ想在同一个物理网络中使用同一个子网。

首先,为了提供跨物理网络的分离,我们需要一个底层网络,底层网络 (UDP) 的要求是它应该在两个网络之间具有 ip 连接,UDP 端口4789是为 VXLAN 保留的。

其次,为了在同一物理网络内提供分离,我们需要类似于 VLAN 的东西来识别两个逻辑不同但数字相同的 IP 子网,这是使用 VXLAN 标头中的 VNI(VXLAN 网络标识符)的地方,类似于 VLAN 的 VID。

VXLAN 传输看起来像这样:

VXLANHeader:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|R|R|R|I|R|R|R|Reserved|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|VXLANNetworkIdentifier(VNI)|Reserved|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

隧道的端点VTEP(Virtual Tunnel End Point)构成了VXLAN(覆盖网络)的控制平面,它维护内部 (VM) MAC 地址到外部 IP 地址的映射,VTEP 可以通过手动配置、SDN 推送或使用多播(通过多播学习源)了解这些从源 MAC 到目标 IP 地址的映射

下面的数据包显示了从10.0.0.1to发送数据包时的跟踪10.0.0.2

假设已经学习了映射,同时从 A:10.0.0.1到 B:发送数据包10.0.0.2

VTEP 将10.0.0.2在其映射中查找 mac 地址并确定它需要通过192.168.56.12IP。

然后,VTEP 将来自10.0.0.1第 3 层数据包的数据包封装为源 IP192.168.56.11和目标 IP 192.168.56.12

它使用动态源端口(允许负载平衡等)并保留4789作为目标端口。

此外,它还添加了 VNI(下例中为 123)以区分 A 和 P。