前言
什么是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 转变。
- 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 这个值的由来
- 更好地利用多条网络链路
VLAN 使用 STP 来管理多条网络链路,避免数据传输时出现的环路。STP 根据优先级和成本,只会选择其中一条链路工作,其余链路作为备用链路,也就是主备模式(active-passive)。这样虽然既避免了环路,也增强了可用性,但没有充分利用多条线路来提升性能,对于用户来说,等于是花 N 倍的钱,却只享受到了 1 倍的服务。
VxLAN 则不然,VxLAN 可以在 L3 层网络上,透明地传输 L2 层数据,这让它可以利用 ECMP (Equal-cost multi-path,等价多路径) 等协议实现多条路径同时工作,也就是 active-active 模式。这样当网络流量较大时,可以实现流量的负载均衡,提升数据传输性能。
路由器—-核心交换机—汇聚交换机—-接入层交换机—电脑
网络设计:核心层、汇聚层、接入层三层
核心层:数据包交换高速数据流量转发 汇聚层:隔离拓扑结构变化、控制路由表大小及网络收敛
接入层:将终端用户接入网络,大量端口
- TOR 交换机 MAC 地址表限制
交换机的原理是根据 MAC 地址表完成数据包的二层转发。在虚拟化技术没出现之前,数据中心的 TOR(Top of Rack) 交换机的一个端口连接一台物理主机,并对应一个 MAC 地址,当虚拟化技术出现之后,一台物理主机虚拟出几十甚至上百台虚拟机,TOR 交换机的一个端口虽然还是连接一台物理主机,但却对应多个 MAC 地址(这还在不算 VLAN 划分的情况下),如下图所示:
这无疑会造成 TOR MAC 地址表的膨胀,交换机本身 MAC 表的空间是有限的,如果溢出,就会造成交换机的不断泛洪,增加了处理负担。
如果使用 VxLAN 则不然,VxLAN 使用 VTEP 封装虚拟机的二层帧,在三层网络上传输,通常,一台物理机对应一个 VTEP,一个 VTEP 可以被该台物理机上的所有虚拟机共有,所以,对于 TOR 交换机的 MAC 地址表来说,一台物理机只用记录一条 VTEP 信息即可。这样就避免了 MAC 地址表暴增的问题。
- 灵活的虚拟机部署和迁移
采用 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,会是怎样一个通信过程:
- VM1 不知道 VM2 的 MAC 地址,会发出 ARP 请求。 VM1 所在主机的 VTEP 封装 ARP 请求包,并向网络中其余 VTEP 广播。同时在 MAC 地址表中记录 VM1 的表项。
- VM2 所在主机的 VTEP 接收 ARP 请求包,解封装之后将原始包发到 VM2,同时记录 VM1 的 MAC 地址表项。
- VM2 发出 ARP 响应,经过 VTEP,再次封装之后,由于之前学习到 VM1 的地址,所以直接单播发给
- VM1 所在主机的 VTEP,同时记录 VM2 的 MAC 地址表项。
- VM1 所在主机 VTEP 接收 ARP 响应包,解封装之后发给 VM1,同时记录 VM2 的 MAC 地址表项。
- VM1 拿到 VM2 的 MAC 地址之后,发出 ICMP 包,这个时候 VTEP 的 MAC 地址表中已经学习到 VM2 的地址,所以直接封装之后,单播发给 VM2 所在主机 VTEP。
- VM2 所在主机 VTEP 解封装之后,直接发给 VM2。
- VM2 构造 ICMP 的响应包,同样的过程发给 VM1,至此完成整个 ping 的过程。
总结
VxLAN 相比 VLAN 有很多的优势,不过在可预见的未来,还不能完全替代 VLAN,这需要根据使用场景具体分析。VxLAN 的优势更多体现大规模环境下,如果网络设备规模,不论是虚拟的还是物理的,只有百十台的样子,那么直接使用 VLAN 就足够了。另外一个 VxLAN 的封装解封装机制也会影响性能,所以需要综合考虑。
VxLAN 在 Linux、OVS、容器网络等实现中都有非常多的应用,关于这些内容,留作后面具体讲解了。