한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › L8 Socket 与协议

UDP 数据包的 IP 分片 IP fragmentation of large UDP

原因 ID sk-fragment · 主责 研发团队·服务器开发

在含图示和实验的完整版中打开此卡片 →

超过 MTU(一次能发送的大小)的 UDP 包会在 IP 层分片,只要丢一个分片,整个包就被丢弃。

起因 人多处的快照超过 1,500 字节 → 结果 拆成多个分片发送,丢了任何一个就整个丢弃 → 画面表现 包越大,丢包率就高出好几倍。只在人多的地方瞬移

症状
瞬移
因素
丢包
谁会遇到
特定地点/分线, 特定地区/运营商
何时出现
人多的时候
负责方
主责 研发团队·服务器开发
研发团队要做的事
自己把包拆到 1,200 字节以下;只发变化的部分。
数值参考
在丢包率 2% 的线路上,拆成 4 个分片的包约有 8% 会丢失。还有防火墙或运营商会直接丢弃分片包,这类用户一个大包也收不到。
监控图上
随人数/负载上升 · IP 分片数(IpFragCreates)、快照大小
查看位置
在服务器上看 nstat -az 中 IpFragCreates(发送时生成的分片数)的增量,接收方看 IpReasmFails(重组失败次数)。用游戏服务器日志或抓包确认 UDP 包大小的分布
确认依据
人多的地方 IpFragCreates 增加,存在超过 1,500 字节的 UDP 包,且那时瞬移的反馈增多
排除依据
IpFragCreates 不增加,说明服务器发送侧没有发生分片
确认手段
运维工具即可确认(无需游戏代码)

出处

  1. RFC 8085: UDP Usage Guidelines IETF
    丢一个分片就无法重组,整个包都会丢失;UDP 应用应避免 IP 分片
  2. RFC 8900: IP Fragmentation Considered Fragile IETF
    防火墙和部分网络丢弃 IP 分片的案例
  3. net/ipv4/proc.c (Linux v6.12) Linux kernel
    nstat 显示的计数器名:Ip 组的 FragCreates(生成的分片数)、ReasmFails(重组失败次数)

相关原因

同一层:L8 Socket 与协议

其他层中同样导致“瞬移”的原因

查看含图示和实验的原卡片