游戏卡顿白皮书 › 按症状查找
掉线:51 个原因及负责方
又称:被踢下线、断线、与服务器的连接已断开
在含图示的完整版症状词典中打开 →
游戏中途连接断开,退回登录界面或弹出重连窗口。
卡住持续几秒后,弹出“连接已断开”提示。多人同时掉线,就是服务器端的问题。
超时时间内一个数据包都没收到。排查线路长时间中断、空闲超时、服务器崩溃或重启,以及服务器或自己的电脑停住的时间超过超时时间(长时间加载)。如果没有任何提示、游戏直接关掉了,先查客户端闪退(崩溃、内存不足),再查连接。
导致此症状的原因
L1 客户端游戏进程
- 客户端内存泄漏: 运行越久内存占用越大,游戏越来越慢,最终被强制关闭。 (研发团队·客户端开发)
- 客户端崩溃: 未处理的错误导致游戏关闭。玩家看来像掉线,服务器其实正常。 (研发团队·客户端开发)
- 游戏安全模块(反作弊)扫描: 为防外挂,与游戏一起运行的安全模块会定期扫描。扫描太重,或与安全服务器之间的心跳(定期发送的存活确认信号)延迟,就会一卡一卡或掉线。 (研发团队·客户端开发)
L2 客户端操作系统与设备
- 移动应用切到后台: 为了看通知把应用暂时切到后台,几秒后系统就会挂起(suspend)应用,这期间服务器就会断开这个玩家的连接。 (研发团队·客户端开发)
- Wi-Fi ↔ 4G/5G 切换: 走出家门时 Wi-Fi 断开、切换到 4G 或 5G,自己的 IP 地址会改变,原有连接随之失效。 (研发团队·服务器开发)
- 窗口最小化/失去焦点时处理受限: 切到别的窗口或最小化游戏时,游戏和 Windows 为了省电会让游戏降速运行。切回来时,积压的数据包会一下子涌来,或者已经掉线。 (研发团队·客户端开发)
- 游戏内覆盖层干扰: 聊天软件、启动器、录屏软件、FPS 显示工具为了在游戏画面上叠加绘制自己的 UI,会介入游戏的渲染过程(hook)。每帧的工作量随之增加,偶尔还会与游戏冲突,导致顿一下或游戏被强制关闭。 (外部·外部)
L3 家庭网络
- NAT 映射过期: 路由器会把一段时间没有数据包往来的空闲连接从 NAT 表中删除。这是挂机一段时间后一动就掉线的常见原因。 (研发团队·客户端开发)
- 路由器性能不足/过热: 便宜的路由器上挂了几十台设备、几千条连接,路由器本身就处理不过来。 (外部·外部)
- 基站切换(移动中): 坐公交、地铁移动时,切换基站期间通信会中断。 (外部·外部)
- 手机信号弱/信号盲区: 在电梯、地下室、建筑物深处,重传增多、速度下降,最终掉线。 (外部·外部)
L4 公网链路
- 国家/运营商级 UDP 限制与包检测: 有些网络会封锁特定的 UDP 地址和端口,或限制 UDP 速率;包检测设备还会过滤掉它识别不了的协议。用 UDP 通信的游戏在这类网络里会连不上,或频繁掉线。 (外部·外部)
- 线路质量差: 接头接触不良、线路老化或调制解调器异常,会造成持续丢包和周期性的线路中断。 (外部·外部)
- DDoS 导致共享线路饱和: 针对游戏公司或同一网络中其他目标的大流量攻击,会把共享线路占满。 (运维团队·网络运维)
- 运营商共享 IP(CGNAT): 移动网络和部分运营商让多个用户共用一个 IP,并会在很短时间内清掉空闲连接的映射。 (研发团队·客户端开发)
L5 数据中心网络设备
- 防火墙会话表耗尽: 防火墙会把放行的每个连接记到会话表里加以跟踪。表满之后就无法接受新连接。 (运维团队·网络运维)
- 负载均衡器空闲超时: 负载均衡器会在一段时间后清除空闲连接。游戏这边仍以为连接还在,结果就掉线了。 (运维团队·网络运维)
- 云安全组连接跟踪过期: 云服务器上挂载的防火墙(安全组)同样会跟踪连接,空闲连接的跟踪条目到了规定时间就会过期。即使服务器不经负载均衡器、由玩家直接连接,挂机一段时间的玩家也可能掉线。 (运维团队·系统运维)
- 网络设备故障切换(主备切换): 某台路由器或防火墙发生故障、切换到备用设备(故障切换)的几秒内,所有人都会卡住。 (运维团队·网络运维)
- MTU 不匹配(只有大包丢失): 中间某段的 MTU(一次能发送的最大尺寸)变小,而包过大通知又被拦截时,只有大包会一直丢失。 (运维团队·网络运维)
L6 服务器网卡
- 云宿主机维护/热迁移: 云厂商维护物理服务器(宿主机)时,会把虚拟机迁到其他宿主机(热迁移)或暂停片刻。这期间整台服务器停住,停住时间一长,连接就会断开。 (运维团队·系统运维)
- 网卡驱动/固件问题: 驱动 bug 或某项功能异常导致网卡停住、重启,这期间所有收发都会中断。 (运维团队·系统运维)
L7 服务器操作系统(内核)
- OOM Killer: Linux 在内存耗尽时,会挑出占用内存最多的进程强制杀掉,通常就是游戏服务器。 (研发团队·服务器开发)
- 系统时钟跳变(NTP step): 服务器时钟一次性向前或向后调整几秒时,依赖系统时钟的定时器会一下子集中触发或停住。 (研发团队·服务器开发)
L8 Socket 与协议
L9 服务器游戏进程
- 死锁: 两个线程互相等待对方持有的锁,就会永远停住。 (研发团队·服务器开发)
- 服务器崩溃: 服务器进程因未处理的错误而崩溃时,这台服务器上的所有人会同时掉线。 (研发团队·服务器开发)
- 死循环/逻辑失控: bug 导致一个 tick 无法结束时,服务器会停住,然后被看门狗强制重启。 (研发团队·服务器开发)
L10 内存
- 内存泄漏: 没有释放的内存一点点累积,几天后引发 GC 失控、swap 或进程被强制终止。 (研发团队·服务器开发)
- GC 颠簸(堆余量不足): 存活数据接近堆上限时,GC 即使运行也几乎回收不到东西,于是不停地反复执行。 (研发团队·服务器开发)
- 内存碎片: 反复分配和释放会把空闲空间切得很碎,进程占用的内存会远多于实际使用量。 (研发团队·服务器开发)
L11 磁盘
- 磁盘写满: 日志和 dump 堆积把磁盘写满后,写入会失败;没有做好应对,服务器就会崩溃。 (运维团队·系统运维)
L12 数据库
- DB 故障切换: 主库宕机、切换到备库期间无法写入,最后一部分没来得及复制的数据可能会丢失。 (运维团队·数据库运维)
L13 服务器架构与运维
- 经由网关/代理: 在客户端和游戏服务器之间加一层中间服务器,每经过一次就多一段处理时间,这台服务器也会成为单点故障。 (研发团队·服务器开发)
- 场景切换(服务器间迁移): 进入其他区域或副本时,要把角色数据交给另一台服务器,这个过程中会出现延迟和失败。 (研发团队·服务器开发)
- 发布/重启: 为更新而重启服务器时,如果不迁移连接,这台服务器上的玩家都会掉线,关机前的存盘和随后的重连也会一下子挤在一起。 (研发团队·服务器开发)
- 登录排队上限/重连保留不足: 上线、维护结束后连接集中涌入时,登录排队达到上限,开始拒绝新的排队;正在排队的玩家只要短暂断开一下就会丢掉位置,回到队尾。 (研发团队·服务器开发)
同步设计
- 主机(房主)结构: 由某个玩家的电脑充当服务器时,这个人的线路和电脑性能决定了所有人的体验。 (研发团队·服务器开发)
只有部分人遇到的问题
- 集中在特定运营商玩家身上的校验误判: 使用抖动大的线路的人,输入会扎堆到达,经常触发服务器的速度、冷却检查。 (研发团队·服务器开发)
- 固定 UDP 端口冲突: 客户端被做成使用固定的本地端口时,同一台电脑上的第二个客户端要么用不了这个端口,要么和第一个客户端分着收包。 (研发团队·客户端开发)
- 按 IP/设备区分会话的 bug: 服务器或中间服务器按 IP 或设备 ID 区分连接时,会把同一台电脑(同一公网 IP)上的两个客户端认成同一个人。 (研发团队·服务器开发)
- 多开限制: 安全模块或服务器策略限制一台电脑上开多个客户端时,第二个客户端会无法启动或连接,或者先开的那个掉线。有些游戏只禁用额外客户端的部分功能。 (研发团队·客户端开发)
- 后台窗口处理受限: 处于后台窗口的客户端,游戏、引擎、OS 都会减少它的帧和处理量。收到的包不能及时处理,就会积压或溢出。 (研发团队·客户端开发)
TCP 重传的根本原因
- 防火墙/连接跟踪丢包: 防火墙或 Linux 连接跟踪(conntrack,把经过的连接记录到表里的功能)在表满了,或判断连接状态不对时,会丢弃数据包。 (运维团队·网络运维)
- 中间设备超出处理上限(防火墙/IPS/DDoS 防护): 防火墙、入侵防御设备(IPS)、DDoS 防护设备会逐个检查经过的数据包。一旦超出检测能力,处理不过来的包就会被丢弃。 (运维团队·网络运维)
- MTU 黑洞(只有大包反复丢失): 中间链路能通过的包变小了,“包太大”的通知(ICMP)却被拦截,大包无论重发多少次都会丢失。 (运维团队·网络运维)
- 连接中途 NAT/负载均衡器映射过期: 中间设备删掉空闲连接的映射(记录该连接应转发到哪里的条目)后,之后发出的包就送不到了。要么反复重传后掉线,要么设备回一个拒绝连接的 RST,立刻断开。 (研发团队·客户端开发)
查看含图示的完整版症状词典