MTU

最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。 MTU是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的。

以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500字节和1492字节。链路层的这个特性称为MTU,即最大传输单元。不同类型网络的数帧长度大多数都有一个上限。

image-20220912073654785

如果IP层有一个数据包要传,而且数据帧的长度比链路层的MTU还大,那么IP层就需要进行分片( fragmentation),即把数据包分成干片,这样每一片就都小于MTU。

当同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要。但是如果两台主机之间的通信要通过多个网络,每个网络的链路层可能有不同的MTU,那么这时重要的不是两台主机所在网络的MTU的值,而是两台主机通信路径中的最小MTU,称为路径MTU( Path MTU,PMTU)。

image-20220912073152301

上图中,第二个路由器最大支持的MTU为1000,所以服务器要重发数据包,将MTU从1500降到1000.

两台主机之间的PMTU不一定是个常数,它取决于当时所选择的路径,而且路由选择也不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此,PMTU在两个方向上不一定是一致的。

MTU是网络调节的重要因素,因为包中的额外开销量相当高。高的MTU减少了头信息浪费的字节数。选择MTU时,规则是选择传输中不需分段的最大MTU。

IP分片与重组

如果要发送的IP数据包比数据链路层的MTU大,则无法发送该数据包。对于来自于上一层的IP协议,当要求发送的IP数据包比数据链路层的MTU大时,必把该数据包分割成多个IP数据包才能发送。另外,在进行通信的各台主机之间,存在着MTU不同的数据链路;在发送的过程中,也有MTU缩小的情况发生。当出现上述情况时,在发送过程中必须有一台能够进行分片处理的路由器。

接收端主机必须对经过分片处理后的IP数据包进行还原处理。

Jumbo Frames

在计算机网络中,巨型帧(英语:jumbo frames),又称大型帧,是指有效负载超过IEEE 802.3标准所限制的1500字节的以太网帧。通常来说,巨型帧可以携带最多9000字节的有效负载,采用巨型帧能够令千兆以太网性能充分发挥,使数据传输效率提高50%~100%。在网络存储的应用环境中,巨型帧更具有非同寻常的意义。

Internet连接不支持超长帧:一个长度超过Internet连接所支持长度的帧将在发送前被分段,从而大大降低了Internet连接的性能和可靠性。

image-20220912073108861

AWS上的Jumbo Frame

在AWS VPC上默认支持Jumbo Frame,MTU为9001

但以下场景最大只支持到1500:

  • 流量从IGW、NAT Gateway、VPC Endpoint、VPN流出
  • 跨region的VPC Peering

但是Direct Connect支持Jumbo Frame


对于Transit Gateway,情况又不一样:

  • 如果流量是在VPC或DX之间,则支持8500 MTU
  • 如果经过VPN,则只支持到1500

MTU测试

EC2上默认的MTU为9001:

image-20191216165016546

发送大于1500 MTU的包给外网,会提示超出最大MTU:

image-20191216165115543

如果发送9001 MTU以下的包给同一个VPC的EC2,就不会出现这种问题:

image-20191216165156828

tracepath命令用于检测EC2和其他主机之间的path MTU

[ec2-user ~]$ tracepath amazon.com
 1?: [LOCALHOST]     pmtu 9001
 1:  ip-172-31-16-1.us-west-1.compute.internal (172.31.16.1)   0.187ms pmtu 1500
 1:  no reply
 2:  no reply
 3:  no reply
 4:  100.64.16.241 (100.64.16.241)                          0.574ms
 5:  72.21.222.221 (72.21.222.221)                         84.447ms asymm 21
 6:  205.251.229.97 (205.251.229.97)                       79.970ms asymm 19
 7:  72.21.222.194 (72.21.222.194)                         96.546ms asymm 16
 8:  72.21.222.239 (72.21.222.239)                         79.244ms asymm 15
 9:  205.251.225.73 (205.251.225.73)                       91.867ms asymm 16
...
31:  no reply
     Too many hops: pmtu 1500
     Resume: pmtu 1500

设置网卡的MTU:

sudo ip link set dev eth0 mtu 9001