MSS 到底是什么?Wireshark 分析TCP过程
文章目录
一、MSS 是什么
二、MSS 的作用
三、MSS 是怎么协商的(TCP 三次握手)
四、常见的 MSS 值有哪些
五、MSS 相关的网络问题
一、MSS 是什么
MSS = Maximum Segment Size(最大报文段长度)
它表示:TCP 协议一次能传输的最大“纯数据”大小(不包括 TCP 和 IP 头部)。
想象你要寄一个包裹(TCP 报文):
快递公司规定:整个包裹不能超过 1500 字节 ,即MTU(Maximum Transmission Unit)
包裹的外包装(IP 头 + TCP 头)要占 40 字节,那最多能装1460 字节`。
这个 1460就是 MSS。所以:MTU = 整个包裹的最大重量
MSS = 你能装的“货物”最大重量
MSS = MTU - IP头 - TCP头
MSS 只包含 TCP 数据部分,不包括 TCP 头和 IP 头,常见以太网 MTU = 1500 字节,
IP 头(20字节) + TCP 头(20字节) = 40 字节,所以常见 MSS = 460 字节。
二、MSS 的作用
MSS 的核心作用是:
1. 避免 IP 层分片(Fragmentation)
如果没有 MSS 会怎样?
假设 TCP 不知道 MTU 限制,一次性发了 2000 字节的数据:
IP 层发现超过 1500 字节,就会把数据包“切片”成多个小包
分片后,任何一个碎片丢失,整个数据包就得重传,网络效率下降,延迟增加,甚至导致连接失败
有了 MSS 后:
TCP 在连接开始时就协商好“我每次最多发 1460 字节”
数据包不会超过 MTU,不需要分片
传输更高效、更稳定
三、MSS 是怎么协商的(TCP 三次握手)
MSS 是在 TCP 三次握手的前两次中通过 TCP Option字段告诉对方的。
1. 客户端 → 服务端:发送 `SYN` 报文,携带:
[TCP Options] Maximum Segment Size: 4034
2. 服务端 → 客户端:回复 `SYN-ACK` 报文,携带:
[TCP Options] Maximum Segment Size: 1460
3. 双方取较小值** 作为实际使用的 MSS(比如 1460),开始传输数据
注意:MSS 是双向协商的,客户端和服务端可以不同,协商以最小者为准。
附:三次握手建立过程:
1. 客户端发送SYN:
字段 | 含义 |
---|---|
[SYN] | 标志位:表示这是连接请求 |
Seq=0 | 初始序列号(随机生成,不是真为0) |
Win=64544 | 接收窗口大小,表示能缓存多少数据 |
MSS=4034 | 最大报文段长度,表示一次最多传 1460 字节数据 |
SACK_PERM | 支持选择性确认,提升重传效率 |
2. 服务端回应SYN-ACK:
字段 | 含义 |
---|---|
[SYN, ACK] | 两个标志位都置1,表示“收到你的请求,我也同意连接” |
Seq=0 | 服务端生成自己的初始序列号 |
Ack=1 | 确认客户端的 Seq=0 ,期望下次收到 Seq=1 的包 |
Win=28960 | 服务端的接收窗口 |
MSS=1460 | 服务端支持的最大数据段(比客户端小) |
3. 客户端发送ACK:
字段 | 含义 |
---|---|
[ACK] | 确认标志,表示已收到服务端的 SYN |
Seq=1 | 客户端的下一个序列号(上次是0) |
Ack=1 | 确认服务端的 Seq=0 |
Win=263424 | 更新窗口 |
Len=0 | 仍无数据,但连接已建立 |
至此,服务端和客户端就建立起了连接。
四、常见的 MSS 值有哪些
网络类型 | MTU | MSS | 说明 |
---|---|---|---|
普通以太网 | 1500 | 1460 | 最常见 |
PPPoE 拨号(家庭宽带) | 1492 | 1452 | 常见于电信/联通宽带 |
WiFi | 1500 | 1460 | 同以太网 |
隧道/VPN | 1420~1440 | 1380~1400 | 封装额外头部,占用MTU空间 |
Jumbo Frame(巨型帧) | 9000 | 8960 | 高速内网使用,需设备支持 |
1460 是最常见的 MSS 值,看到它就说明是标准以太网环境。
五、MSS 相关的网络问题
问题:能 ping 通,但打不开网页?
ping 用的是 ICMP,不走 TCP
网页加载走 TCP,如果 MSS 太大,数据包被丢弃
结果:TCP 连接卡住,网页打不开
解决方案:调整 MSS(妈蛋,这是真有用)