然后把我找到的信息分享一下给大家吧,原文链接:https://blog.csdn.net/meihualing/article/details/113739693
什么是 MSS , MSS 的动机是什么
MSS(Maximum Segment Size,最大报文长度),是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
我们都知道,如果TCP/UDP往IP层发送数据时,因为物理网络层一般要限制每次发送数据帧的最大长度。所以IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。
IP把MTU与数据报长度进行比较,如果太长了一次发送不下(超过MTU)则需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
UDP无法避免分片(除非应用层知道路径MTU并控制UDP报文大小),TCP则通过MSS协商来避免分片发生。
MSS 的大小与 MTU 有关, 为:
MTU - (TCP 标头 + IP 标头) = MSS
假设 MTU= 1500 byte,那么 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果应用层有 2000 byte 发送,那么需要两个切片才可以完成发送,第一个 TCP 切片 = 1460,第二个 TCP 切片 = 540。
所以我尝试了将 TCP-MSS 由1500间隔4递减来测试服务是否正常,直到设置为1452,应用服务都恢复了,而我的MTU参照运营商的参数,设置为1492,按照上面的计算公式:
1492 (MTU) - 20 (TCP标头) - 20 (IP标头) = 1452 (MSS),
是符合公式计算结果,也与实际的应用测试结果相一致,当然,只要 MSS 小于等于 1452(参照MTU的设置),且满足是4的整数倍,应用都能正常发送数据包,因此设置为1400也是可以的。
但还是留下一个疑问,为什么 3.5.X 版本以及更早的版本,在MSS一直设置为1500的时候没有受到影响呢,这一点估计要等 iKuai 官方的查证及回复了。
|