Think Deep,Work Lean

vxlan讲解

Posted on By zack

前言

一篇华为的文章讲解vxlan

维基关于vxlan的解释

sdn公众号的一篇文章讲解vxlan

什么是vxlan

VxLAN :Visual eXtensible Local Area Network(虚拟扩展局域网)

原始报文在VXLAN接入点(被称为VTEP)加上VXLAN帧头后再被封装在UDP报头中,并使用承载网络的IP/MAC地址作为外层头进行封装,承载网络只需要按照普通的二三层转发流程进行转发即可。

如下图所示,左右两边是 L2 广播域,中间跨越一个 L3 网络,VTEP 是 VxLAN 隧道端点(VxLAN Tunnel Point),当 L2 以太网帧到达 VTEP 的时候,通过 VxLAN 的封装,跨越 L3 层网络完成通信,由于 VxLAN 的封装”屏蔽”了 L3 网络的存在,所以整个过程就像在同一个 L2 广播域中传输一样。

为什么需要 VxLAN?

主要有三点考虑,使得网络虚拟化迫切需要向 VxLAN 转变。

  1. VLAN ID 数量限制

VLAN 被限制为最多 4094 个

具体我们分析下 VLAN 的包格式就知道了。802.1Q 标准定义了 VLAN 协议的以太网帧格式如下:

可以看到,VLAN 帧在以太网帧的基础上增加了 VLAN Tag 字段,该字段包含 TPID、PCP、CFI 和 VID 4 个部分,其中 VID 即表示 VLAN ID,占 12bit,取值范围为 0~4095,其中 0 和 4095 为保留值,不能给用户使用,所以一个以太网最多可以划分为 4094 个 VLAN。这就是 4094 这个值的由来

  1. 更好地利用多条网络链路

VLAN 使用 STP 来管理多条网络链路,避免数据传输时出现的环路。STP 根据优先级和成本,只会选择其中一条链路工作,其余链路作为备用链路,也就是主备模式(active-passive)。这样虽然既避免了环路,也增强了可用性,但没有充分利用多条线路来提升性能,对于用户来说,等于是花 N 倍的钱,却只享受到了 1 倍的服务。

VxLAN 则不然,VxLAN 可以在 L3 层网络上,透明地传输 L2 层数据,这让它可以利用 ECMP (Equal-cost multi-path,等价多路径) 等协议实现多条路径同时工作,也就是 active-active 模式。这样当网络流量较大时,可以实现流量的负载均衡,提升数据传输性能。

路由器—-核心交换机—汇聚交换机—-接入层交换机—电脑
网络设计:核心层、汇聚层、接入层三层
核心层:数据包交换高速数据流量转发 汇聚层:隔离拓扑结构变化、控制路由表大小及网络收敛
接入层:将终端用户接入网络,大量端口

  1. TOR 交换机 MAC 地址表限制

交换机的原理是根据 MAC 地址表完成数据包的二层转发。在虚拟化技术没出现之前,数据中心的 TOR(Top of Rack) 交换机的一个端口连接一台物理主机,并对应一个 MAC 地址,当虚拟化技术出现之后,一台物理主机虚拟出几十甚至上百台虚拟机,TOR 交换机的一个端口虽然还是连接一台物理主机,但却对应多个 MAC 地址(这还在不算 VLAN 划分的情况下),如下图所示:

这无疑会造成 TOR MAC 地址表的膨胀,交换机本身 MAC 表的空间是有限的,如果溢出,就会造成交换机的不断泛洪,增加了处理负担。

如果使用 VxLAN 则不然,VxLAN 使用 VTEP 封装虚拟机的二层帧,在三层网络上传输,通常,一台物理机对应一个 VTEP,一个 VTEP 可以被该台物理机上的所有虚拟机共有,所以,对于 TOR 交换机的 MAC 地址表来说,一台物理机只用记录一条 VTEP 信息即可。这样就避免了 MAC 地址表暴增的问题。

  1. 灵活的虚拟机部署和迁移

采用 VLAN 的虚拟网络环境,不存在 overlay 网络,只有 underlay 网络。也就是说 虚拟机的 VLAN 数据包直接在物理网络上传输,和物理网络上的 VLAN 数据包融合在一起,这样的好处是虚拟机能直接访问到物理网络的设备,但坏处也很明显,虚拟网络无法打破物理网络的界限,具体表现在虚拟机的部署和迁移不太灵活。

  • 部署 :如果要在 VLAN 100 上部署虚拟机,那么只能在支持 VLAN 100 的物理机上部署,如下图所示,假设左右两个区域分属 VLAN 100 和 VLAN 200,现在 VLAN 100 已经部署了很多虚拟机,而 VLAN 200 却才部署了少量的虚拟机,如果这时需要继续往 VLAN 100 部署新的虚拟机,那么也只能选择在左边 域部署,这就会造成左边区域负担过重。
  • 迁移 :同样,如果从左边区域往右边区域迁移虚拟机,因为两边分属于不同的 VLAN,虚机所分配的 IP 地址不同,无法直接进行迁移,这会造成整个集群机器的负载分配不均。

使用 VxLAN 则完全不全在这些问题,通过 VxLAN 的封装,在一个 L3 网络上构建了 L2 网络,或者说基于 underlay 网络的 overlay 网络,虚拟机的数据可以打破 L2 网络的限制,在 L3 网络上传输,虚拟机的部署和迁移也不受物理网络的限制,可以灵活部署和迁移,使得整个数据中心保持一个平均的利用率。

VxLAN 的报文格式

  • 标签协议识别符(Tag Protocol Identifier, TPID): 一组16位的域其数值被设置在0x8100,以用来辨别某个IEEE 802.1Q的帧成为“已被标注的”,而这个域所被标定位置与乙太形式/长度与未标签帧的域相同,这是为了用来区别未标签的帧。

  • 优先权代码点(Priority Code Point, PCP): 以一组3比特的域当作IEEE 802.1p优先权的参考,从0(最低)到7(最高),用来对数据流(音频、影像、文件等等)作传输的优先级。

  • 标准格式指示(Canonical Format Indicator, CFI): 1比特的域。若是这个域的值为1,则MAC地址则为非标准格式;若为0,则为标准格式;在乙太交换器中他通常默认为0。在乙太和令牌环中,CFI用来做为两者的兼容。若帧在乙太端中接收数据则CFI的值须设为1,且这个端口不能与未标签的其他端口桥接。

  • 虚拟局域网识别符(VLAN Identifier, VID): 12位的域,用来具体指出帧是属于哪个特定VLAN。值为0时,表示帧不属于任何一个VLAN;此时,802.1Q标签代表优先权。12位的值0x000和0xFFF为保留值,其他的值都可用来做为共4094个VLAN的识别符。在桥接器上,VLAN1在管理上做为保留值。这个12位的域可分为两个6比特的域以延伸目的(Destination)与源(Source)之48位地址,18位的三重标记(Triple-Tagging)可和原本的48位相加成为66比特的地址。

VxLAN 是一种隧道封装技术,那自然它的报文格式也是一种封装的结构,如下图很好地展现了 VxLAN 的封装报文格式。

首先,最里面是原始的 L2 以太网帧,也就是虚拟机发出的数据帧,接着封装上 VxLAN 的头部,然后整个 VxLAN 帧再封装在物理网络中的 UDP 报文中,接着是 IP 包头,MAC 头。为了和内部的原始以太网帧区别,外部封装的都加上外层 IP 头,外层 MAC 头。

其中,VxLAN 头由 8Bytes 组成,分别是:

  • Flags:占 8bits,具体是 RRRRIRRR,其中 I 必须设置为 1,表示是是一个合法的 VxLAN ID,其它 7bits 的 R 作为保留字段并且设置为 0。
  • VNI(VxLAN Network Identifier):占 24bits,VxLAN 的 ID 标识,这个字段就对比于 12bits 的 VLAN ID,支持 ID 个数扩展为 2^24 = 16777216,约等于 16M 个。
  • Reserved:有两个字段,分别占 24 bits 和 8 bits,作为保留字段并且设置为 0。

对于 UDP 头部,需要注意的是,目的端口(dst port) 默认设置为 4789,这是 IANA 分配的 VxLAN 协议使用端口号。

其余字段都是我们常见的 TCP/IP 协议字段,这里就不再赘述了。

如果嫌以上图示还比较抽象,可以参考下面这幅用 Wireshark 抓包的图,更为直观:

VxLAN 的数据传输

下面通过一个具体的例子来看看基于 VxLAN 的网络结构及数据传输是怎样的。

如下图,是一个基于 VxLAN 的网络结构图:

图中,VTEP 叫做 VxLAN 隧道端点(VxLAN Tunnel Endpoint),是 VxLAN 协议中将对原始数据包进行封装和解封装的设备,它可以由硬件设备实现,也可以由软件实现。

假如图中 VM1 ping VM2,会是怎样一个通信过程:

  1. VM1 不知道 VM2 的 MAC 地址,会发出 ARP 请求。 VM1 所在主机的 VTEP 封装 ARP 请求包,并向网络中其余 VTEP 广播。同时在 MAC 地址表中记录 VM1 的表项。
  2. VM2 所在主机的 VTEP 接收 ARP 请求包,解封装之后将原始包发到 VM2,同时记录 VM1 的 MAC 地址表项。
  3. VM2 发出 ARP 响应,经过 VTEP,再次封装之后,由于之前学习到 VM1 的地址,所以直接单播发给
  4. VM1 所在主机的 VTEP,同时记录 VM2 的 MAC 地址表项。
  5. VM1 所在主机 VTEP 接收 ARP 响应包,解封装之后发给 VM1,同时记录 VM2 的 MAC 地址表项。
  6. VM1 拿到 VM2 的 MAC 地址之后,发出 ICMP 包,这个时候 VTEP 的 MAC 地址表中已经学习到 VM2 的地址,所以直接封装之后,单播发给 VM2 所在主机 VTEP。
  7. VM2 所在主机 VTEP 解封装之后,直接发给 VM2。
  8. VM2 构造 ICMP 的响应包,同样的过程发给 VM1,至此完成整个 ping 的过程。

总结

VxLAN 相比 VLAN 有很多的优势,不过在可预见的未来,还不能完全替代 VLAN,这需要根据使用场景具体分析。VxLAN 的优势更多体现大规模环境下,如果网络设备规模,不论是虚拟的还是物理的,只有百十台的样子,那么直接使用 VLAN 就足够了。另外一个 VxLAN 的封装解封装机制也会影响性能,所以需要综合考虑。

VxLAN 在 Linux、OVS、容器网络等实现中都有非常多的应用,关于这些内容,留作后面具体讲解了。