网络中 MTU 值的由来

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,这简直是噩梦。其实这就像红绿灯,时间要设置合理,交替通行,不然同一个方向如果一直是绿灯,那么另一个方向就要堵成翔了。

小知识:
    Mbps,其全称为 Million bits per second,意为每秒传输百万位(比特)数量的数据
    而这里的 bit(比特,1比特等于1个位)是表示数字信号数据的最小单位。
    1 字节 = 8 比特,所以有 65553 * 8

b>、既然大了不行,那设置小一点可以么?
假设 MTU 值设置为100,那么单个帧传输的时间,在 2Mbps 带宽下需要:
( 100 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 5(ms)
时间上已经能接受了,问题在于,不管 MTU 设置为多少,以太网头帧尾大小是固定的,都是14 + 4,所以在 MTU 为 100 的时候,一个以太网帧的传输效率为:
( 100 - 14 - 4 ) / 100 = 82%
写成公式就是:( T - 14 - 4 ) / T,当T趋于无穷大的时候,效率接近100%,也就是MTU的值越大,传输效率最高,但是基于上一点传输时间的问题,来个折中的选择吧,既然头加尾是18,那就凑个整来个1500,总大小就是1518,传输效率:
1500 / 1518 =  98.8%
100Mbps传输时间:
( 1518 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 = 0.11(ms)
2Mbps传输时间:
( 1518 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 = 5.79(ms)
总体上时间都还能接受。
故,得出 MTU 为 1500字节 这个经验值。
3>、最佳值:
在 Ethernet 中,MTU 为 1500字节;
    在 FDDI 中,MTU 为 4352字节;
    在 IP over ATM 中,MTU 为 9180字节。
    其实一个标准的 以太网 数据帧大小是:1518,头信息有 14 字节,尾部校验和 FCS 占了 4 字节
4>、最小值:
最小值被限制在 64 = *46*(IP包大小) + 14 (以太网头) + 4 (尾部校验和 FCS)
    为什么是 64 呢?
    这个其实和以太网帧在半双工下的碰撞有关。
5>、碎片与特大数据包:
    在以太网中,数据包的大小范围是在 64—1518 字节之间,如果除去头部开销,则实际的数据大小为 46—1500 字节之间。
    一般情况下,数据包的大小都是在这个范围内,如果数据包 小于64 字节,称为 碎片;
    而如果 大于1518 字节,称为 特大数据包。
    这两种类型的数据包都是非正常的以太网数据包,它们将影响网络的正常运行。
    无论是碎片或特大数据包,都会增加网络的负载,导致网络故障的发生。
    所以,我们在对网络进行分析的时候,对数据包大小的判断也是不可缺少的一个环节。
6>、发送小于最小值的包,会出现什么情况呢?
正常接收:

    在用 UDP 局域网通信时,经常发生 “Hello World” 来进行测试,
    但是 “Hello World” 并不满足最小有效数据 (46) 的要求,为什么小于 46 个字节,对方仍然可用收到呢?
    因为在 链路层 的 MAC 子层中会进行数据补齐,不足 46 个字节的用 0 补齐。

收不到数据:
    但当服务器在公网,客户端在内网,发生小于 46 个字节的数据,就会出现接收端 收不到数据的情况。
7>、应用层 TCP/UDP 发送的源数据大小限制
    小知识:
    TCP 包头中,是没有对 数据包总大小 的定义 - 数理论上没有大小限制。
    UDP 包头中,用 两个字节(28=16bits) 来定义 数据包的总大小 -- 2^16 = 65535字节 **即:***64k**
    1、****TCP**** 是以 数据流 形式传输数据,所以使用 send 函数理论上没有大小限制。
    一般数据包太长的话会进行多次拆包传输,数据包短的话会放到下一次数据传输时发送。
    2、UDP 协议发送时,用 sendto 函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。
    用 sendt o函数发送数据时,如果发送数据长度大于该值,则函数会返回错误
    3、UDP 协议分成若干个包发送,会发送整个数据丢失问题
    如果数据小于 65507字节 ,则:按照 MTU 的值进行分包,分成若干个包,然后发送出去;
    而 接收方 IP 层就需要进行数据报的重组。当 IP 层组包发生错误,那么包就会被丢弃。
    接收方无法重组数据报,将导致丢弃整个 IP 数据报。

1、本站资源长期持续更新。
2、本资源基本为原创,部分来源其他付费资源平台或互联网收集,如有侵权请联系及时处理。
3、本站大部分文章的截图来源实验测试环境,请不要在生产环境中随意模仿,以免带来灾难性后果。

转载请保留出处:  www.zh-cjh.com珠海陈坚浩博客 » 网络中 MTU 值的由来

作者: cjh


手机扫一扫,手机上查看此文章:

一切源于价值!

其他 模板文件不存在: ./template/plugins/comment/pc/index.htm

未雨绸缪、居安思危!

数据安全、有备无患!

注意操作、数据无价!

一切源于价值!