手机客户端弱网络下的断线重连处理
发表于2016-10-14
1、弱网络下的断线重连
玩家在游戏过程中,所处的网络环境是复杂多变的,可能是wifi的网络不稳定,或处在3G甚至2G的环境下等。在这些情况下,网络游戏会由于网络或包量等原因而出现延迟,拉拽,甚至掉线等问题。对于这些问题,一方面要对程序的包量和通信进行优化,从根本上减缓网络压力。另一方面,在出现网络异常的时候,保证玩家能重新连接到服务器并继续游戏,并且体验良好。
网络的“弱”主要体现在延迟和丢包率大两方面,而这两方面都会影响游戏的体验。我们在市区低速移动的网络情况下(丢包率10%, 平均延迟890ms)测试,并对此情况下进行分析优化,达到了玩家能够顺利游戏的体验。
由断线或网络异常性质决定,基本上都是首先由客户端感知,因此断线重连的机制主要是由客户端来进行发起。
下面我主要从客户端方向就断线重连触发的条件,如何重连,以及重连后的后续处理三个方面来阐述,最后简略分析一下对我们游戏客户端容易掉线的一些思考。
2、判断重连条件
在弱网络条件下,我们根据网络状况的不同,有两种情况触发断线重连。
网络条件异常
在弱网络情况下,网络会显式的抛出一些异常,大部分情况下是NetworkException,少部分情况是Timeout(当然还有连接关闭等等其他异常,就不一一赘述)。在这种显式抛出异常的情况下,就说明网络已经无法顺利的和服务器进行连接,在这些消息类型中,对于客户端断网或网络波动导致的原因,客户端这边就会触发断线重连流程。

2 心跳包触发以及触发时间的确定
上一种情况的触发条件是客户端手机本身断网或网络发生异常的情况的触发,但实际情况中,还有可能发生客户端网络并未断开,也并没有异常抛出,但是却出现客户端和服务器无法正常进行收发消息的情况。
这种情况一方面原因是中间链路的连接异常,另一方面也会由于延迟过高或丢包导致的TCP重发造成的延迟过大,影响到服务器和客户端之间正常的收发消息。

在 市区低速移动的网络的模拟测试中,我们收集到的最大心跳包延迟是10s左右,也就是说,在此“弱”网络情况下,网络延迟峰值大概有10s以上。因此,我们对心跳包在一定时间内如果没有收到返回包的情况下也认为是一种掉线情况,会触发断线重连处理,目前在大厅设置的触发时间是30s,战斗中触发的时间是20s。
游戏切出
有一种情况是由于客户端切出游戏,或者中间接到电话等导致游戏暂停等情况,在一定时间后服务器会主动断开和客户端的连接,客户端也需要主动触发重连。
3、断线重连的大致流程图
断线重连收到网络异常消息阶段处理流程:

断线重连结果处理阶段:
4、对流程图的补充说明
1)在重连过程中,如果收到客户端主动断开的消息,会屏蔽所有重连行为
2)由于在收到NetworkException的时候无法保证网络状态,如果此时网络已经连接上,会无法触发后续重连过程,所以会在NetworkException的时候double check一下是否连接到网络。
5、关于状态机:
断线重连并不是一个瞬间操作,而是一个过程。在整个断线重连的过程中,存在着一个个阶段,也就对应一个个的状态。初步来说,主要分为以下几个阶段。
A. Start:网络正常状态,简称S
B. Wait:网络已经断开,等待网络恢复,简称W
C. Reconnect:重新连接状态,简称R
D. End: 重新连接失败,简称E
状态转换图见下: