MTU 与 MSS 计算器是什么?
这个工具可以把网络的最大传输单元(MTU)换算成 TCP 使用的最大分段大小(MSS)。MTU 是某条链路一次能承载的最大数据包(以字节为单位);而 MSS 则是在扣除 IP 和 TCP 头部之后,这个数据包里真正能装下的 TCP 有效载荷大小。正确设置 MSS,可以避免分片、重传,以及那个让人头疼、会导致连接卡死的"PMTUD 黑洞"问题。
如何使用
填入链路的 MTU 值(以太网默认值为 1500),选择 IPv4(基础头部 20 字节)或 IPv6(基础头部 40 字节),如有需要,还可以为 IP 选项或 TCP 选项(如时间戳、SACK,常见为 12 字节)额外补充字节数。计算器会扣除全部头部开销,并以字节为单位返回 MSS 结果。
公式详解
它们之间的关系非常简单:$$\text{MSS} = \text{MTU} - \text{IP 头部} - \text{TCP 头部}$$标准 TCP 头部为 20 字节,标准 IPv4 头部同样为 20 字节,因此最经典的速算方式就是 \(\text{MSS} = \text{MTU} - 40\)。IPv6 采用 40 字节的固定头部,于是 \(\text{MSS} = \text{MTU} - 60\)。任何协商出来的选项都会叠加到相应的头部上,进一步压缩有效载荷。
实例演算
在标准以太网中,MTU 为 1500 字节。以 IPv4 为例:IP 头部 = 20,TCP 头部 = 20,开销合计 = 40,因此 $$\text{MSS} = 1500 - 40 = 1460 \text{ 字节}$$如果启用了 TCP 时间戳,会额外占用 12 字节选项,TCP 头部就变成 32 字节,MSS 随之降为 $$\text{MSS} = 1500 - 20 - 32 = 1448 \text{ 字节}$$
常见问题
为什么我的 MSS 经常是 1460?因为大多数链路使用 1500 字节的 MTU,再减去 IPv4 + TCP 标准的 40 字节头部,正好剩下 1460 字节留给数据。
MSS 包含头部吗?不包含。MSS 严格指 TCP 有效载荷的大小;IP 和 TCP 头部是在它之上再加上去,才构成完整的数据包。
PPPoE 或隧道又该怎么算?各种封装都会降低实际可用的 MTU(例如 PPPoE 会增加 8 字节,使 MTU 降为 1492;VPN 占用的更多)。这时只需把降低后的 MTU 填进来,就能得到正确的 MSS。