基础概念MTUMaximum Transmission Unit最大传输单元比喻快递纸箱的最大尺寸。链路一层以太网规定单个IP数据包最多能装多少字节。标准以太网MTU 1500字节。意思网卡一次往外发的一个IP包整个包IP头部 IP的数据载荷不能超过1500字节。超过这个尺寸底层网络就无法一次性传输必须分片IP分片。IP分片有很多坏处分片丢一个碎片整个包作废开销大所以TCP尽量避免IP分片。MSSMaximum Segment Size最大分段大小比喻纸箱里面能放拼图碎片的内容最大长度。MSS 是TCP的概念TCP一个分段里能承载的应用数据最大字节数。MSS MTU − IP首部 − TCP首部标准场景以太网MTU1500IP头部默认20字节TCP头部默认20字节MSS 1500 - 20 -20 1460字节 所以TCP把应用数据切成片段每个片段的业务数据最多1460字节。TCP分段拼图碎片的业务内容控制在1460以内加上TCP头20、IP头20整体IP报文刚好1500卡在MTU上限。不会触发IP分片。代入拼图例子MTU1500快递箱最大总容量1500格。箱子本身IP头占20格包裹里面的小密封袋TCP头占20格。剩下能放拼图碎片你的业务数据比如SQL语句只有1460格。TCP会主动切割你的字节流每一块拼图碎片不超过1460字节刚好完整塞进这个快递箱。如果TCP不分直接传1600字节的业务数据TCP数据1600 TCP头20 IP头20 1640 1500。IP层就要把这个大包切成两个IP分片。一旦其中一片丢了整个数据全部重传性能变差。MTU 和 MSS 的核心区别MTU二层/IP层的限制作用对象整个IP数据包IP头数据由物理链路网卡、网线决定。MSSTCP层的限制作用对象TCP的应用载荷纯业务字节不含TCP头。MSS在TCP三次握手的时候双方互相协商告知。三次握手SYN包里面双方会带上自己支持的MSS两端取较小值作为后续分段上限。结合PHP访问MySQL场景PHP发送SQL字符串交给操作系统TCP协议栈。TCP自动把SQL字节流切割每一段业务数据最多1460字节。每一段加上TCP头部20字节交给IP层IP再加20字节IP头组成1500字节IP包通过以太网发送出去。MySQL那边收到包拆掉IP头、TCP头把1460字节的业务片段拿出来再按序列号拼接完整SQL。面试常问误区澄清❌ 1460是固定死的。✅ 不是。MSS是协商出来的。如果链路MTU变小比如VPN、PPPoEMTU1492MSS就会变成 1492-20-201452。PPPoE会额外占用8字节。❌ MTU就是MSS。✅ MTU是整个IP包上限MSS是IP包里面TCP能承载的业务数据上限。❌ 超过MSS一定会丢包。✅ 不是会触发IP分片。但IP分片代价高TCP设计上主动规避分片所以控制分段≤MSS。一句话总结MTU是网线能承载单个IP包的最大总大小以太网1500MSS是TCP在IP包里能放的业务数据上限减去IP头、TCP头得到1460。TCP控制分段不超过1460目的是避免IP分片减少丢包重传的风险。
阅读完成 · 觉得有帮助?