掌桥专利:专业的专利平台
掌桥专利
首页

一种移动设备即时通信软件的心跳间隔时间调整方法

文献发布时间:2024-04-18 20:00:25


一种移动设备即时通信软件的心跳间隔时间调整方法

技术领域

本发明涉及基于TCP协议的即时通信技术领域,特别是一种移动设备即时通信软件的心跳间隔时间调整方法。

背景技术

由于移动设备的本身网络状况的不稳定性和复杂性,并且移动设备本身操作系统对软件的硬件资源占用的限制性,导致移动端与服务端即时通信建立连接的可靠性显得尤为重要。在使用TCP长连接的及时通信服务设计中,往往都会采用心跳包来保持移动端与服务端的连接。

心跳包,通是客户端每隔一小段时间向服务器发送的一个数据包,通知服务器自己仍然在线,并传输一些可能有必要的数据。因按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。心跳包的目的为了保持长连接,包的内容没有特别规定,一般都采用很小的数据包,或者只是包含包头的一个空数据包。

在即时通信中,使用TCP长连接来实现业务的最大驱动力在于,在当前连接可用的情况下,每一次请求都只是简单的数据发送和接受,免去了DNS解析、连接建立等时间,大大加快了请求的速度,同时也有利于接受服务器的实时消息,但是其前提是连接可用。

如果连接无法很好地保持,每次请求就会具有较大的随机性,会遇到当前连接已失效,请求没有收到反馈,直到超时,需要再一次连接建立的过程,降低了连接的效率。而连接保持的前提是检测连接的可用性,并在连接不可用时主动放弃当前连接,建立新的连接。基于这个前提,必须要有一种机制用于检测连接可用性,同时移动网络的特殊性也要求客户端需要在空余时间发送一定的信令,避免连接被回收。

而对于服务器而言,能够及时获悉连接可用性也非常重要,一方面服务器需要及时清理无效连接以减轻负载,另一方面也是业务的需求,如游戏副本中服务器需要及时处理玩家掉线带来的问题。

有人会说TCP不是有KeepAlive机制么,通过这个机制来实现不就可以了吗?但是事实上,TCP KeepAlive的机制其实并不适用于此。Keep Alive机制开启后,TCP层将在定时时间到后发送相应的KeepAlive探针以确定连接可用性。一般时间为7200s(详情请参见《TCP/IP详解》中第23章),失败后重试10次,每次超时时间75s。显然默认值无法满足我们的需求,而修改过设置后就可以满足了吗?答案仍旧是否定的。因为TCP KeepAlive是用于检测连接的死活,而心跳机制则附带一个额外的功能:检测通讯双方的存活状态。两者听起来似乎是一个意思,但实际上却大相径庭。

考虑一种情况,某台服务器因为某些原因导致负载超高,CPU 100%,无法响应任何业务请求,但是使用TCP探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态,对客户端而言,这时的最好选择就是断线后重新连接其他服务器,而不是一直认为当前服务器是可用状态,一直向当前服务器发送些必然会失败的请求。

基于以上内容可知,TCP KeepAlive并不适用于检测双方存活的场景,这种场景还得依赖于应用层的心跳。应用层心跳有着更大的灵活性,可以控制检测时机,间隔和处理流程,甚至可以在心跳包上附带额外信息。因此,应用层的心跳包是保持移动设备即时通信软件移动端与服务端连接最佳方案。

目前,应用层的心跳包技术存在以下问题:

(1)一般的心跳是按照从最小还是逐渐递增的去探测的,所以在网络环境不好的条件下前期可能一直探测不上来,心跳周期一直维持在一个较小的范围,导致频繁的alarm,耗电,例如微信智能心跳探测过程:60秒短心跳,连续发3次后开始探测,90,120,150,180,210,240,270,这个过程中一共耗费24分钟,alarm了10次,在前14分钟之内alarm了8次;

(2)当网络环境很不好的情况下,心跳可能会经常失败,例如微信智能心跳由于是从下往上上调心跳,可能一直维持在一个间隔周期较小的心跳,会频繁alarm;

(3)普通心跳是逐渐的通过累加探测步长来上调心跳,上调的趋势比较稳定,但是如果step设置的比较小,那么会导致上调缓慢,探测到稳定心跳所需要的时间比较长(24分钟)。

发明内容

本发明的目的在于提供一种能够降低移动设备能耗、自适应网络环境进行alarm、提高消息接收及时性的移动设备即时通信软件的心跳间隔时间调整方法。

实现本发明目的的技术解决方案为:一种移动设备即时通信软件的心跳间隔时间调整方法,包括以下步骤:

步骤1、定义移动设备即时通信软件的心跳变量,建立移动设备即时通信软件连接;

步骤2、判断是否需要初始化心跳间隔,如果是则从服务器获取minHeart、maxHeart、step、curHeart,以curHeart秒心跳开始alarm;否则直接以curHeart秒心跳开始alarm;

步骤3、检测在到达alarm之前是否有数据传输,如果有则取消上一个alarm,重新以curHeart秒心跳开始alarm;无数据传输则以到达alarm时间点发送心跳包;

步骤4、检测心跳是否成功,如果是则开始心跳超时计时,进入步骤5;否则断开TCP连接,返回步骤1重新建立移动设备即时通信软件连接;

步骤5、检测心跳是否超时,如果是则下调curHeart;否则上调curHeart;

步骤6、判断是否达到稳定的心跳标准,如果达到则将curHeart设置为稳定心跳,返回步骤2,以curHeart秒心跳开始alarm;否则直接返回步骤2,以curHeart秒心跳开始alarm。

进一步地,步骤1中定义移动设备即时通信软件的心跳变量,具体如下:

探测心跳:程序采用不确定的时间间隔发送心跳,以得到最大NAT超时时间;

稳定心跳:当探测心跳探测到最大NAT超时时间后,选定比最大NAT超时时间小的时间作为稳定心跳,以这个稳定心跳时间发送心跳;

minHeart:最小的心跳间隔;

maxHeart:最大的心跳间隔;

curMinHeart:变换过程中的最小心跳,初始值为minHeart;

curMaxHeart:变换过程中的最大心跳,初始值为maxHeart;

step:心跳探测步长;

alarm:特殊的心跳,报文中含有特殊标记位以及时间戳;

maxSuccessCount:稳定心跳成功次数的最大值,用于动态向上探测;

maxFailedCount:心跳连续失败次数最大值,用于动态向下探测;

curHeart:当前正在使用的心跳间隔,设置为270秒,具体值根据不同地区的心跳区间大数据采集统计结果进行设置;

timeout:心跳超时时间,设置为20秒,这个值根据不同地区的心跳区间大数据采集统计然后再设置;

heartbeatStabledSuccessCount:稳定心跳连续成功的次数;

heartbeatStabledFailedCount:心跳连续失败的次数;

networkTag:网络环境标识,分为数据网络和wifi,其中数据网络包括电信、联通和移动;wifi采用wifi的名称进行区分;由于每个运营商的网络环境采用不同的NAT超时,所以在进行网络环境变换时需要重新调整心跳。

进一步地,步骤5中所述的下调curHeart,具体如下:

步骤5.1.1、设置heartbeatStabledSuccessCount=0;

步骤5.1.2、设置curMaxHeart=curHeart;

步骤5.1.3、如果稳定心跳失败,则heartbeatStabledFailedCount++,并且判断heartbeatStabledFailedCount是否大于maxFailedCount,如果是则从成功心跳列表中选择比当前心跳小一级的心跳作为新的稳定心跳;如果不存在略小一级的成功心跳,则设置curMinHeart=minHeart,curHeart=(curMinHeart+curMaxHeart)/2;

步骤5.1.4、如果探测心跳失败,则设置curHeart=(curMinHeart+curMaxHeart)/2;

步骤5.1.5、当curMaxHeart-curMinHeart<10成立,并且当前心跳不是稳定心跳时,设置curMinHeart=minHeart,把心跳比较大的值作为稳定心跳,然后探测结束,进入稳定心跳。

进一步地,步骤5中所述的上调curHeart,具体如下:

步骤5.2.1、将当前的成功心跳区间保存到列表中;

步骤5.2.2、设置curMinHeart=heartbeat.curHeart;

步骤5.2.3、如果当前心跳是稳定心跳,则设置heartbeatStabledFailedCount=0,heartbeatStabledSuccessCount++;如果当前心跳不是稳定心跳,则设置curHeart=(curMinHeart+curMaxHeart)/2,直接执行步骤5.2.6;

步骤5.2.4、判断heartbeatStabledSuccessCount是否大于maxSuccessCount,如果大于则上调maxSuccessCount的上限;

步骤5.2.5、从成功心跳列表选择比当前稳定心跳大一级的心跳作为新的稳定心跳;如果不存在比当前稳定心跳大一级的心跳,则设置curMaxHeart=maxHeart,curHeart=(curMinHeart+curMaxHeart)/2,然后再重新以curHeart开始向上探测心跳;

步骤5.2.6、判断curMaxHeart-curMinHeart<10是否成立,如果成立并且当前心跳不是稳定心跳,则设置curHeart=curMinHeart,把心跳比较小的值作为稳定心跳,然后探测结束,进入稳定心跳。

进一步地,步骤5.2.4中上调maxSuccessCount的上限,采用乘以2,或者递增固定值的方式。

进一步地,步骤5.2.6中判断curMaxHeart-curMinHeart<10是否成立,如果成立并且当前心跳不是稳定心跳,则设置curHeart=curMinHeart,把心跳比较小的值作为稳定心跳,具体如下:

由于心跳的临界值为curMaxHeart=curMinHeart,最终curMinHeart和curMaxHeart接近的时候curMaxHeart+curMinHeart==2*curMinHeart==2*curMaxHeart;

上式的等于号不是强等于,算法实现用到二分法:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值;

其中curMinHeart和curMaxHeart的接近值是一个动态的值,根据二分法计算出临界点值,范围为0到3秒;

心跳计算出来的curHeart和curMinHeart、curMaxHeart相差时间为0到3秒,设置一个10秒的区间,使心跳尽快进入稳定状态。

本发明与现有技术相比,其显著优点为:

(1)更加省电:一般的心跳是按照从最小还是逐渐递增的去探测的,所以在网络环境不好的条件下前期可能一直探测不上来,心跳周期一直维持在一个较小的范围,导致频繁的alarm,耗电,微信智能心跳探测过程:60秒短心跳,连续发3次后开始探测,90,120,150,180,210,240,270,这个过程中一共耗费24分钟,alarm了10次,在前14分钟之内alarm了8次,而超级心跳前14分钟才唤醒3次;

(2)网络环境差的情况下不会频繁的唤醒:当网络环境很不好的情况下,心跳可能会经常失败,现有方法由于是从下往上上调心跳,可能一直维持在一个间隔周期较小的心跳,会频繁alarm;本方法是从上往下下调心跳,因此心跳周期是逐渐缩小,一开始不会频繁的alarm,比较省电;

(3)探测周期短:微信智能心跳是逐渐的通过累加探测步长来上调心跳,上调的趋势比较稳定,但是如果step设置的比较小,那么会导致上调缓慢,探测到稳定心跳所需要的时间比较长(24分钟);超级心跳的心跳调整波动比较大,成功了就上调一半,失败了就下调一半,所以探测到稳定心跳的时间会比较短(14分钟),NAT超时时间距离最初开始探测的curHeat比较接近,所以curHeart可以通过大数据搜集分析,针对各个地区给出不同的curHeart,提高了用户体验。

附图说明

图1是本发明移动设备即时通信软件的心跳间隔时间调整方法的流程示意图。

具体实施方式

下面结合附图和具体实施例,对本发明进一步的详细说明。

在移动设备即时通信软件的数据发送过程中,如果心跳间隔过短,那么可能导致频繁的唤醒手机发送心跳包,增加耗电;心跳间隔过长,可能导致这条TCP连接已经无效但是无法及时的检测到,只能等待下一个心跳包发送的时候才能感知到,会导致消息接收延迟,所以探测到一个合适的心跳间隔是非常重要的,把耗电和消息接收及时性综合折中来取得一个最佳的体验。

本发明一种移动设备即时通信软件的心跳间隔时间调整方法,动态的探测最大的NAT超时时间,然后选定合适的心跳间隔区间发送心跳包,同时在网络状况发生变化的时候能够动态的调整心跳间隔时间,结合图1,包括以下步骤:

步骤1、定义移动设备即时通信软件的心跳变量,建立移动设备即时通信软件连接;

步骤2、判断是否需要初始化心跳间隔,如果是则从服务器获取minHeart、maxHeart、step、curHeart,以curHeart秒心跳开始alarm;否则直接以curHeart秒心跳开始alarm;

步骤3、检测在到达alarm之前是否有数据传输,如果有则取消上一个alarm,重新以curHeart秒心跳开始alarm;无数据传输则以到达alarm时间点发送心跳包;

步骤4、检测心跳是否成功,如果是则开始心跳超时计时,进入步骤5;否则断开TCP连接,返回步骤1重新建立移动设备即时通信软件连接;

步骤5、检测心跳是否超时,如果是则下调curHeart;否则上调curHeart;

步骤6、判断是否达到稳定的心跳标准,如果达到则将curHeart设置为稳定心跳,返回步骤2,以curHeart秒心跳开始alarm;否则直接返回步骤2,以curHeart秒心跳开始alarm。

作为一种具体示例,步骤1中,定义移动设备即时通信软件的心跳变量,建立移动设备即时通信软件连接;

进一步地,所述的定义移动设备即时通信软件的心跳变量,具体如下:

探测心跳:程序采用不确定的时间间隔发送心跳,以得到最大NAT超时时间;

稳定心跳:当探测心跳探测到最大NAT超时时间后,选定比最大NAT超时时间稍小的时间作为稳定心跳,以这个稳定心跳时间发送心跳;

minHeart:最小的心跳间隔;

maxHeart:最大的心跳间隔;

curMinHeart:变换过程中的最小心跳,初始值为minHeart;

curMaxHeart:变换过程中的最大心跳,初始值为maxHeart;

step:心跳探测步长;

maxSuccessCount:稳定心跳成功次数的最大值,用于动态向上探测;

maxFailedCount:心跳连续失败次数最大值,用于动态向下探测;

curHeart:当前正在使用的心跳间隔,默认270秒,具体值根据不同地区的心跳区间大数据采集统计结果进行设置;

timeout:心跳超时时间,默认设置为20秒;

heartbeatStabledSuccessCount:稳定心跳连续成功的次数;

heartbeatStabledFailedCount:心跳连续失败的次数;

networkTag:网络环境标识,分为数据网络和wifi,其中数据网络包括电信、联通和移动;wifi采用wifi的名称进行区分;由于每个运营商的网络环境采用不同的NAT超时,所以在进行网络环境变换时需要重新调整心跳。

步骤2、判断是否需要初始化心跳间隔,如果是则从服务器获取minHeart、maxHeart、step、curHeart,以curHeart秒心跳开始alarm;否则直接以curHeart秒心跳开始alarm;

步骤3、检测在到达alarm之前是否有数据传输,如果有则取消上一个alarm,重新以curHeart秒心跳开始alarm;无数据传输则以到达alarm时间点发送心跳包;

步骤4、检测心跳是否成功,如果是则开始心跳超时计时,进入步骤5;否则断开TCP连接,返回步骤1重新建立移动设备即时通信软件连接;

步骤5、检测心跳是否超时,如果是则下调curHeart;否则上调curHeart;

作为一种具体示例,所述的下调curHeart,具体如下:

步骤5.1.1、设置heartbeatStabledSuccessCount=0;

步骤5.1.2、设置curMaxHeart=curHeart;

步骤5.1.3、如果稳定心跳失败,则heartbeatStabledFailedCount++,并且判断heartbeatStabledFailedCount是否大于maxFailedCount,如果是则从成功心跳列表中选择比当前心跳小一级的心跳作为新的稳定心跳;如果不存在略小一级的成功心跳,则设置curMinHeart=minHeart,curHeart=(curMinHeart+curMaxHeart)/2;

步骤5.1.4、如果探测心跳失败,则设置curHeart=(curMinHeart+curMaxHeart)/2;

步骤5.1.5、当curMaxHeart-curMinHeart<10成立,并且当前心跳不是稳定心跳时,设置curMinHeart=minHeart,把心跳比较大的值作为稳定心跳,然后探测结束,进入稳定心跳。

作为一种具体示例,所述的上调curHeart,具体如下:

步骤5.2.1、将当前的成功心跳区间保存到列表中;

步骤5.2.2、设置curMinHeart=heartbeat.curHeart;

步骤5.2.3、如果当前心跳是稳定心跳,则设置heartbeatStabledFailedCount=0,heartbeatStabledSuccessCount++;如果当前心跳不是稳定心跳,则设置curHeart=(curMinHeart+curMaxHeart)/2,直接执行步骤5.2.6;

步骤5.2.4、判断heartbeatStabledSuccessCount是否大于maxSuccessCount,如果大于则上调maxSuccessCount的上限;

所述的上调maxSuccessCount的上限,可以采用乘以2,或者递增固定值的方式。

步骤5.2.5、从成功心跳列表选择比当前稳定心跳大一级的心跳作为新的稳定心跳;如果不存在比当前稳定心跳大一级的心跳,则设置curMaxHeart=maxHeart,curHeart=(curMinHeart+curMaxHeart)/2,然后再重新以curHeart开始向上探测心跳;

步骤5.2.6、判断curMaxHeart-curMinHeart<10是否成立,如果成立并且当前心跳不是稳定心跳,则设置curHeart=curMinHeart,把心跳比较小的值作为稳定心跳,然后探测结束,进入稳定心跳;

由于心跳的临界值为curMaxHeart=curMinHeart,最终curMinHeart和curMaxHeart接近的时候curMaxHeart+curMinHeart==2*curMinHeart==2*curMaxHeart;

上式的等于号不是强等于,算法实现用到二分法:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值;

其中curMinHeart和curMaxHeart的接近值是一个动态的值,根据二分法计算出临界点值,范围为0到3秒;

心跳计算出来的curHeart和curMinHeart、curMaxHeart相差时间为0到3秒,设置一个10秒的区间,使心跳尽快进入稳定状态。

以上仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

技术分类

06120116526860