为何vxlan需要封装在UDP里而不是直接使用IP包封装?

主要用于无障碍穿越NAT/PAT!更详细的分析,请阅读3。

VxLAN 的封装格式:(图片来源于网络)

为何vxlan需要封装在UDP里而不是直接使用IP包封装?_第1张图片

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

你可能感兴趣的:(tcp/ip,网络,网络协议,linux,数据结构)