一、VXLAN的概念
VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,采用L2 over L4(MAC-in-UDP)的报文封装模式,将二层报文用三层协议进行封装,可实现二层网络在三层范围内进行扩展,同时满足数据中心大二层虚拟迁移和多租户的需求。
补充: NVO3是基于三层IP overlay网络构建虚拟网络的技术的统称,VXLAN只是NVO3技术之一。除此之外,比较有代表性的还有NVGRE、STT。
二、VXLAN的网络模型
VXLAN网络中出现了以下传统数据中心网络中没有的新元素:
- VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点)
VTEP: VXLAN网络的边缘设备,是VXLAN隧道的起点和终点,VXLAN报文的相关处理均在这上面进行,是VXLAN网络中绝对的主角。VTEP既可以是物理的网络设备(例如物理交换机),也可以是虚拟机所在的服务器。
- VNI(VXLAN Network Identifier,VXLAN 网络标识符)
VNI: 由于以太网数据帧中VLAN只占了**12比特(4096)的空间,这使得VLAN的隔离能力在数据中心网络中力不从心。而VNI的出现,就是专门解决这个问题的。VNI是一种类似于VLAN ID的用户标示,但是占据24比特(1677 7216)**的空间。一个VNI代表了一个租户,属于不同VNI的虚拟机之间不能直接进行二层通信。VXLAN报文封装时,给VNI分配了足够的空间使其可以支持海量租户的隔离。
- VXLAN隧道
“隧道”是一个逻辑上的概念,并不新鲜,比如大家熟悉的GRE。说白了就是将原始报文“变身”下,加以“包装”,好让它可以在承载网络(比如IP网络)上传输。从主机的角度看,就好像原始报文的起点和终点之间,有一条直通的链路一样。而这个看起来直通的链路,就是“隧道”。顾名思义,“VXLAN隧道”便是用来传输经过VXLAN封装的报文的,它是建立在两个VTEP之间的一条虚拟通道。
通过上述网络模型,VXLAN是如何解决《传统“二层+三层”数据中心网络面临的挑战》的呢?答案如下:
- 虚拟机规模受网络设备表项规格的限制 —>“隐形”
对于“虚拟机规模受网络设备表项规格的限制”这个问题,可以通过换成规格大一些的接入交换机(比如跟核心或网关同档次的设备)就可以。但是这种方案网络建设成本太大。在不提高网络建设成本的前提下,如何能解决问题呢?
既然无法提升设备表项规格,那就只能限制设备上的MAC表项,将大量VM的MAC地址“隐形”。那么,如何做到隐形呢?VXLAN通过VTEP实现。
VTEP会将VM发出的原始报文封装成一个新的UDP报文,并使用物理网络的IP和MAC地址作为外层头,对网络中的其他设备只表现为封装后的参数。也就是说,网络中的其他设备看不到VM发送的原始报文。
如果服务器作为VTEP,那从服务器发送到接入设备的报文便是经过封装后的报文,这样,接入设备就不需要学习VM的MAC地址了,它只需要根据外层封装的报文头负责基本的三层转发就可以了。因此,虚拟机规模就不会受网络设备表项规格的限制了。
当然,如果网络设备作为VTEP,它还是需要学习VM的MAC地址。但是,从对报文进行封装的角度来说,网络设备的性能还是要比服务器强很多。
- 传统网络的隔离能力有限 —>“扩容”
对于“传统网络的隔离能力有限”这个问题,VXLAN采用了“扩容”的解决方法,引入了类似VLAN ID的用户标示,也就是VNI。一个VNI代表了一个租户,属于不同VNI的虚拟机之间不能直接进行二层通信。VTEP在对报文进行VXLAN封装时,给VNI分配了24比特的空间,这就意味着VXLAN网络理论上支持多达1677 7216的租户隔离。相比VLAN,VNI的隔离能力得到了巨大的提升,有效得解决了云计算中海量租户隔离的问题。
- 虚拟机迁移范围受限 —“暗度陈仓”>
传统“二层+三层”数据中心网络中,为了保证业务不中断,VM的迁移就必须发生在同一个二层域内。但是在VXLAN网络模型中,有了VTEP的封装机制和VXLAN隧道后,所谓的 “二层域”就可以轻而易举的突破物理上的界限。也就是说,在IP网络中, “明”里传输的是跨越三层网络的UDP报文,“暗”里却已经悄悄将源VM的原始报文送达目的VM。就好像在三层的网络之上,构建出了一个虚拟的二层网络,而且只要IP网络路由可达,这个虚拟的二层网络想做多大就做多大。所以说VXLAN是一种NVO3技术。
三、VXLAN的报文格式
VTEP对VM发送的原始以太帧(Original L2 Frame)进行了以下“包装”:
- VXLAN Header
增加VXLAN头(8字节),其中包含24比特的VNI字段,用来定义VXLAN网络中不同的租户。此外,还包含VXLAN Flags(8比特,取值为00001000)和两个保留字段(分别为24比特和8比特)。
- UDP Header
VXLAN头和原始以太帧一起作为UDP的数据。UDP头中,目的端口号(VXLAN Port)固定为4789,源端口号(UDP Src. Port)是原始以太帧通过哈希算法计算后的值。
- Outer IP Header
封装外层IP头。其中,源IP地址(Outer Src. IP)为源VM所属VTEP的IP地址,目的IP地址(Outer Dst. IP)为目的VM所属VTEP的IP地址。
- Outer MAC Header
封装外层以太头。其中,源MAC地址(Src. MAC Addr.)为源VM所属VTEP的MAC地址,目的MAC地址(Dst. MAC Addr.)为到达目的VTEP的路径上下一跳设备的MAC地址。
希望通过本文,大家能够对VXLAN有一个初步的了解。