游戏卡顿白皮书 › L3 家庭网络
NAT 映射过期 NAT mapping timeout
原因 ID hn-nat · 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
路由器会把一段时间没有数据包往来的空闲连接从 NAT 表中删除。这是挂机一段时间后一动就掉线的常见原因。
起因 路由器把“内网设备 ↔ 外部服务器”的连接记录在 NAT 表(地址转换表)中 → 结果 一段时间没有数据包就从表中删除(UDP 通常为 30~120 秒) → 画面表现 服务器的数据包进不了家里,掉线
- 症状
- 掉线
- 因素
- 丢包
- 谁会遇到
- 只有我, 同一家庭
- 何时出现
- 挂机一段时间后
- 负责方
- 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
- 研发团队要做的事
- 客户端:以不超过最短空闲超时一半的间隔发送心跳(UDP 映射只有从家里往外发的数据包才能可靠刷新,所以由客户端发),断开后自动重连。服务器:响应心跳,一段时间收不到就主动清理连接;映射被删、外部地址和端口变化时,用会话令牌(连接时拿到的确认码)确认是同一玩家并接续。
- 监控图上
- 连接成批断开 · 掉线次数(心跳超时)、断开前的空闲时长
- 查看位置
- 汇总服务器的断线原因,以及断开前该连接最后一个数据包往来后经过的时间(空闲时长),看其分布。测试时把 UDP 发包间隔逐步拉长到 30 秒、60 秒、120 秒,测出响应中断时的间隔
- 确认依据
- 只有挂机中的连接会断,空闲时长集中在 30~120 秒这类特定值之后。把心跳间隔缩短到比它更短后消失
- 排除依据
- 正在操作时也掉线,是线路或路由问题。只在特定移动运营商下集中在较短的值上,看“运营商共享 IP(CGNAT)”
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- RFC 4787: Network Address Translation (NAT) Behavioral Requirements for Unicast UDP IETF
UDP 映射计时器不得短于 2 分钟,建议默认 5 分钟以上;内网往外发的数据包必须刷新映射,外部进来的数据包刷新映射为可选 - An Experimental Study of Home Gateway Characteristics (IMC 2010) ACM
对 34 款家用路由器的测量:UDP 映射保持 30~691 秒,中位数 90 秒,超过一半不到 2 分钟;TCP 中位数约 60 分钟 - RFC 9308: Applicability of the QUIC Transport Protocol IETF
路径上有 NAT 的互联网环境中,约 30 秒间隔的 keep-alive 比较合适,更频繁会浪费流量和电量
相关原因
同一层:L3 家庭网络
其他层中同样导致“掉线”的原因
查看含图示和实验的原卡片