网络栈调优98 条

MTU 与分片问题定位

小包正常、大包卡住是典型 MTU 问题: 先确认接口 MTU 与路径 MTU, 再判断是否黑洞场景。

MTU 与分片问题

小包能通、大包卡住是典型的 MTU 问题。路径 MTU 取整条链路上所有跳的最小值,隧道与 VPN 封装会额外占用字节,使有效 MTU 变小。IPv4 下用 ping 的 -M do 禁止分片并逐步探测能通过的最大包长,再结合 ip link 确认接口 MTU,就能区分是本地配置问题还是路径限制。

基本信息

查看接口 MTUip link show eth0 | grep mtu
探测命令ping -M do -s 1472 -c 2 <目标地址>
换算关系1472 字节载荷 + 8 字节 ICMP 头 + 20 字节 IP 头 = 1500
不通时处理逐步减小 -s 值,找到能通过的最大包长
IPv6 注意最小 MTU 为 1280,且链路上不做分片

典型使用场景

  • 隧道或 VPN 上线后,部分站点能开、部分卡住
  • 跨机房大文件传输中断,小请求正常
  • SSH 交互卡顿:输入有响应延迟但不断开
  • 容器跨主机通信异常,overlay 封装后又叠加了 MTU 损失
  • 云环境内多网段 MTU 不一致,排查应用握手超时

检查与探测

检查与探测
ip link show eth0 | grep mtu              # 先看接口 MTU
ping -M do -s 1472 -c 2 203.0.113.10      # 1500 字节总长的探测,不通说明路径 MTU 更小
ping -M do -s 1400 -c 2 203.0.113.10      # 逐步减小,找到可通过的最大值
sysctl net.ipv4.tcp_mtu_probing           # 确认 PMTU 黑洞探测是否启用

现象与处理

现象含义处理方向
小包通、大包不通路径 MTU 小于本端接口 MTU启用 MSS 钳制或调整接口 MTU
单向可用两端 MTU 设置不一致统一两端与中间设备的配置
偶发卡顿后恢复PMTU 探测生效并收敛确认探测参数,评估是否调大保护
所有包都不通与 MTU 无关回到链路与路由层排查
若链路上屏蔽了 ICMP,ping -M do 的探测结果不能用来判断 MTU,此时应改用抓包观察重传是否总停在某个固定包长,或核对各跳设备的接口配置。
改小接口 MTU 需要两端与中间设备一致,否则会出现单向可通这种更难排查的现象;隧道场景更常用的做法是在网关做 MSS 钳制。

常见封装的开销

  • GRE 隧道:外层 IP 头 20 字节加 GRE 头 4 字节,共 24 字节
  • VXLAN:外层 IP、UDP 与 VXLAN 头再加内层以太帧头,合计约 50 字节
  • IPsec 传输模式:按加密与认证算法额外占用数十字节
  • MPLS:每层标签占 4 字节,多层标签时要叠加计算

易错点

  • 随意改小接口 MTU 而不协调对端与中间设备,制造出方向性不通的新问题
  • 把需要 MSS 钳制的问题误判为应用超时,反复调整应用参数毫无效果
  • 用允许分片的普通 ping 判断 MTU,得到的结果无法反映路径限制
  • 链路上 ICMP 被屏蔽时仍以 ping 结果下结论,误判为 MTU 正常

数据来源与参考

  • man ping
  • man ip-link
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌