在云计算的服务里,我们需要在物理的二层网络或者三层网络里虚拟化出二层网络供租户使用,这个虚拟的二层网络叫做子网,由多个子网组成了一个 VPC。
问题
-
划分出这个虚拟子网一种方案是 VLAN,VLAN 通过一个12-bit的 VLAN ID 来对应一个子网,配置在数据链路层,它相当于把一个大的二层网络切分成许多小的逻辑二层网络,每个VLAN ID配置和管理着一组VM MAC地址,在数据链路层实现不同的广播域,从而到达隔离和划分的目的。正因为这只有12-bit,就只能虚拟出4094个VLAN,在公有云场景下显然是不够的
-
用户需要在不同的二层网路里相互通讯,而不同的VLAN之间通讯要通过第三层完成。
-
二层网络之间的通讯都是 MAC 寻址,在 Overlay 网络里,VM 的数量会增多,带来 ARP flood 广播问题。
VXLAN
VXLAN全称是Virtual eXtensible Local Area Network,设计的目的就是要满足构建在二层或者三层物理网络下的虚拟 Overlay 网络,设计思路由VLAN所启发,比 VLAN 高级,在第网络层协议上,使用 UDP 承载,使用 8 byte 的 VXLAN Header,其中 24bit 用作 VNI,VNI 跟 VLAN ID 作用一样,用于分组,这里的 24bit 解决了问题1。
而基于UDP协议的封装数据包可自由穿梭于二层和三层,解决了问题2。
VXLAN 用于对数据包进行封包和拆包的接口叫 VTEP,可以部署在 Host 或 Switch 上,软硬件实现都可以,同 VLAN 一样,管理着虚拟网络和物理网络的映射关系表,比如 VNI 和 MAC 地址的映射表、VNI和多播组的映射表,VNI 和 VTEP 地址的映射表等,VTEP间如何高效同步这些映射表是 VXLAN 的难点,下面先看看 VXLAN 中 VM 间是如何通信的。
1,vm1 to vm2,知道对端 MAC 地址通信
当一个vm1加入到一个VXLAN的network后,并不需要知道是否在VXLAN里,对于客户机来讲是透明的,vm1只要发送包含目的地址为vm2的MAC地址IP数据包,vm1所在的物理机VTEP1收到这个包,就会根据目的MAC地址查询VNI<->MAC表,如果找到对应的VNI的物理地址,并进行UDP打包,包上目标VTEP2的MAC地址、IP地址、目的VNI、目的vm2的MAC地址、源vm1的MAC地址等等发给VTEP2,VTEP2收到后进行确认和拆包,发送到vm2,并在这个过程中学习到vm1的MAC地址、VTEP1的地址,VNI等,当vm2进行回包的时候,同样的过程返回给vm1,这样整个vm到vm的通信就完成了。这个过程需要知道很多信息,比如 VTEP2 的 MAC、IP 地址、VM2 的 MAC、IP 地址。
2,vm1 to vm2 不知道MAC地址
当vm1不知道vm2的MAC地址进行IP地址通信的时候,同传统网络一样,会先判断是否为子网地址,然后进行ARP广播来获取目的MAC地址,这个ARP广播包会广播给所有二层的机器,在虚拟化vm的世界里,每个vm过段时间都进行ARP广播来保持对方的感知,ARP广播就会非常多,造成广播风暴,大量的广播包对网卡是一种负担和浪费,在云场景下,VM 数量增多导致广播包的暴增。
VXLAN则用了多播的形式(也可以通过头端复制的技术来发送单播包)来发送ARP广播请求,并维护着一个VNI到多播组地址的映射表,并在这个过程中进行学习,建立缺失的映射记录,这种学习非常重要,它主要解决往后的ARP Flood的问题,让在vm下次进行ARP广播的时候具备直接消化ARP请求的能力,解决问题3。
一个VXLAN典型的部署如下:
可以看到,VXLAN的分组的思想同VLAN很相似,但VLAN在SDN网络里不够灵活,在云场景下,Host 拥有更大的控制能力,这种控制能力能改变现有的网络实现方式。