最大传输单元(Maximum Transmission Unit,MTU
)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。 MTU是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的。
以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500字节和1492字节。链路层的这个特性称为MTU,即最大传输单元。不同类型网络的数帧长度大多数都有一个上限。
如果IP层有一个数据包要传,而且数据帧的长度比链路层的MTU还大,那么IP层就需要进行分片( fragmentation),即把数据包分成干片,这样每一片就都小于MTU。
当同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要。但是如果两台主机之间的通信要通过多个网络,每个网络的链路层可能有不同的MTU,那么这时重要的不是两台主机所在网络的MTU的值,而是两台主机通信路径中的最小MTU,称为路径MTU( Path MTU,PMTU
)。
上图中,第二个路由器最大支持的MTU为1000,所以服务器要重发数据包,将MTU从1500降到1000.
两台主机之间的PMTU不一定是个常数,它取决于当时所选择的路径,而且路由选择也不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此,PMTU
在两个方向上不一定是一致的。
MTU是网络调节的重要因素,因为包中的额外开销量相当高。高的MTU减少了头信息浪费的字节数。选择MTU时,规则是选择传输中不需分段的最大MTU。
如果要发送的IP数据包比数据链路层的MTU大,则无法发送该数据包。对于来自于上一层的IP协议,当要求发送的IP数据包比数据链路层的MTU大时,必把该数据包分割成多个IP数据包才能发送。另外,在进行通信的各台主机之间,存在着MTU不同的数据链路;在发送的过程中,也有MTU缩小的情况发生。当出现上述情况时,在发送过程中必须有一台能够进行分片处理的路由器。
接收端主机必须对经过分片处理后的IP数据包进行还原处理。
在计算机网络中,巨型帧(英语:jumbo frames),又称大型帧,是指有效负载超过IEEE 802.3标准所限制的1500字节的以太网帧。通常来说,巨型帧可以携带最多9000字节的有效负载,采用巨型帧能够令千兆以太网性能充分发挥,使数据传输效率提高50%~100%。在网络存储的应用环境中,巨型帧更具有非同寻常的意义。
Internet连接不支持超长帧:一个长度超过Internet连接所支持长度的帧将在发送前被分段,从而大大降低了Internet连接的性能和可靠性。
在AWS VPC上默认支持Jumbo Frame
,MTU为9001
但以下场景最大只支持到1500:
IGW、NAT Gateway、VPC Endpoint、VPN
流出VPC Peering
但是Direct Connect
支持Jumbo Frame
对于Transit Gateway
,情况又不一样:
EC2上默认的MTU为9001:
发送大于1500 MTU的包给外网,会提示超出最大MTU:
如果发送9001 MTU以下的包给同一个VPC的EC2,就不会出现这种问题:
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