TCP 的那些事 | MTU

本文介绍了网络通信中的MTU(最大传输单元)概念,解释了MTU的含义、作用,以及其在以太网帧中的数据最大长度。讨论了MTU的常见数值如1500和46,并探讨了MTU对网络传输效率的影响,以及不同MTU设置可能导致的问题,如分片和路径MTU发现机制。

网络通信中,经常会遇到一个概念MTU,全称是Maximum Transmission Unit(最大传输单元)。那么什么是MTU,MTU的作用是什么,本文从最基本的概念出发,一步步讲起。

MTU是最大传输单元,针对的对象是以太网帧中的数据。MTU的确切意思就是以太网帧中数据的最大长度,注意,是以太帧中有效载荷的最大长度,不包括以太帧帧首尾部的长度。

以太网帧数据格式如下:

以太网帧数据格式

(1)其中的源地址和目的地址是指网卡的硬件地址(也叫MAC 地址),长度是48 位,是在网卡出厂时固化的。

(2)注意网卡芯片收到的数据就是如上所示的一长串数据;其中包括以太网帧头、IP报报头、TCP协议段头、应用层所需数据。

我们会看到网络中各种资料中谈到MTU时,会涉及这么几个数字:1518,1500,64,46等。MTU的范围,有的说是64-1500,有的说是46-1500,对于MTU的最大值是1500的没有什么异议,但是对于MTU的最小值到底是什么,却有不同的意见。

为什么是1500

一个标准的以太网数据帧大小是:1518,头信息有14字节(6字节的目的地址,6字节的源地址,2字节的类型),尾部校验和FCS(帧校验序列)为4字节,所以真正留给上层协议传输数据的大小就是:1518 - 14 - 4 = 1500。

假设MTU值和IP数据包大小一致,一个IP数据包的大小是:65535,那么加上以太网帧头和为,一个以太网帧的大小就是:65535 + 14 + 4 = 65553(64KB),看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组。

那么假设我们现在的带宽是:100Mbps,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光电信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100Mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:  (( 65535 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 ≈ 5 ms。在100M网络下传输一帧需要5ms,传输效率很高,在2M的网络下需要250ms,传输效率很低。

设置小一点可以么?

假设MTU值设置为100,那么单个帧传输的时间,在2Mbps带宽下需要:   ( (100 + 14 + 4)* 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 0.45ms,时间上已经能接受了,但是效率较差。

问题在于,不管MTU设置为多少,以太网头帧尾大小是固定的,都是14 + 4,传输数据的效率公式是:( T ) / (T + 14 + 4),当T趋于无穷大的时候,效率接近100%,也就是MTU的值越大,传输效率最高。MTU太大,通信线路会被阻塞,太小传输效率又差,于是就定了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),总体上时间都还能接受。

那么最小值到底是什么呢,其实是46(64 - 14 - 4)。这个和以太网帧在半双工下的碰撞有关。

以太帧最小是64字节,对应512bit,该512个bit传输的时间,可以完全满足对方探测信道是否存在冲突,同时反馈JAM信号的时间。若发送数据帧的大小小于512bit,那么有可能对方还没有确定是否检测到信道冲突,那么这里数据就已经发送完毕了,从而无法适应CSMA/CD的机制,在这种情况下,我们需要对数据包进行补0,从而填充到512bit。

注意:不同的网络有不同的MTU(可能会大于1500),如果一个数据包从以太网路由到拨号链路上,数据包度大于拨号链路的MTU了,则需要对数据包进行分片。

维基百科上给出的MTU的范围如下:

通过ifconfig可以查看MTU值,例如:

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

不同MTU值会导致一些问题。当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路MTU都大于等于1500。

假设客户端和服务器通过一个路由器连接,客户端的MTU为9000,服务器的MTU为1500,客户端发送一个巨帧给服务器,在经过路由器时,路由器查询到服务器的MTU为1500,那么路由器就会看巨帧的网络层部分是否包含了DF(dont fragment)标志,如果携带了,就抛弃,否则进行分片。如果被丢包,重传多少次都没用,会一直丢,非常影响效率。

通过简单的ping可以实践一下不同MTU的影响。

默认分包:ping www.bing.cn -l 1500

回包:

来自 128.1.70.131 的回复: 字节=1500 时间=203ms TTL=49

强制不分包:ping www.bing.cn -l 1500 -f -n 1

返回:

正在 Ping fw.ename.net [128.1.70.131] 具有 1500 字节的数据:

需要拆分数据包但是设置 DF。

由于实际的网络拓扑很复杂,双方的MTU需要告知,于是就有告知机制:路径MTU发现(PMTUD: Path MTU Discovery ),大致流程如下:

图片来源网络

注意:有些时候会看到网络上有些说TCP层的MTU,有的说IP层的MTU,有的说链路层的MTU,此时的MTU的含义不一样,取值范围也不一致。一般意义上讲的是数据链路层上的MTU,看的时候要明白讲的是具体是哪种MTU。

本次的MTU就介绍到这里,如有错误,还请指正。

扫描二维码,关注“小眼睛的梦呓”公众号,在手机端查看文章
扫描二维码,关注“清远的梦呓”公众号,在手机端查看文章

参考资料

1. 什么是MTU?为什么MTU值普遍都是1500?

2. 有关二层MTU最小为什么是64Byte

3. 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解

4. Maximum transmission unit

5. TCP/IP协议:最大报文段长度(MSS)是如何确定的(2)

6.《Wireshark网络分析的艺术》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值