TCP(三) -- MTU/MSS

1,710 阅读4分钟

一:摘要概述

经过系列文章第二篇TCP(二) -- 三次握手之后,已经清晰TCP建立连接过程。但是最终的的操作还是要落地到数据传输,不管怎么设计每一步都是为数据传输做铺垫与保障。当客户端亦或是服务端需要向对方发送100M数据,会直接一次性发送?如果不是一次性发送那么会对该数据包做什么操作?这些操作的根据又是什么?接下来就需要带着问题一一解答。整个系列文章都是阅读张师傅掘金小册总结,感兴趣朋友可以购买,真的物超所值

在这里插入图片描述

二:以太网限制

网络传输中数据经由应用层 -- 传输层 -- 网络层,最终的落脚点都在链路层。链路层数据的传输将会是以帧为单位进行传输交互,以太网帧格式如下图所示:图中可以看到以太网帧的范围46 - 1500字节,也就是说当传输的数据量超过这个范围的时候将会承受不住。如第一节示例图,好兄弟你得砍它

在这里插入图片描述

三:网络层分片

网络层与链路层直接交互,该层会对完整的数据包进行操作适应链路层取值范围么?接下来跟着看如下实践

// 217服务器ping 74服务器,指定数据包字节数为3000
ping  -s 3000 192.168.15.74

// 217服务器tcpdump抓包存储为MTU.pkt文件供WireShark分析
tcpdump -i any -nn -vv -w /home/MTU.pkt host 192.168.15.74 

解释一下图中红圈位置ping -s会增加8字节的ICMP头,所以传输3000字节内容时会显示为3008

在这里插入图片描述

下图见证奇迹的时刻,查看第一个包详细显示数据包总大小为1500字节,发生了什么???为什么3000的数据包会变成1500,这就是MTU的限制!!!MTU(Maximum Transmission Unit)最大传输单元,当IP协议发现数据包大小超过该数值时就会对数据包进行分片操作,将完整的数据包切割为合适传输的数据包大小

在这里插入图片描述
再深入查看一下分片的信息,上图中红框圈出两个属性:

  • More fragment:表示是否还有更多的分片
  • Fragment offset:表示分片的位移量

看如下第二个数据包就能清晰的印证这一点,你会好奇为什么会是185。实则是这个数据被Wireshark除以8进行的展示,换算过来就是185 * 8 = 1480。上面不是说1500么?为什么会是1480了?因为1500包含了20字节头部大小,真正的数据区域只有1480字节。请查看Data区域大小数值

在这里插入图片描述

四:MTU取值

MTU在每个服务器上都可以有自己的配置,使用如下命令查看:显示正好MTU为1500,与第三节实验对应

netstat -i

在这里插入图片描述
数据传输很多情况下不可能是客户端与服务端的直接交互,中间会经过层层路由转发,那么当中间过程MTU不一致的时候分片的限制又是什么?记住木桶效应,决定权的永远是最短的木板上

在这里插入图片描述

五:MSS限制

正常情况下经过网络层的处理已经可以满足数据传输的要求,但是如果传输层为TCP协议会不会存在问题呢?琢磨一下这个问题:当TCP交给IP协议的数据包被IP协议进行分片操作后某个分片的数据包丢失,那么这时候TCP协议是重新传递丢失的分片数据呢还是整个完整的数据包?仔细琢磨很明显,分片的操作TCP肯定是不允许交给IP协议去完成的,肯定要保持可控性

// MSS(Max Segment Size)限制,最大分段大小
 MSS = MTU - TCP协议头 - IP协议头

综上所述,对于TCP协议而言,当应用层传输数据包超过MSS限制大小之后就会将其进行分段,满足MTU要求后交给网络层,避免IP协议将数据包进行分片。TCP协议会在三次握手的过程中通过options选项字段交互告诉对方自己的MSS

在这里插入图片描述