TCP MSS 是什么
MSS 是 TCP 单个报文能承载的最大数据长度,由双方在握手时协商。它与路径 MTU 的关系是 MSS ≈ 路径 MTU − IP 头 − TCP 头;当流量经过 IPsec、GRE、VXLAN 等隧道时,封装头会额外占用字节,实际可用的 MSS 变小。若设备不调整 MSS 通告值,就会出现小报文正常、大报文被丢弃的现象:网页能打开但加载慢、登录成功但传文件失败、TLS 握手完成但下载中断。
基本信息
| 关系式 | MSS ≈ 路径 MTU − IP 头 − TCP 头,隧道场景再减封装开销 |
|---|---|
| 典型问题 | 小包通、大包断;能登录、传文件失败;网页加载卡顿 |
| 设备侧动作 | 对经过设备的 TCP 报文改写 MSS 通告值,通常作用于握手阶段 |
| 生效方向 | 设备只改写经过自己的连接,两端都要覆盖才对全路径有效 |
| 验证方式 | 用带 DF 标志的 ping 探测路径 MTU,再核对实际协商结果 |
典型使用场景
- 分支机构与总部之间建立 IPsec 隧道后,访问大文件或网页卡顿
- GRE 或 VXLAN 封装承载业务,部分站点访问正常、部分站点异常
- PPPoE 或特殊接入链路上出现大包被丢弃的情况
- 跨运营商访问时部分目的地异常,与中间链路的 MTU 差异有关
- 上线上新隧道前做预检,避免业务切换后才暴露大包问题
华为 USG 示例(先看 ? 帮助)
华为 USG 示例(先看 ? 帮助)
system-view
firewall tcp-mss 1200 # 取值范围与生效方向随版本略有差异
quit
# 配置前用 ? 查看本机支持的子命令,避免照搬其他型号写法
display current-configuration | include mss客户端侧验证
客户端侧验证
ping -M do -s 1400 10.1.1.1 # Linux:禁止分片探测路径 MTU
ping -f -l 1400 10.1.1.1 # Windows:等价用法
# 逐步减小包长,找到能通的最大值,再核对 MSS 协商是否匹配
tcpdump -i any -n 'tcp[tcpflags] & tcp-syn != 0' # 观察握手时报文长度现象与处置对照
| 现象 | 可能原因 | 处置方向 |
|---|---|---|
| 小包通大包断 | MSS 未按封装开销下调 | 在隧道两端与中间设备调整 MSS |
| 只有部分站点异常 | 该路径 MTU 更小或经过额外封装 | 按站点复测并单独调整 |
| 网页能开加载慢 | 大包被丢弃后反复重传 | 核对丢弃统计与 MTU 探测结果 |
| 隧道建成后大文件失败 | 封装导致有效 MTU 变小 | 调整隧道接口 MTU 或 TCP MSS |
| 全部流量正常 | 路径 MTU 一致且无隧道 | 通常无需调整,改造后再复测 |
两端都在公网、路径 MTU 一致且没有隧道封装时通常无需调整;一旦新增隧道、改变接入方式或更换运营商线路,应重新做一次 MTU 探测与业务回归。
禁用 ICMP 会让路径 MTU 发现机制失效:中间设备无法把需要分片的差错报文回给发送端,隧道场景下应放行必要的 ICMP 差错报文,而不是简单全禁。