一、MTU 简述 - 分包后数据包最大长度
1、定义
Maximum Transmission Unit(最大可传输单元) 的缩写,它的单位是字节。在 *数据链路层* 定义
一个数据包穿过一个大的网络,它其间会穿过多个网络,每个网络的 MTU 值是不同的。这个网络中最小的 MTU 值,被称为路径 MTU。
假设:我们的接受/发送端都是以太网,它们的 MTU 都是 1500,我们发送的时候,数据包会以 1500 来封装,然而,不幸的是,传输中有一段X.25网,它的 MTU 是 576,这会发生什么呢?
结论是显而易见的,这个数据包会被再次分片,更重要的是,这种情况下,如果 IP 包被设置了“不允许分片标志”,那会发生些什么呢?
对,数据包将被丢弃,然事收到一份ICMP不可达差错,告诉你,需要分片!
很显然,MTU 值设置得过大或过小,都会在一定程度上影响我们上网的速度。
在应用程序中我们用到的 Data 的长度最大是多少,直接取决于底层的限制,即:MTU
以太网(Ethernet)的 数据帧 在链路层 IP包 在网络层 TCP或UDP包 在传输层 TCP或UDP中的数据(Data)在应用层
它们的 关系是 数据帧{IP包{TCP或UDP包{Data}}}
2、网络中 MTU 值的由来:
1>、最大值:
对于 IP 数据包来讲,在 IP 包头中,以 两个字节(16 位)来描述 IP 包的长度,也就是说,一个 IP 包,最长可能是 65535字节(64K)。
那么加上以太网帧头和尾,一个以太网帧的大小就是:65535 + 14 + 4 = 65553
,看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组
但,使用最大值真的可以吗?我们往下看
2>、最佳值的推导:
a>、按最大值来推算:
IP 数据包按最大值 65535字节 来算,假设我们现在的带宽是:100Mbps
,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。
如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100Mbps
的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:
( 65553 * 8 ) / ( 100 * 1024 * 1024 ) ≈ 0.005(s)
在100M网络下传输一帧就需要5ms,也就是说这5ms其他进程发送不了任何数据。如果是早先的电话拨号,网速只有2M的情况下:
( 65553 * 8 ) / ( 2 * 1024 * 1024 ) ≈ 0.100(s)
100ms,这简直是噩梦。其实这就像红绿灯,时间要设置合理,交替通行,不然同一个方向如果一直是绿灯,那么另一个方向就要堵成翔了。
小知识