游戏卡顿白皮书 › 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 不增加,说明服务器发送侧没有发生分片
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- RFC 8085: UDP Usage Guidelines IETF
丢一个分片就无法重组,整个包都会丢失;UDP 应用应避免 IP 分片 - RFC 8900: IP Fragmentation Considered Fragile IETF
防火墙和部分网络丢弃 IP 分片的案例 - net/ipv4/proc.c (Linux v6.12) Linux kernel
nstat 显示的计数器名:Ip 组的 FragCreates(生成的分片数)、ReasmFails(重组失败次数)
相关原因
同一层:L8 Socket 与协议
其他层中同样导致“瞬移”的原因
查看含图示和实验的原卡片