本文共 1412 字,大约阅读时间需要 4 分钟。
介绍了MTU和MSS的概念及计算方法,并列举两个MTU相关导致丢包的例子。
MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小1. MTU是什么
MTU,Maxitum Transmission Unit 最大传输单元,是某层网络中不分包的情况下可传输的最大单元大小,通俗点理解就是某层网络一包数据负载的最大值。我们说MTU一般都是说链路层的,典型的以太网MTU为1500字节。
2. MTU的大小
根据链路层MTU的大小可以逐层推断出各层协议的最大负载。以Ethernet+IP+TCP为例,典型的协议头大小及负载大小如下图所示:
1) 以太网Ethernet
按照规定,以太网帧大小必需在64-1518Byte之间。 除去以太网帧的帧头14Byte和帧尾4Byte,那么Ethernet可承载的数据最大为1500Byte。这个值我们就把它称之为MTU。 2) IP 以太网MTU为1500Byte,除去IP包头数据20Byte,那么IP包可承载的数据最大为1480Byte。 3) TCP IP层负载最大1480Byte,除去TCP包头数据20Byte,那么TCP包可承载的数据最大为1460Byte(注意:TCP包头数据典型是20Byte,如果加上一些可选项,可达到32Byte,那么TCP包可承载的数据最大值就变为1448Byte)。3. MSS
MSS,Maxitum Segment Size 最大分段大小,是TCP协议里面的一个概念,它的含义跟MTU类似。MSS就是一个TCP包能够传输的最大数据大小,这个大小就是TCP包负载的大小。为了达到最佳的传输效能,在TCP三次握手阶段,双方都会在各自的SYN帧携带各自的MSS值。
4. MSS的大小
MSS这个值在实现的时候往往会用链路层的MTU值减去IP包头大小和TCP包头大小计算得到,所以Ethernet+IP+TCP网络下,MSS的典型值为1460Byte。
5. 丢包
MTU或MSS设置不当会导致数据丢包的情况。
例子1:
如果IP数据包的DF(Donot Fragment)flag被设置,不允许IP分片,并且整个IP包大小为1500字节。如果遇到中间某些路由器的MTU小于1500Byte时,路由器会丢弃这包数据,并且返回一个错误信息给发送者。这样就会造成丢包的情况。不过幸运的是大部分网络链路MTU都是1500或者大于1500Byte。例子2:
如果某天,在原有的协议之上封装了其他协议(如VPN、IPSec等),这样会导致协议层次的增加以及协议开销的增加,结果就是导致TCP层可用的实际负载减少。如果此时还是按照原来MSS的典型值1460Byte进行组包,最终会导致链路层的负载超过MTU 1500Byte的限制。如下图所示:
在原来协议的基础上,增加了LDP和VPN,导致协议头的开销多了8Byte。此时,Ethernet的MTU还是1500Byte,但TCP的实际可用负载会减少为1500-4-4-20-20=1452Byte,如果还是按照旧的MSS 1460Byte来进行分片处理,会导致一个以太网帧达到14+4+4+1500+4=1526Byte,大于以太网帧的最大值1518Byte。这样在传输时,某些路由器就会丢弃这个包,最终导致丢包。
转载地址:http://kkpgi.baihongyu.com/