1. MTU 基础概念

1.1 MTU 定义

最大传输单元(Maximum Transmission Unit,MTU) 是指网络接口层能够传输的最大数据包大小(以字节为单位)。它定义了单个网络帧可以承载的有效载荷上限,是链路层对上层协议(如 IP)施加的硬性约束。

在以太网环境中,标准 MTU 值为 1500 字节;在 Cilium 使用的隧道模式(如 VXLAN、Geneve)中,由于需要额外封装头部,实际可用 MTU 会相应减小。

关键理解: MTU 不是协议栈的“建议值”,而是物理链路或虚拟接口的“硬限制”。任何超过 MTU 的数据包都必须被分片或丢弃。

1.2 网络传输单元层级

数据在 TCP/IP 协议栈中逐层封装,每一层都有不同的传输单元名称:

协议层 传输单元名称 典型大小(字节) 说明
应用层 Message / 数据流 可变 HTTP 请求体、gRPC 消息等
传输层(TCP) Segment(段) MSS 协商决定 TCP 将数据流切分为段,MSS = MTU - IP头 - TCP头
网络层(IP) Packet(包) ≤ 65535 IP 包可能超过链路 MTU,需要分片
链路层(以太网) Frame(帧) ≤ MTU(通常 1500) 物理介质限制,超过则丢弃或分片
Cilium 场景提示: 当 Cilium 使用 VXLAN 隧道时,每个原始数据包会被额外封装 50 字节(VXLAN 8B + UDP 8B + IP 20B + 外层以太网 14B)。如果主机接口 MTU 为 1500,则隧道接口 MTU 应设置为 1450,否则封装后的帧会超过链路限制。

1.3 MTU 与分片的关系

当 IP 层准备发送一个数据包,发现其大小超过出接口的 MTU 时,会触发 IP 分片(IP Fragmentation) 机制。分片将原始数据包拆分为多个更小的片段,每个片段单独发送,在接收端重组。

MTU 与 IP 分片关系示意图 原始 IP 数据包(3000 字节) MTU = 1500 字节 → 触发分片 分片 1:1500 字节(含 IP 头 20B) 分片 2:1500 字节(含 IP 头 20B) 分片 3:40 字节 分片关键点 • 每个分片 ≤ MTU • 分片在接收端重组 • 丢失任一分片 → 整包丢弃 • 分片增加 CPU 开销 • 建议避免分片

1.4 分片的代价与避免策略

IP 分片在现代网络中应尽量避免,原因如下:

  • 性能开销: 分片与重组消耗 CPU 资源,尤其在高速网络下影响显著。
  • 可靠性下降: 只要丢失一个分片,整个原始数据包就无法重组,导致应用层重传。
  • 安全风险: 分片攻击(如 Teardrop 攻击)利用分片重组漏洞。
  • Cilium 场景: eBPF 程序处理分片包会增加复杂度,且部分 BPF 辅助函数对分片包支持有限。
MTU 调优核心原则: 在 Cilium 环境中,必须确保从 Pod 到目标节点的整条数据路径上,任何封装后的数据包都不超过链路 MTU。推荐使用 ip link show 和 ping -M do -s 进行端到端 MTU 探测,而非依赖默认值。

1.5 常见 MTU 值速查表

网络类型 标准 MTU Cilium 隧道模式有效 MTU 备注
以太网 1500 1450(VXLAN) 最常用配置
Jumbo Frame(巨型帧) 9000 8950(VXLAN) 数据中心内部推荐
PPPoE 1492 1442(VXLAN) 家庭宽带常见
VPN(IPsec) 1400-1460 1350-1410(VXLAN) 需根据封装开销计算
Geneve 隧道 1500 1440 Geneve 头部比 VXLAN 多 10 字节
MTU 探测命令:
# 测试不带分片的端到端 MTU(Linux)
ping -M do -s 1472 -c 3 10.0.0.1

# 查看接口 MTU
ip link show eth0 | grep mtu

# Cilium 隧道接口 MTU 查看
ip link show cilium_vxlan

其中 -M do 表示禁止分片,-s 1472 表示 ICMP 载荷大小(1472 + 28 字节 ICMP/IP 头 = 1500)。