腾讯天天系某百万大作的弱网处理及断线重连方案
ABSTRACT
GAD 2017 年文章(hessionhe),重度 RPG 手游的服务器端实战方案。针对「副本清版后断线、重连后卡版面」的问题,设计上/下行包序校验防重复处理,并在服务器为每个玩家维护下行包环形缓存池:重连时客户端上报最近收到的下行包序,服务器把断线期间丢失的包补推一遍,重连过程对玩家透明。
核心要点
- 背景:TCP 长连接 + TDR 编解码;弱网与断线交叉出现,「重连成功但流程卡死」(如下一版面信息包丢失)比单纯掉线更伤体验。
- 上行包序(防重):客户端维护上行包序,服务器记录最近值,小于等于即判重复直接丢弃——防止购买等消息被重复处理造成多次扣费;收不到回复的客户端最终走断线重连补齐。
- 下行包序(防重):服务器维护下行包序,客户端同样过滤已处理的包,防止数值与界面异常。
- 重连流程:客户端保存最近收到的下行包序,重连直连上次登录的 gamesvrd 并带上该包序;服务器比对后下发缓存池中满足条件的所有丢失包。
- 关键技巧:补发时只移动 tempBeginBuf 游标、不动 BeginBuf——若玩家网络不稳再次重连失败,缓存消息还能再次下发,不遗漏关键消息。
- 缓存池结构:每个 player 对象 20K 环形内存,节点 = {消息序列, 大小, TDR pack 后的消息};BeginBuf/EndBuf 双游标,push 移 EndBuf、取移 BeginBuf;pack 压缩后线上平均可缓存约 500 条消息,覆盖大部分断线场景。
- 缓存黑名单:登录/登出回复包、踢下线通知等不应入缓存。
- 运营闭环:统计每分钟发起重连次数与成功重连次数,量化监控线上重连质量。
- 效果:副本中断线重连后能继续断点流程,全程对玩家透明,「丝滑顺畅」。
关键实体与概念
TCP 长连接、TDR、上行/下行包序、断线重连、消息缓存池、环形缓冲、BeginBuf/EndBuf、gamesvrd、重连统计
关联概念
来源回溯
- 原始文件:
raw/gamedev/程序丨腾讯天天系某百万大作的弱网处理及断线重连方案.md(evernote/FW-游戏3研发技术 导入)
时效性评估
- 仍有效:包序防重、服务器下行缓存补发、tempBeginBuf 两阶段提交式补发、黑名单与量化统计,是移动端弱网方案的通用范式,长连接游戏至今沿用。
- 已过时:TDR 编解码已被 Protobuf/FlatBuffers 取代;现代框架(含 WebSocket 场景)多把序号与重连补发做进协议层网关,但机制设计与本文同构。