什么是 VxLAN?

本文首发于个人公众号 Linux云计算网络(id: cloud_dev),专一于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」便可领取,欢迎你们关注,二维码文末能够扫。

VLAN 和 VxLAN 是否是还傻傻分不清楚,这篇文章就来告诉你。html

01 什么是 VxLAN?

VxLAN 全称是 Visual eXtensible Local Area Network(虚拟扩展本地局域网),从名字上就知道,这是一个 VLAN 的扩展协议。编程

VxLAN 本质上是一种隧道封装技术。它使用 TCP/IP 协议栈的惯用手法——封装/解封装技术,将 L2 的以太网帧(Ethernet frames)封装成 L4 的 UDP 数据报(datagrams),而后在 L3 的网络中传输,效果就像 L2 的以太网帧在一个广播域中传输同样,其实是跨越了 L3 网络,但却感知不到 L3 网络的存在。服务器

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

VxLAN 是应网络虚拟化技术而生的。随着数据中心网络不断扩增,Cisco、VMware 和 Arista Networks 这些巨头发现,传统的 VLAN 隔离已经没法应对网络虚拟化技术所带来的成千上万的设备增加,因而便联合起草了这个协议,一直到 2014 年才定稿,由 RFC 7348 所定义。负载均衡

02 为何须要 VxLAN?

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

一、VLAN ID 数量限制性能

虚拟化技术的发展,使得之前以单个物理设备组网的方式,逐步向以虚拟设备的方式过渡。学习

之前一台物理设备(一台服务器也好,一台网络设备也好),能支持几十个端口就已经很了不得了,因此使用 VLAN 是绰绰有余,可是虚拟化环境下就大不一样了,一台物理主机可能虚拟出上百上千台虚拟设备,整个云数据中心可能要划分超过成千上万个的广播域,而 VLAN 被限制为最多 4094 个,这就显得捉襟见肘了。云计算

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

能够看到,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 网络上传输,虚拟机的部署和迁移也不受物理网络的限制,能够灵活部署和迁移,使得整个数据中心保持一个平均的利用率。

03 VxLAN 的报文格式

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 抓包的图,更为直观:

04 VxLAN 的数据传输

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

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

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

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

  1. VM1 不知道 VM2 的 MAC 地址,会发出 ARP 请求。
  2. VM1 所在主机的 VTEP 封装 ARP 请求包,并向网络中其他 VTEP 广播。同时在 MAC 地址表中记录 VM1 的表项。
  3. VM2 所在主机的 VTEP 接收 ARP 请求包,解封装以后将原始包发到 VM2,同时记录 VM1 的 MAC 地址表项。
  4. VM2 发出 ARP 响应,通过 VTEP,再次封装以后,因为以前学习到 VM1 的地址,因此直接单播发给 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 的过程。

05 总结

VxLAN 相比 VLAN 有不少的优点,不过在可预见的将来,还不能彻底替代 VLAN,这须要根据使用场景具体分析。VxLAN 的优点更多体现大规模环境下,若是网络设备规模,不管是虚拟的仍是物理的,只有百十台的样子,那么直接使用 VLAN 就足够了。另一个 VxLAN 的封装解封装机制也会影响性能,因此须要综合考虑。

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

原创不易,若是以为文章不错呢,麻烦动动小指给个在看吧,或者转发分享一下,这将会是对我原创的最大支持!谢谢!


后台回复“<font color=red>加群</font>”,带你进入高手如云交流群

个人公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 便可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎你们关注。

参考:

https://tools.ietf.org/html/r...

http://www.just4coding.com/bl...

https://zhuanlan.zhihu.com/p/...

https://www.openstack.org/ass...

相关文章
相关标签/搜索