早期云计算时代,虚拟机爆发增长带来的需求:虚机要能在不同的物理宿主机间无缝迁移。无缝迁移,即现有的 TCP/UDP 连接不能断开,这就要求迁移前后 IP 和 MAC 地址不能改变。
早期的方案是在二层上打补丁,即 VLAN,但是由于协议设计时的局限性,划分数量的上线仅 4096,不再满足持续增长的需求。最终演化出了 VXLAN 技术,即在真实的三层网络上实现一个虚拟的二层网络。
1. 为什么要 MAC 不变?
如果改变,vpc 中其他未迁移机器的 ARP 缓存失效,二层网络断开。
2. 为什么 VXLAN 要有一个 UDP 抽象层
既然必须要在三层上封包,为什么一定要是引入一个额外的 UDP 层?为啥不能搞个新的协议把这 8 个字节的头部也省掉?
2.1. 破坏 ECMP 负载均衡
现代数据中心网络广泛采用 ECMP(Equal-Cost Multi-Path)技术,基于数据包头部的信息进行哈希,从而在多条成本相当的路径中选择一条用于转发。这种技术可以实现内部链路的负载均衡。
对于许多四层连接,尤其是 TCP 来说,ECMP 应当保证一次连接中所有往来报文的转发路径是一致的,否则拥塞控制算法的效果就大打折扣。
通常,ECMP 的哈希算法对象是四层五元组(例如这篇华为的数据中心交换机文档)。而 VXLAN 引入的 UDP 层中,其源端口号也没有实际意义,是随机生成的。这一点与五元组哈希的相性很好,可以充分把转发路径打散、利用数据中心网络的总带宽,不会导致偏压。
而如果引入一个及其精简的协议把 UDP 包头去掉,即使 ECMP 可以正常工作,他也没有端口号这种随机值用来哈希了,这样负载均衡就会失效。
2.2. NAT / 防火墙穿透问题
作为标准协议,现代的 NAT 与防火墙软件广泛识别并允许 UDP 流量。
NAT 通常只能在少数几种标准协议上工作,例如 TCP/UDP/ICMP 。如果使用自定义协议,NAT 很可能不识别而丢弃。
云环境的防火墙也可能由于严格的策略而阻断未知协议号的三层数据包。
2.3. 硬件兼容
上面提到的是现代网络中软件的支持情况。实际上,硬件也可能出现支持问题。交换机、路由器、乃至网卡硬件加速都能正确处理 UDP ,但无法保证对特殊协议的兼容性。
