要理解VXLAN为什么会出现,必须先回到VLAN这座看似坚固、实则早已顶到天花板的旧房子。虚拟局域网VLAN是网络工程师再熟悉不过的二层隔离手段,它通过在一台物理交换机上划分出若干个逻辑上互相隔离的广播域,让不同部门、不同业务的主机即使插在同一台设备上,也像接在完全不同的交换机上一样彼此不可见。VLAN的标识符VLAN ID承载在IEEE 802.1Q标准的标签字段里,这个字段的长度是十二位。十二位二进制能够表达多少个不同的数值,答案是二的十二次方,也就是四千零九十六个。表面上看四千多个网络似乎不少,但除去零和四千零九十五这两个保留值,实际能够用于业务分配的VLAN ID只有四千零九十四个。
在传统企业园区网络里,四千个VLAN几乎永远用不完,因为一家企业的部门再多、业务再复杂,也很难在同一时刻需要几千个互相隔离的二层域。然而当计算的形态从本地机房向大规模数据中心演进之后,事情发生了根本性的变化。公有云和大型私有云的数据中心里,动辄运行着几十万甚至上百万台服务器,每一台物理服务器上又通过虚拟化技术运行着成百上千台虚拟机,而云平台的一个重要卖点恰恰是租户隔离,也就是不同租户、不同业务系统之间必须做到网络层的彻底隔离。在这种场景下,四千个VLAN ID瞬间就变得捉襟见肘。更为棘手的是,VLAN不仅数量有限,它的设计还天然绑定在物理交换机的二层域之内,一旦虚拟机需要跨越三层网关进行迁移,VLAN这种与物理位置强绑定的隔离方式就会暴露出第二个致命缺陷。
VXLAN的本质,是把"网络的网络"这一层抽象思想落到工程实处。它属于典型的Overlay技术,所谓Overlay就是叠加网络,指的是在已有的物理网络之上,再构建出一层逻辑上的网络。这个被叠加的底层物理网络被称为Underlay,它由真实存在的路由器、交换机、光纤和链路组成,负责提供最基础的三层IP连通能力;而Overlay则是在Underlay这条平坦的高速公路之上,用隧道技术搭建起来的一整套虚拟二层网络。
这种分层思想的妙处在于,Overlay网络彻底摆脱了对Underlay物理拓扑的依赖。二层虚拟网络不再需要物理交换机来承载,而是由散落在网络边缘的隧道端点通过封装和解封装来维持。只要两个端点之间能够通过IP协议互相到达,它们之间就能建立起一条逻辑上的二层隧道,把远在千里之外、甚至跨越整个互联网的两台主机,纳入到同一个虚拟局域网当中。这一思想直接解开了VLAN的两道死结:隔离数量不再受十二位字段的约束,二层域的边界也不再受物理交换机位置的约束。
VXLAN的全称是Virtual eXtensible Local Area Network,中文译作虚拟扩展局域网,它是由互联网工程任务组IETF在二零一四年八月发布的RFC 7348标准所定义的。标准给出的定义可以精炼为一句话:VXLAN是一种通过MAC-in-UDP封装技术,在现有的三层IP网络上叠加出二层虚拟网络的大二层技术。这句话里藏着三个必须拆开的关键词。第一个关键词是MAC-in-UDP,它描述了VXLAN最核心的封装动作,也就是把完整的原始以太网帧当作数据,整体塞进一个UDP报文的载荷里去传输。第二个关键词是三层IP网络之上,它点明了VXLAN赖以生存的基础是成熟的IP路由基础设施,这使它天然能够跨越网络边界、实现远距离的大二层互通。第三个关键词是大二层技术,它概括了VXLAN解决的核心痛点,即把被三层路由割裂开的二层域重新拼接起来,让虚拟机无论漂移到哪里都能保持原有的网络身份。
VXLAN最核心的机制,是把一个完整的以太网帧整个装进UDP报文里,这个过程被形象地称为MAC-in-UDP封装,也有人更通俗地叫它套娃。当一台位于VXLAN隧道内的虚拟机要发送数据时,它发出的是一份完全标准的以太网帧,这份帧带着原始的源MAC地址、目的MAC地址以及内部的IP报文。这个原始的以太网帧抵达VTEP之后,并不会被原封不动地转发,而是被VTEP当作纯粹的载荷数据,在外面再套上一层又一层的头部。
具体的封装结构从外到内依次是:最外层是以太网头,负责在Underlay的物理链路里一跳一跳地传递;往里是外层IP头,源地址是发送方VTEP的IP地址,目的地址是接收方VTEP的IP地址,正是这对地址决定了报文在底层IP网络里的路由走向;再往里是UDP头,VXLAN使用IANA正式分配的UDP端口四千七百八十九作为目的端口,而源端口则由VTEP根据内层帧的内容经过哈希计算生成,这样做的目的是让不同内层流量的外层报文拥有不同的源端口,从而在底层网络启用等价多路径负载均衡时,能够被均匀地分散到不同的物理链路上;再往里才是VXLAN特有的八字节VXLAN头;最里面包裹着的,就是那份原始的以太网帧。
把这些额外头部加起来计算,VXLAN头八字节,UDP头八字节,外层IP头二十字节,外层以太网头十四字节,总计五十字节。这五十字节就是VXLAN封装给原始数据包穿上的一件固定外衣。理解这五十字节的开销至关重要,它直接决定了后面要讨论的MTU问题,也是软考命题中一个隐蔽的计算陷阱。
在VXLAN头的八个字节里,真正承载隔离语义的是三个字节的VNI字段。VNI的全称是VXLAN Network Identifier,即VXLAN网络标识符,它扮演的角色与VLAN ID完全对应,都是用来区分不同逻辑二层网络的编号,只是它的长度被大幅扩展了。VNI占据二十四位,二十四位二进制能够表达二的二十四次方个不同数值,这个数字约等于一千六百七十七万,也就是说VXLAN理论上最多能够支撑超过一千六百万个彼此隔离的逻辑网络。拿它与VLAN的四千零九十六对比,数量级整整跃升了四个数量级,这才是"虚拟扩展局域网"中"扩展"二字的真正含义。
从数据结构的细节上看,VXLAN头的八字节分布是这样的:第一个字节是标志位字段,其中最高位也就是I标志位必须置一,表示这是一个合法的VXLAN帧,其余位保留;紧接着的三个字节就是VNI字段,存放二十四位的网络标识符;再往后的四个字节全部是保留字段,必须填零。这一结构虽然简单,却承载了VXLAN全部的隔离语义,软考命题中经常围绕二十四位这个数字做文章,考察考生是否把VNI的位宽与VLAN ID的十二位混淆。
VTEP是VXLAN架构中最关键的功能实体,它的全称是VXLAN Tunnel Endpoint,即VXLAN隧道端点。每一个VXLAN网络都由分布在各地的VTEP共同编织而成,VTEP负责完成封装与解封装这两件方向相反的工作。当虚拟机发出的原始帧进入VTEP时,VTEP先根据这台虚拟机所属的逻辑网络确定对应的VNI,再根据内层目的MAC地址查找转发表,确定这个目的地址应该送往哪一个远端VTEP,随后把原始帧封装上VXLAN头和外层网络头部,通过Underlay的IP网络发送出去。这个过程叫做封装,发生在流量进入隧道的入口。
在隧道的另一端,远端VTEP收到这个外层报文后,先剥掉外层以太网头、外层IP头和UDP头,再读取VXLAN头里的VNI字段,根据VNI把内层原始帧投递到本地对应的那个虚拟二层网络里,最终送达目的虚拟机。这个过程叫做解封装,发生在流量离开隧道的出口。由此可见,VTEP本质上是一个工作在隧道边界的网关,它既可以是物理交换机上启用的硬件能力,也可以是运行在虚拟化宿主机内核里的虚拟交换机,还可以是软件定义网络控制器下发的软件实体。软考命题经常考察VTEP可以部署在哪类设备上,答案的开放性是考生容易忽略的失分点。
二层网络里除了明确的单播流量之外,还存在三类VXLAN必须妥善处理的特殊流量,它们合称BUM流量,分别指广播、未知单播和组播。广播流量最为直观,比如ARP请求报文向整个广播域内所有主机发送,VXLAN需要把它复制给所有属于同一VNI的远端VTEP。未知单播指的是目的MAC地址尚未被VTEP学习到的单播帧,此时VTEP不知道该送往哪个具体端点,只能退而求其次地泛洪到同VNI的所有VTEP。组播流量则按组播组的成员关系进行复制分发。
由于VTEP之间通过IP网络连接,而IP网络天然支持组播传输,早期的VXLAN实现便借助底层IP组播来承载BUM流量,为每一个VNI映射一个底层组播组,VTEP通过加入相应组播组来接收属于该网络的BUM报文。这种方式的优点是实现简单,缺点是严重依赖底层网络对组播的支持,而很多大规模网络的运维人员恰恰不愿开启组播。为了解决这一矛盾,后来出现了两种替代方案:一种是在VTEP之间手工维护一份远端VTEP清单,用头端复制的单播方式把BUM流量逐一发给每一个远端端点;另一种则是引入EVPN作为控制平面,用BGP协议来精确分发MAC地址和VTEP信息,从根上减少对泛洪的依赖。
按照控制平面实现方式的不同,VXLAN可以划分为两个大的技术流派。第一个流派是数据平面学习,也叫洪泛学习模式,它完全沿用了传统透明网桥自学习的老思路,VTEP完全依靠数据平面收到的报文来学习内层源MAC地址与远端VTEP之间的对应关系,遇到未知目的地址时就泛洪。这种模式的优点是不需要额外的控制平面协议,配置相对简单,适合规模不大、拓扑不复杂的
本篇完!