MSS 到底是什么?Wireshark 分析TCP过程 - 教程

文章目录


什么就是一、MSS

MSS = Maximum Segment Size(最大报文段长度)
它表示:TCP 协议一次能传输的最大“纯数据”大小(不包括 TCP 和 IP 头部)。

想象你要寄一个包裹(TCP 报文):

快递公司规定:整个包裹不能超过 1500 字节 ,即MTU(Maximum Transmission Unit)
包裹的外包装(IP 头 + TCP 头)要占 40 字节,那最多能装1460 字节`。

MSS。所以:MTU = 整个包裹的最大重量就是这个 1460就
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,不要求分片
传输更高效、更稳定

怎么协商的(TCP 三次握手)就是三、MSS

在 TCP 三次握手的前两次中利用 TCP Option字段告诉对方的。就是MSS

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 值有哪些

网络类型MTUMSS说明
普通以太网15001460最常见
PPPoE 拨号(家庭宽带)14921452常见于电信/联通宽带
WiFi15001460同以太网
隧道/VPN1420~14401380~1400封装额外头部,占用MTU空间
Jumbo Frame(巨型帧)90008960高速内网启用,需设备支撑

1460 是最常见的 MSS 值,看到它就说明是标准以太网环境。

五、MSS 相关的网络困难

问题:能 ping 通,但打不开网页?

ping 用的是 ICMP,不走 TCP
网页加载走 TCP,如果 MSS 太大,数据包被丢弃
结果:TCP 连接卡住,网页打不开

解决方案:调整 MSS(妈蛋,这是真有用)

posted @ 2025-09-18 19:29  yxysuanfa  阅读(303)  评论(0)    收藏  举报