tech/network · 集群 A · 网络基础原理 · 3/6
MTU 与 MSS 详解:分片、MTU 黑洞与隧道封装下的包大小问题
MTU 是链路允许的最大包大小,MSS 是 TCP 单个分段允许的最大载荷。代理和隧道会在原始数据外再加头部,使实际可用空间变小;如果路径上的“包太大”提示被丢弃,就会出现小包能过、大包消失的 MTU 黑洞。当你遇到网页加载一半卡住、大文件下载停滞时,可以优先怀疑包大小问题。
MTU 和 MSS 分别是什么
MTU(Maximum Transmission Unit,最大传输单元)是一条链路一次能承载的最大 IP 包大小,MSS(Maximum Segment Size,最大分段大小)是 TCP 在一个分段里能放的最大数据量。两者是“容器”和“容器里能装多少货”的关系。
以最常见的以太网为例:
├──────────────── MTU = 1500 字节 ────────────────┤
┌──────────┬──────────┬──────────────────────────┐
│ IP 头 20 │ TCP 头 20│ TCP 载荷(MSS = 1460) │
└──────────┴──────────┴──────────────────────────┘
这是不带任何选项的理想情况。实际中 TCP 头可能带时间戳等选项,IPv6 的基础头部是 40 字节,所以 MSS 会更小一些。不同网络环境的 MTU 也不同,例如某些宽带拨号方式会额外占用一部分头部,使 MTU 小于 1500。
分片与路径 MTU 发现
当一个包比下一跳链路的 MTU 大时,网络有两种处理方式:把包切成小块(分片),或者丢弃并通知发送方缩小包(路径 MTU 发现)。
分片是 IPv4 的传统做法。路由器把大包拆成多个小片分别传输,由接收方重新组装。它的问题在于:任何一片丢失整个包都要重传;重组消耗资源;不少防火墙和中间设备对分片处理并不友好。
**路径 MTU 发现(PMTUD)**是现代更常用的做法。发送方在包上设置“不分片”标志,如果某一跳放不下,就丢包并回送一条“需要分片”的 ICMP 消息,告诉发送方该链路能接受多大。发送方据此缩小后续包的大小。IPv6 中路由器不再负责分片,完全依赖这一机制。
| 机制 | 谁来处理 | 优点 | 风险 |
|---|---|---|---|
| IPv4 分片 | 中途路由器 | 无需发送方感知 | 丢一片全重传,部分设备丢弃分片 |
| 路径 MTU 发现 | 发送方根据 ICMP 调整 | 效率高 | ICMP 被过滤即失效 |
| MSS 钳制 | 网关在握手时改写 MSS | 对 TCP 有效、无需 ICMP | 对 UDP 无效 |
MTU 黑洞是怎么形成的
MTU 黑洞是路径 MTU 发现失效的结果:大包被丢弃,但“需要分片”的提示没能回到发送方,于是发送方一直用过大的包重试,连接看起来卡死。
形成黑洞的常见原因:
- 中间设备出于安全考虑过滤了 ICMP 消息;
- 某些网络设备对 ICMP 进行限速,高负载时提示被丢掉;
- 隧道或封装设备没有正确传递 ICMP 消息。
黑洞的特征非常鲜明——小的能过,大的不行:
- 网页首屏文字出来了,图片和脚本加载到一半停住;
- SSH 能登录,但执行输出较多的命令时卡住;
- 建立连接很快,下载速度先有数值随后归零;
- Ping 小包正常,Ping 大包(指定较大载荷且不分片)失败。
隧道与代理封装为什么让问题更明显
代理和隧道的本质,是把原始数据包装进另一层连接里传输,每多一层封装就多占一部分头部空间,留给原始数据的空间就更小。
原始包(应用视角):
┌────────┬──────────────────────────┐
│ IP/TCP │ 数据 │
└────────┴──────────────────────────┘
经过隧道封装后(链路视角):
┌────────┬──────────┬─────────┬────────┬──────────────────┐
│外层 IP │外层 TCP/UDP│ 协议头 │ 加密开销│ 原始包(可能被截断)│
└────────┴──────────┴─────────┴────────┴──────────────────┘
├────────────────── 不能超过路径 MTU ──────────────────┤
不同代理协议、不同传输方式的额外开销不一样,本文不对具体协议的字节数做定论。原理上,只要“原始包 + 封装开销”超过了路径 MTU,就需要分片或被丢弃。协议本身的差异可参考 代理协议 专题,隧道的通用模型见 网络隧道是什么。
在 TUN 模式下,客户端会创建一张虚拟网卡,并为它设定一个 MTU 值。应用发出的包先按这个 MTU 切好,再进入内核处理。这个值设得过大,封装后可能超出物理链路;设得过小,会增加包数量和处理开销。TUN 的工作原理见 TUN 虚拟网卡原理。
如何判断是不是 MTU 问题
判断 MTU 问题的关键是观察“大小相关性”:问题是否只在传输较大数据时出现。可以按以下思路检查:
- 观察现象:是否符合“小请求正常、大流量卡住”的特征,且能稳定复现。
- 对比直连:关闭代理访问同一境内大文件是否正常,排除本地链路问题。
- 对比模式:系统代理模式与 TUN 模式下表现是否不同,如果只在 TUN 下出现,虚拟网卡 MTU 值得怀疑。
- 对比传输方式:如果客户端或节点提供多种传输方式,对比是否只在某种方式下出现。
- 大包测试:用 ping 指定载荷大小并设置不分片标志,从较大值逐步减小,观察临界点(不同系统的参数写法不同,请查阅系统文档)。
需要注意,ping 走的是 ICMP,与代理隧道内的 TCP 流量路径不一定一致,测试结果只能作为参考。
常见的缓解思路
缓解 MTU 问题的原则是“让包在进入隧道前就足够小”。常见思路有:
| 思路 | 适用位置 | 说明 |
|---|---|---|
| 调小 TUN 虚拟网卡 MTU | 客户端 | 多数客户端提供该选项,默认值通常已考虑封装开销 |
| 启用 MSS 钳制 | 路由器或网关 | 握手时把 MSS 改小,只对 TCP 有效 |
| 调整本地网卡 MTU | 操作系统 | 影响所有流量,通常不推荐优先使用 |
| 更换传输方式 | 节点与客户端 | 不同封装开销不同,取决于服务商支持 |
无论采用哪种方式,都建议一次只改一个参数,记录修改前后的表现,确认有效再保留。随意调小 MTU 可能带来额外的性能损失。路由器上的设置方式可参考 路由器方案 专题。
与其他故障的区分
MTU 问题容易与丢包、DNS 故障混淆,三者的区分要点如下:丢包通常表现为“所有大小的请求都变慢、偶发失败”,没有明显的大小相关性;DNS 故障表现为“连接根本建立不起来”或“连到了错误地址”;而 MTU 问题的连接能够建立,小数据也能传输,只有超过某个大小的数据会稳定地卡住。只要抓住“是否与数据大小相关、是否稳定复现”这两点,就能大致做出判断。
小结
MTU 问题的识别难度在于它“半通”:连接能建立,部分内容能加载,只有大包会悄悄丢失。只要记住“小的能过、大的不行”这个特征,再结合隧道封装会占用空间这一原理,就能快速把它和节点故障、DNS 问题区分开。若需完整的排查流程,请参考 分层排障法。
想了解不同服务商的协议与客户端资料,可前往 机场品牌库 或 对比工具 查看,所有字段来自品牌资料,本站未实测。
常见问题
MTU 和 MSS 是什么关系?
MTU 指整个 IP 包的最大大小,MSS 指 TCP 载荷的最大大小。在常见的 IPv4 无选项场景下,MSS 大致等于 MTU 减去 IP 头和 TCP 头的长度,即 1500 对应 1460。
什么是 MTU 黑洞?
当某一跳的 MTU 比包小、且设置了不分片标志时,设备会丢包并发回“需要分片”的提示。如果这个提示被中途过滤,发送方永远不知道要缩小包,大包就会持续丢失,形成黑洞。
为什么用了代理之后才出现这个问题?
代理和隧道会在原始数据外再封装一层或几层头部,同样大小的原始包封装后可能超过路径 MTU。没有代理时刚好能过的包,加上封装就过不去了。
TUN 模式里的 MTU 要不要改?
多数情况下保持客户端默认值即可。只有在明确出现大包卡住的现象时,才考虑适当调小,并且一次只改一个变量,对比前后表现。
信息来源与更新时间
- 信息来源
- 品牌清单资料(品牌公开信息整理)
- 测试范围
- 本站未进行测速与解锁实测,所有能力描述均为资料声明或未测试状态。
- 发布时间
- 待核实
- 核实日期
- 待核实
- 最近更新
- 待核实