手机断网重连机制
问题原因:断网重连或者弱网络情况下,会出现网络延迟、掉线和丢包
目的:在出现网络异常的时候,保证能重新连接到服务器并继续操作,并且体验良好
主要介绍断线重连触发的条件,如何重连,以及重连后的后续处理
1 【断线重连触发条件】
如何判断网络异常?
- 在弱网情况下,网络会显式抛出异常,大部分为NetwordException.少部分为Timeout,客户端会触发断网重连流程
- 出现弱网或者断网情况:
- 网络条件异常(如切换网络、或者当前网络不稳定
- 网络延迟、网络链路异常等造成心跳包没有正常发送给服务器
这里可以有两种判断方法,一个针对服务端,一个针对客户端
- 服务端已经超过了最大等待时间,所以主动断开连接,客户端需要主动触发重连
- 客户端没有收到服务端对心跳包的返回包,认为掉线了,触发断线重连
- 客户端处于后台,超过一定时间服务端会主动断开与客户端的连接,客户端需要主动触发重连
2【重连流程】
A. Start:网络正常状态,简称S
B. Wait:网络已经断开,等待网络恢复,简称W
C. Reconnect:重新连接状态,简称R
D. End: 重新连接失败,简称E
3 【断网重连注意点】
- 安全性:重连不走正常登陆流程,是直连,所以无法保证连接过来的tcp是合法连接,所以要对连接做合法校验,保证直连过来的是正常客户端请求过来的,预防攻击
- 超时处理:服务器不可能无限制等待客户端重连,需要设置超时时间,超过了等待时间,服务器应该清除缓存,客户端走登录流程
- 数据包缓存:这里需要缓存没有发送成功的消息协议,客户端重连过来后,需要再次重新发送
- 记录连接时的网络类型,切换至前台再获取一次网络类型,如果类型不一致就需要重新连接
2.记录建立连接的IP地址,切换至前台再获取IP。IP不同则需要重新连接。
这里会出现一些问题,就是当我们切换网络的时候,也会出现断线重连,因为wifi情况下的IP和4g情况下的IP是不同的(这个要怎么解决还是不懂,王者荣耀也有出现这种情况)
4 【断线重连设计】
首先通信包的协议设计中,每个包头都包含一个叫pkgid的字段。
客户端的每个上行请求包(request)都有服务器与之一一对应的下行回复包(response),两者pkgid相同。
服务器的主动推送包pkgid=0。
客户端的实现:
客户端有一个队列,记录了已发送的request包,收到服务器的response后,再删除对应的request。
如果超时没有收到response,可以认为发生了断线,重新发送缓存的request,将pkgid设置为负标记为重传包。
重试有次数限制,如果超过次数仍然收不到回复,就提示断线,退出到登录界面。
服务器的实现:
服务器开一个缓存池,记录近期一定数量的response包和notify推送包。
当收到了重传包时,通过玩家id+pkgid,从缓存池里索引近期缓存的response包,缓存命中直接下发记录,没有命中则表示重传失败,服务器做踢线处理(踢线之后客户端会继续走登录流程)。