我双击桌面上的游戏图标,屏幕黑了两秒,随后跳出一行白字:无法获取服务器列表。下方还有一行小字:无法获取游戏公告。这不是网络断开的提示,因为我的浏览器还开着,视频播放也正常。可游戏客户端就这样卡在启动画面,十几秒后自动关闭。
这类提示的本质,是客户端在启动时向服务器发出的第一个请求没有得到响应。游戏的目标玩家电脑通常需要先访问一个动态域名,拿到包含所有区服IP、负载状态和版本号的数据包,同时再向另一个CDN地址拉取公告文本和横幅图。哪怕其中一个请求超时,客户端就会判定环境不可用,直接亮出红字。
问题出在哪个环节?最常见的是域名解析被污染。某个宽带运营商曾把游戏的解析请求引导到自家缓存服务器,这个缓存服务器偏偏没有该域名的有效记录,于是返回了一个过期IP。客户端连接这个IP时,对端早已不运行对应服务,握手失败。玩家无论重启多少遍游戏,提示都一样。把电脑的DNS切换成公共解析服务之后,一切恢复正常。类似的情况在晚间上网高峰更容易出现,因为运营商DNS服务器的负载升高,处理UDP查询的线程池被打满,部分请求直接被丢弃,客户端等不到解析结果,就只能宣布获取失败。
另一个容易被忽略的故障点是中间链路的MTU不匹配。某次维护后的新版本增加了公告配图,图片被打包进了一个加密的传输流,客户端发送的数据包较大,而小区光猫默认MTU值比理想值小一些,导致TCP分片重组失败。连接反复超时,列表接口和公告接口同时报错。当时很多人怀疑是服务器崩了,群里有人换手机热点立刻登上,才意识到是本地网络的锅。
游戏服务器自身也存在隐患。有一次热门网游在深夜更新,运维人员把公告服务切到了一个新的对象存储桶,却忘了把旧桶的防盗链配置迁移过去。玩家访问公告图片时全部返回禁止访问,客户端因为安全策略较严,连文字公告也放弃加载。更致命的是,登录网关与列表服务之间用了同一套数据库集群,公告服务不断重试,把数据库连接数耗尽,列表接口也跟着报错。整个过程持续了四十多分钟,最后是清掉缓存队列并重启公告服务才恢复。

我还见过一款独立游戏,作者用一台廉价VPS提供列表和公告服务。开服当天涌进几百人,VPS的CPU瞬间飙满,数据库连接超时,所有玩家都看到无法获取服务器列表。后来在后台日志里能看到,一分钟内有上万次请求打进来,而VPS的实际并发处理能力只有几十。这不是代码写得差,而是单一节点太脆弱,一旦请求量超出阈值,服务彻底不可用,甚至不返回错误信息,客户端只能干瞪眼。
有些情况则更隐蔽。杀毒软件会拦截游戏进程对非标准端口的访问,尤其当游戏公告里含有动态加载的脚本时,安全组件会直接把连接断开。也有加速器把游戏流量路由到了海外节点,但列表服务器有地域白名单,IP不在允许范围内,网关直接拒绝响应。关掉加速器以后,问题迎刃而解。
我曾在一个玩家群里看到过这样的案例,某人的客户端一直报错,重装游戏、更换网络都无效,最后发现是Windows防火墙里残留了一条阻止规则,规则源头是半年前一次未完成的卸载。删掉规则后客户端立刻连上。这类问题最难排查,因为问题不在服务器,也不在宽带,而在系统内部。
从现象上看,无能为力的提示只是表象。玩家第一反应是断网,第二反应是服务器炸了,但实际上,一个光猫的MTU配置、运营商DNS里一条错误的缓存记录、几台共享带宽的虚拟机,都可能制造出相同的假象。当红字出现在屏幕上,真正需要检查的往往是那些看不见的链路节点。