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) 机制。分片将原始数据包拆分为多个更小的片段,每个片段单独发送,在接收端重组。
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)。