NetCalcLab

MTU / MSS / 封装开销计算器

逐层搭建封装栈,精确看到每一层首部消耗了多少字节的 MTU 预算。每个首部长度都注明出处,并可按你现网实际启用的选项调整,由此推导出的 TCP MSS 才是可以直接配置的数值。

封装栈

各层按由外向内的顺序排列。MTU 作用于最外层的 IP 报文,向内每多一层就消耗一部分预算。

标准以太网为 1500,巨帧为 9000,经过 PPPoE 后为 1492。

常见配置

L1IPv4

RFC 791 · 20 字节

首部最小 20 字节。IHL 字段最大为 15 × 4 = 60 字节,因此选项最多可再加 40 字节。

L2TCP

RFC 9293 · 20 字节

基础首部 20 字节。数据偏移字段最大可到 60 字节,因此选项最多可占 40 字节。

TCP MSS 计算器

MSS 是无需 IP 分片即可装入单个报文段的最大 TCP 载荷: MSS = MTU − IP 首部 − TCP 首部.

启用时间戳与 SACK Permitted 时通常为 12 B。

IPv6 下忽略该值。

TCP MSS

1460 字节

20 B IP 首部 + 20 B TCP 首部 = 每个报文段共 40 B 首部。

  • MSS = MTU 1500 − IP 首部 20 − TCP 首部 20 = 1460 字节。
  • 1460 是 1500 字节 MTU 下以太网的经典 TCP MSS 值。

MTU 预算就是做减法

外层 MTU 是一个固定大小的外壳。壳内的每一层协议都要占用其中一部分,剩下的才是载荷。算术本身毫无技巧可言 —— 真正的难点在于搞清每一层真实的首部长度,这也正是隧道 MTU 问题在现网中难以定位的原因。

基本关系
载荷 = MTU − Σ(各层首部长度)

TCP MSS = MTU − IP 首部 − TCP 首部
        = 最内层为 TCP 时的载荷大小

推算:1500 字节链路上承载 IPv4 + TCP 的 GRE 隧道
  外层 IPv4 首部        20 B
  GRE 首部               4 B
  内层 IPv4 首部        20 B
  TCP 首部              20 B
  ────────────────────────────
  开销合计              64 B
  载荷 / MSS          1436 B

常见封装开销

这些数字值得记住。每一项都是总开销字节数,以及在最内层为 20 字节首部的 TCP 时得到的 MSS。

1500 字节 MTU 下的封装开销与对应的 TCP MSS
封装方式开销构成合计MSS
纯 IPv4IPv4 20 + TCP 2040 B1460
纯 IPv6IPv6 40 + TCP 2060 B1440
PPPoEPPPoE 8 + IPv4 20 + TCP 2048 B1452
802.1Q VLANVLAN 4 + IPv4 20 + TCP 2044 B1456
GREIPv4 20 + GRE 4 + IPv4 20 + TCP 2064 B1436
带 Key 的 GREIPv4 20 + GRE 8 + IPv4 20 + TCP 2068 B1432
VXLANIPv4 20 + UDP 8 + VXLAN 8 + Eth 14 + IPv4 20 + TCP 2090 B1410
GTP-UIPv4 20 + UDP 8 + GTP-U 8 + IPv4 20 + TCP 2076 B1424
MPLS L3VPN(2 层标签)MPLS 8 + IPv4 20 + TCP 2048 B1452
IPsec ESP(AES-CBC,SHA-256)IPv4 20 + ESP ~62 + IPv4 20 + TCP 20~122 B~1378

IPsec 之所以标为近似值,是因为它的开销确实会变:密码块大小、IV 长度、到块边界的填充以及所选完整性校验长度都会改变总量。本计算器允许你逐项选择这些参数,而不是把某个数字当成通用答案。

示例:排查一个能 ping 通却下不动数据的隧道

一条 GRE 隧道两端都用了默认的 1500 MTU。小包 ping 能通,因为产生的报文很小;大流量传输会卡住,访问部分站点的 HTTP 请求会挂起。

算一遍就能完全解释清楚:

100 字节的 ping → 100 + 20(外层 IP)+ 4(GRE)+ 20(内层 IP)+ 8(ICMP)= 152 字节,远小于 1500。正常。

1460 字节的 TCP 报文段 → 1460 + 64 = 1524 字节,超过 1500。由于置位了 DF、不允许分片,报文被丢弃。

修复办法是两处配置改动:把隧道接口 MTU 设为 1476(1500 − 24),并增加 MSS 钳制,使 TCP 通告的值永不超过 1436。不做钳制的话,主机仍会尝试发送 1460 字节的报文段。

为什么 ICMP 比人们想象的更重要

路径 MTU 发现依赖于路由器能够告诉发送端“报文太大”。当防火墙屏蔽了 ICMP 类型 3 代码 4(IPv4)或 ICMPv6 类型 2(Packet Too Big)时,发送端永远收不到通知,只能不停重传同一个超长报文。

正因如此,“走 VPN 打不开网站、出了 VPN 就正常”是极为常见的抱怨,也因此在 ICMP 策略不受你掌控的网络里,人们宁愿做 MSS 钳制而不依赖 PMTUD。钳制是无条件生效的,因为它让超长报文根本不会被构造出来。

几种修复方案怎么选

  • 降低隧道 MTU 并钳制 MSS。 最可靠的方案,且不依赖 ICMP 策略。对 GRE、VXLAN 和 GTP-U 路径,这是默认推荐做法。
  • 提高物理接口 MTU。 在数据中心很常见:把底层网络设为 1550 或 1600,使叠加网络能承载完整的 1500 字节内层报文。前提是二层路径上的每台设备都一致。
  • 只依赖 PMTUD。 在 ICMP 能到达两端的规范网络中没问题;但在过滤 ICMP 的地方就十分脆弱,而公网大多如此。
  • 端到端启用巨帧。 在可控的数据中心里值得做;只要路径不完全由你掌控,就不值得。

协议首部参考

本计算器中的每个首部长度都出自其定义标准。完整清单如下,可与你自己的文档逐一核对:

协议首部长度及其标准
协议基础长度选项标准
Ethernet II14 BVLAN 每个标签 +4 BIEEE 802.3
IPv420 B通过 IHL 最多 40 BRFC 791
IPv6固定 40 B扩展首部,每个 8 B 起RFC 8200
TCP20 B通过数据偏移最多 40 BRFC 9293
UDP固定 8 B无RFC 768
GRE4 B校验和 +4、Key +4、序列号 +4、路由 +8RFC 2784 / RFC 2890
VXLAN固定 8 B无RFC 7348
GTP-U8 BS 标志 +4、PN 标志 +4、E 标志 +43GPP TS 29.281
PPPoE8 B(会话阶段)无RFC 2516
MPLS每个标签 4 B标签栈深度可变RFC 3032
IPsec ESP基础 8 BIV、填充与 ICV 随 SA 变化RFC 4303
WireGuard32 B + 16 B 标签无WireGuard 协议

关于 PMTUD、MSS 钳制与隧道 MTU 设计的更深入讨论,请参阅 《MTU 与 MSS 指南》。想了解隧道开销如何削减实际吞吐,可结合 TCP 吞吐计算器 一起使用。

常见问题

MTU 和 MSS 有什么区别?

MTU 是一条链路能承载的最大报文,以字节计,包含所有首部。MSS 是最大的 TCP 载荷,以字节计,不包含 IP 首部和 TCP 首部。标准以太网 + IPv4 + TCP 时,MTU 为 1500,首部占 40 字节,MSS 为 1460。MTU 是链路属性;MSS 是端点属性,应当由路径 MTU 推导出来。

为什么 GRE 隧道会让大包出问题?

GRE 会增加 24 字节开销(20 字节外层 IPv4 首部加 4 字节 GRE 首部)。封装前正好 1500 字节的报文会变成 1524 字节,超过物理链路 MTU。路由器不得不分片;而如果 DF 位被置位 —— 通常确实如此,因为 PMTUD 依赖它 —— 报文就会被直接丢弃。修复办法是把隧道接口 MTU 降到 1476,更关键的是把 TCP MSS 钳制到 1436,使发送端根本不会产生超长报文段。

什么是 TCP MSS 钳制?

MSS 钳制是在 TCP 的 SYN 与 SYN-ACK 报文经过路由器时改写其中的 MSS 值,使两端通告的取值都能装进隧道路径。它是解决隧道 MTU 问题的务实做法,因为即使路径某处屏蔽了 ICMP、路径 MTU 发现无法完成,它依然有效。在 Cisco 设备上通过 ip tcp adjust-mss 配置。

GTP-U 隧道会增加多少开销?

GTP-U 基础首部为 8 字节。加上 20 字节外层 IPv4 首部、8 字节 UDP 首部;若内层是 IPv4 + TCP,还要再加 40 字节内层首部。因此一个典型的 LTE 或 5G 用户面报文在承载任何载荷之前就有 76 字节开销。若置位了 S、PN 或 E 标志,GTP-U 首部会增长到 12 字节。

为什么 IPv6 下 MSS 是 1440?

IPv6 首部固定为 40 字节,而无选项的 IPv4 首部是 20 字节。在 1500 字节 MTU、标准 20 字节 TCP 首部下,MSS = 1500 − 40 − 20 = 1440。此外 IPv6 路由器在路径上从不分片,因此发送端必须遵守发现到的路径 MTU,否则报文会被丢弃并返回 ICMPv6 Packet Too Big 消息。

VXLAN 会增加多少开销?

VXLAN 会增加外层 IPv4 首部(20 字节)、UDP 首部(8 字节)、8 字节 VXLAN 首部,以及内层以太网首部(14 字节)—— 因为 VXLAN 承载的是完整的二层帧。也就是说,在内层 IP 报文之前就占了 50 字节。因此典型的 VXLAN 主机会把物理接口 MTU 设为 1550 以保持内层 MTU 为 1500,或者把叠加网络 MTU 降到 1450。

什么是路径 MTU 发现?

PMTUD 是发送端用来找出一条路径上最小 MTU 的机制。它发送置位 DF(不分片)的报文,并依赖路由器在报文过大时返回 ICMP“需要分片”消息。ICMPv6 用 Packet Too Big 承担同样的职责。当防火墙屏蔽了这些 ICMP 消息,PMTUD 会静默失败:小流量正常、大传输挂起 —— 这正是经典的“ping 得通但网站打不开”症状。

我应该启用巨帧吗?

只有在二层路径上的每台设备都支持时才启用。9000 字节 MTU 能把首部开销从约 2.9% 降到 0.5%,并大幅减少中断负载;但只要有一台设备仍停留在 1500,就会造成难以排查的丢包。巨帧在数据中心内部很常见,在广域网链路或公网上则很少见。