游戏卡顿白皮书 › L8 Socket 与协议
Windows UDP socket 的 WSAECONNRESET 错误 WSAECONNRESET on a Windows UDP socket
原因 ID sk-udp-connreset · 主责 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
Windows 服务器向已经离开的客户端发 UDP 时,会收到“端口不可达”(ICMP)通知。这个通知会让下一次接收调用以错误结束;如果服务器代码把这个错误当作 socket 本身坏了来处理,所有使用这个 socket 的人都会受影响。
起因 一直向刚离开的客户端地址发 UDP,收到“端口不可达”(ICMP)通知 → 结果 Windows 让接下来的接收调用以 WSAECONNRESET(10054)错误结束,服务器代码停止接收或关闭 socket → 画面表现 使用这个 socket 的所有人一起卡住、掉线
- 症状
- 掉线, 卡住
- 因素
- 丢包, 停顿
- 谁会遇到
- 全服
- 何时出现
- 偶尔随机, 刚登录/维护结束后
- 负责方
- 主责 研发团队·服务器开发
- 研发团队要做的事
- 用 WSAIoctl 关闭 SIO_UDP_CONNRESET,不再接收这个通知;接收出错时也只记日志、继续接收。
- 监控图上
- 连接成批断开 · 连接数、接收错误日志
- 查看位置
- 在游戏服务器日志里找 UDP 接收错误码(WSAECONNRESET、10054)以及接收循环停止或关闭 socket 的记录,用服务器侧抓包确认之前是否收到了 ICMP Port Unreachable
- 确认依据
- 连接集中断开前记录到 WSAECONNRESET 接收错误,在那之前刚离开的客户端地址发来了 ICMP Port Unreachable
- 排除依据
- Linux 服务器,或代码已关闭 SIO_UDP_CONNRESET,则不适用
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- Winsock IOCTLs Microsoft
用 SIO_UDP_CONNRESET 开启或关闭 UDP“端口不可达”(PORT_UNREACHABLE)通知的上报 - recvfrom function (winsock.h) Microsoft
UDP socket 上的 WSAECONNRESET 表示之前的发送收到了 ICMP Port Unreachable - Windows Sockets Error Codes Microsoft
WSAECONNRESET 错误号 10054
相关原因
同一层:L8 Socket 与协议
其他层中同样导致“掉线”的原因
查看含图示和实验的原卡片