主要用于无障碍穿越NAT/PAT!更详细的分析,请阅读3。
VxLAN 的封装格式:(图片来源于网络)
1 IP in IP
这种tunnel就是题主所说的用IP封装VxLAN,这种tunnel仅仅依靠外层的IP头很难穿越NAT/PAT设备。
如果使用IP封装,VxLAN 协议头需要提供字段支持NAT,即使这样,还需要VxLAN端点之间路径上的NAT设备升级软件,这是吃力不讨好的方案。
2 GRE
在UDP tunnel 流行之前,GRE是最通用的封装方式,比如PPTP就是采用GRE来封装用户数据,GRE有两种格式:
2.1 标准格式 (Standard)
GRE头一共4个字节,4个字节里也没有哪个字段适合做NAT,所以不便于做NAT穿越。
2.2 高级格式 ( Enhanced)
GRE头一共8个字节,8个字节里有一个字段:Key/VRF,适合做NAT,所以使用的更多,更通用!
但有的NAT设备只支持UDP/TCP/ICMP,并不一定支持Enhanced GRE,所以有时也会造成通信障碍。
3 UDP
细心的读者会发现,UDP tunnel 越来越流行了,基于几点特质:
3.1 无障碍穿越任何NAT设备
无论高端的商用路由器、还是家用路由器,都支持,所以无需额外的配置就可以工作,省时省心。
3.2 UDP是无状态的
大家很少见到TCP tunnel吧?也是有的,比如Cisco Anyconnect Full Tunnel mode,使用TCP + TLS安全封装,可以将用户的所有IP包封装在外层的安全传输层;由于建立tunnel 之前需要建立连接,然后再建立tunnel,发送数据的初始延迟就会稍大。外层的TCP是有状态的,内层负载如果也是有状态的,双状态机不利于排错、debug。
L2TP、VxLAN、IKEv2 IP Security都是采用UDP封装。
3.3 IP Protocol 数量有限
一个字节,理论上可以提供255种协议复用,空间受限。
而采用UDP封装,端口号2个字节,理论上可以提供65535种协议复用,空间更游刃有余。
3.4 UDP天然支持组播的特性
终端用户的广播(如ARP广播),以及用户的组播,需要VxLAN传输,有两种方式:
3.4.1 组播传输
需要运营商提供组播支持,需要将用户的广播、组播,全部映射为VxLAN组播,而支持组播最天然的协议就是UDP。
3.4.2 单播复制多份传输
如果运营商不支持用户组播,则需要头端设备将用户的广播、组播,复制为多份进行单播传输,无状态的UDP协议也是一个合适候选者。
学习地址:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家
--------更新------
看到另外两位同学的答案,UDP端口提供了更灵活的负载均衡的潜能,观点正确,算是使用UDP封装的一个原因,在这里我给大家分析一下。
大家看上文的图片里的Outer UDP Header,VxLAN协议规范指出:Destination Port使用固定端口号(协议端口),Source Port可以使用固定端口号,也可以使用随机端口号:
固定源端口号的负载均衡
Hash ( Source IP, Destination IP, Source Port,Destimation Port )
由于源、目的端口号都为固定,其Hash值与单纯使用IP进行HASH没有本质区别,即在负载均衡眼里,这是同一个session,会选择同一条物理路径。
Hash ( Source IP, Destination IP)
所以如果使用固定源端口号,起不到负载均衡的效果,和采用IP封装没有任何区别。
随机源端口号的负载均衡
由于源端口号基于内层以太网头的HASH,不同的Source MAC/ Destination MAC对应不同的业务,会将不同的业务映射到不同的ECMP(Equal Cost Multiple Path )的物理路径上。
所以使用同一个VTEP,不同的业务使用不同的源端口号,可以起到负载均衡的效果,而这是使用IP封装所不能实现的目标。
原文链接:https://www.zhihu.com/question/54841860/answer/141356897