MTU&MSS

本文中部分内容引用自以下文章列表:
https://blog.csdn.net/passionkk/article/details/100538418
https://blog.csdn.net/wcccg/article/details/79063974
https://bbs.ikuai8.com/thread-64832-1-1.html

1.概念介绍

MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。
MSS:maximum segment size,最大分节大小,也可以叫做最大报文段长度,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。

2.详细说明

2.1 MTU介绍

对于熟悉网络协议分层的伙伴,都知道在7层网络模型中,第二层是数据链路层,MTU就是这一层的概念。MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。
那么MTU究竟有什么用呢?我们先来看下链路层的分片规则:
分片:若一IP数据报大小超过相应链路的MTU的时候,IPV4和IPV6都执行分片(fragmentation),各片段到达目的地前通常不会被重组(re-assembling)。IPV4主机对其产生的数据报执行分片,IPV4路由器对其转发的数据也执行分片。然而IPV6只在数据产生的主机执行分片;IPV6路由器对其转发的数据不执行分片。
举一个最简单的场景,你在家用自己的笔记本上网,用的是路由器,路由器连接电信网络,然后访问了www.baidu.com,从你的笔记本出发的一个以太网数据帧总共经过了以下路径:
笔记本 -> 路由器 -> 电信机房 -> 服务器
其中,每个节点都有一个MTU值,如下:

1500        1500                             1500
笔记本 -> 路由器 -> 电信机房  -> 服务器

假设现在我把笔记本的MTU最大值设置成了1700,然后发送了一个超大的ip数据包(2000),这时候在以外网传输的时候会被拆成2个包,一个1700,一个300,然后加上头信息进行传输。
路由器接收到了一个1700的帧,发现大于自己设置的最大值:1500,如果IP包DF标志位为1,也就是不允许分包,那么路由器直接就把这个包丢弃了,根本就不会到达电信机房,也就到不了服务器了,所以,到这里我们就会发现,MTU其实就是在每一个节点的管控值,只要是大于这个值的数据帧,要么选择分片,要么直接丢弃。

1500的来历

我们先来看下以太网帧结构: 

Preamble (7-bytes) --前导码
Start Frame Delimiter (1-byte) --定界符 
Dest. MAC Address (6-bytes) --目的地址 
Source MAC Address (6-bytes) --源地址 
Length / Type (2-bytes) --长度或帧类型 
Data --数据,n最大为1500,即MTU (0-n bytes) 
Pad --填充字段,p最大为46 (0-p bytes) 
Frame Check Sequence (4-bytes) --帧校验码 

最大长度为:1518字节(byte)。

Length / Type占位2个字节,理论上最大值可以到65535。从结构可以判断:MTU越大,有效数据的占比越高,反之则越小。那么有效数据占比是不是越高越好呢?
我们以最大值来计算,MTU=65535,再加上帧头和帧尾的18个字节,65535+18=65553字节。
因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在早期10Mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:
( 65553 * 8 ) / ( 10 * 1024 * 1024 ) ≈ 0.05(s)
也就是说这50ms其他进程发送不了任何数据。这对于实时性要求高的业务需求简直是噩梦。
最终规范定义的大佬们,将这个值定在了1500,以太网帧最大长度1500+18=1518,这个数据包在10Mbps的带宽中传输的时间:
( 1518 * 8 ) / ( 10 * 1024 * 1024 ) ≈ 0.0012(s)
大概1ms,这个时间还是比较合理的。
**补充说明一下,为什么要有Pad字段:这是因为以太帧有最小长度要求(64字节),当要传输的数据长度不足时,需要填充一些东西使得整个以太帧满足最小长度要求。至于最小值为什么是64字节,有兴趣的同学可以自己查一下,这里不再展开。

PPPOE的MTU

PPPOE下的以太网帧,需要在Length / Type(约定TYPE=0x8864)后增加6字节PPPOE头,以及2字节PPP协议ID号,而以太网的MTU值为1500,所以上层PPP负载数据不能超过1500-6-2=1492字节,也就是相当于在PPPOE环境下的MTU是1492字节。

2.2 MSS介绍

MSS是TCP中的定义,也就是在第四层传输层的概念。
TCP在连接建立的时候,即在发送SYN段的时候,同时会将MSS发送给对方(MSS选项只能出现在SYN段中!!!),告诉对端他期望接收的TCP报文段数据部分最大长度。
这个听上去和MTU有点类似,在平时的工作中,或者面试时,也经常会把这两个混淆,那这两个到底有什么区别,有什么关系吗?
MTU是定义在链路层,上面还要网络层,然后才是传输层,在网络层需要包装IP头(20 Byte),传输层需要包装TCP头(20 Byte),因此,可以很简单的计算出单次传输的最大有效数据长度=MTU-IP头-TCP头,通常情况下就是1500-20-20=1460。
那如果MSS>1460会发生什么呢?这意味着传输一个MSS大小的数据在TCP层没有做分包处理,但到了链路层,发现数据包超过了MTU,必须进行分片处理,这种分片显然是不利的,有额外的开销。为了避免分片开销,MSS通常就定义为1460,如果是PPPOE网络,MSS建议为1452。

你可能感兴趣的:(网络协议,网络协议)