基础概念
MTU(Maximum Transmission Unit,最大传输单元)
比喻:快递纸箱的最大尺寸。链路一层(以太网)规定,单个IP数据包,最多能装多少字节。
标准以太网MTU =1500字节。
意思:网卡一次往外发的一个IP包,整个包(IP头部 + IP的数据载荷)不能超过1500字节。超过这个尺寸,底层网络就无法一次性传输,必须分片(IP分片)。IP分片有很多坏处:分片丢一个碎片,整个包作废,开销大,所以TCP尽量避免IP分片。
MSS(Maximum Segment Size,最大分段大小)
比喻:纸箱里面,能放拼图碎片的内容最大长度。
MSS 是TCP的概念:TCP一个分段里,能承载的应用数据最大字节数。
MSS = MTU − IP首部 − TCP首部
标准场景:
以太网MTU=1500
IP头部默认20字节,TCP头部默认20字节
MSS = 1500 - 20 -20 =1460字节
👉 所以TCP把应用数据切成片段,每个片段的业务数据最多1460字节。
TCP分段(拼图碎片)的业务内容控制在1460以内,加上TCP头20、IP头20,整体IP报文刚好1500,卡在MTU上限。不会触发IP分片。
代入拼图例子
MTU=1500:快递箱最大总容量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头+数据),由物理链路(网卡、网线)决定。
- MSS:TCP层的限制,作用对象: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、PPPoE,MTU=1492),MSS就会变成 1492-20-20=1452。PPPoE会额外占用8字节。 - ❌ MTU就是MSS。
✅ MTU是整个IP包上限;MSS是IP包里面TCP能承载的业务数据上限。 - ❌ 超过MSS一定会丢包。
✅ 不是,会触发IP分片。但IP分片代价高,TCP设计上主动规避分片,所以控制分段≤MSS。
一句话总结
MTU是网线能承载单个IP包的最大总大小(以太网1500);MSS是TCP在IP包里能放的业务数据上限,减去IP头、TCP头,得到1460。TCP控制分段不超过1460,目的是避免IP分片,减少丢包重传的风险。