一种实现App与服务端时间同步的方法与流程

文档序号:17298366发布日期:2019-04-03 04:39阅读:2448来源:国知局
一种实现App与服务端时间同步的方法与流程

本发明属于移动互联网手机app应用开发领域,具体涉及一种实现app与服务端时间同步的方法。



背景技术:

在目前的互联网手机app应用中,为了保证秒杀抢购倒计时的准确性、正确统计app到服务端之间的请求耗时、防止重放攻击等目的,需要实现较高精度(<10ms)的app与服务端的时间一致性。

现有的技术方案常见包括:

1、时钟源同步方式,即app与服务端之间不直接进行时间同步交互,而是由app与服务端分别与标准时钟源进行时间同步,从而间接保证app与服务端的时间一致性。

2、从服务端接口同步方式,即app通过接口方式获取到服务端的时间,计算服务端时间与app本地时间的时间差δt,每次使用时将app本地时间加上δt作为本地的服务端时间。

上述方案1的时钟源同步方式,由于服务端通常是通过多级网络与标准时钟源进行时间同步,由于多层级网络延时累加,造成服务端时间精度不够,只能够保证秒级的精确性。在这种情况下,app与服务端的时间偏差也会达到秒级,通常无法满足对时间一致性要求较高的业务场景的需要。

上述方案2的服务端接口同步方式,存在如下缺点:1、app通过网络接口获取服务端时间时,由于网络调用耗时,获取到的服务端时间传输到客户端时与实际的服务端时间已经存在偏差。2、在获取到app与服务端的时间差δt后,app本地时间由于网络自动校准或者人为修改的原因会发生变动。

本发明在采用app与服务端之间通过时间同步接口的方式的基础上,为了解决app获取服务端时间由于网络延时造成的偏差,通过算法在一定程度上减少网络延迟的影响。为了防止app本地时间变动的影响,通过终端开机持续时间来保证校准后与服务端的时间相对一致性。同时,将时间戳嵌入到正常业务交互报文中,通过计算每次请求的网络延时,可以不断使用更低网络延时的请求报文中的时间戳来优化更新app本地保存的服务端时间,从而使app与服务端的时间一致性不断趋于精准。



技术实现要素:

本发明的目的在于提供一种实现app与服务端时间同步的方法,通过算法在一定程度上减少网络延迟对获取的时间精度的影响;同时采用手机开机时间来保持与服务端时间的同步性,可以不受app本地时间变动的影响;另外通过持续性的计算每次请求的网络延时,可以不断使用更低网络延时的请求报文中的时间戳,来优化更新app本地保存的服务端时间,从而使app与服务端的时间不断趋于一致。

为实现上述目的,本发明的技术方案是:一种实现app与服务端时间同步的方法,包括如下步骤:

步骤s1、app与服务端时间偏差值、网络延迟时长的获取与计算:

在正常业务请求报头即httpheader中嵌入客户端和服务端的时间戳,具体记录的时间戳如下:

(1.1)app提交给服务端的请求包离开app的时间t1;

(1.2)服务端返回app的应答报文中包含服务端接收到请求包的时间t2、应答包离开服务端的时间t3;

(1.3)app接收到应答包的时间t4;

通过上述4个时间参数t1、t2、t3、t4,即可计算出2个参数:网络延迟时长d、app与服务端之间的时间偏差△t;

步骤s2、实现app与服务端保持时间一致性:

(2.1)app在启动时调用接口获取服务端的应答包离开服务端的时间t3,app将t3+d/2作为当前的服务端时间保存在app侧,并且标注该变量为servertime;

(2.2)app在收到服务端应答包的同时,调用手机端的systemclock.elapsedrealtime()方法,获取手机端系统开机时间,并且记录该变量为elapsedtime;同时记录本次的网络延时时长d为变量delaytime;

(2.3)app后续请求中,报头的t1=servertime+systemclock.elapsedrealtime()-elapsedtime,该时间t1即目前app侧保持的服务端时间。

在本发明一实施例中,还包括一步骤s3,即通过持续更新提高时间一致性精度:由于获取服务端时间的准确程度受网络延时时长d的影响,理论上d越小的情况下获取的服务端时间越接近实际值;根据这个原则,每次计算请求的网络延时时长d时,当新的d比app记录的d更小时,则采用这次请求的服务端时间更新app记录的servertime;具体实现如下:

(3.1)app在收到服务端应答包后计算本次请求的网络延时d,若d<delaytime则继续后续步骤(3.2)进行校准,否则不进行校准;

(3.2)更新app侧的servertime=t3+d/2;更新elapsedtime=systemclock.elapsedrealtime();更新delaytime=d。

在本发明一实施例中,所述步骤s1中,网络延迟时长d、app与服务端之间的时间偏差△t的具体计算方式如下:

根据各时间参数之间的关系,可知:

t2-t1-△t=d1

t4-t3+△t=d2

d1+d2=d

假设请求包网络延迟时长d1与应答包网络延迟时长d2相等,则可以推导出:

△t=((t2+t3)-(t1+t4))/2

d=(t2-t1)+(t4-t3)

由此得出每个请求的app与服务端的时间偏差值△t以及网络延迟时长d。

相较于现有技术,本发明具有以下有益效果:本发明通过算法在一定程度上减少网络延迟对获取的时间精度的影响;同时采用手机开机时间来保持与服务端时间的同步性,可以不受app本地时间变动的影响;另外通过持续性的计算每次请求的网络延时,可以不断使用更低网络延时的请求报文中的时间戳,来优化更新app本地保存的服务端时间,从而使app与服务端的时间不断趋于一致。

附图说明

图1为app与服务端时间偏差值、网络延迟时长的获取与计算示意图。

具体实施方式

下面结合附图,对本发明的技术方案进行具体说明。

本发明提供了一种实现app与服务端时间同步的方法,包括如下步骤:

步骤s1、app与服务端时间偏差值、网络延迟时长的获取与计算:

在正常业务请求报头即httpheader中嵌入客户端和服务端的时间戳,具体记录的时间戳如下:

(1.1)app提交给服务端的请求包离开app的时间t1;

(1.2)服务端返回app的应答报文中包含服务端接收到请求包的时间t2、应答包离开服务端的时间t3;

(1.3)app接收到应答包的时间t4;

通过上述4个时间参数t1、t2、t3、t4,即可计算出2个参数:网络延迟时长d、app与服务端之间的时间偏差△t;

步骤s2、实现app与服务端保持时间一致性:

(2.1)app在启动时调用接口获取服务端的应答包离开服务端的时间t3,app将t3+d/2作为当前的服务端时间保存在app侧,并且标注该变量为servertime;

(2.2)app在收到服务端应答包的同时,调用手机端的systemclock.elapsedrealtime()方法,获取手机端系统开机时间,并且记录该变量为elapsedtime;同时记录本次的网络延时时长d为变量delaytime;

(2.3)app后续请求中,报头的t1=servertime+systemclock.elapsedrealtime()-elapsedtime,该时间t1即目前app侧保持的服务端时间。

还包括一步骤s3,即通过持续更新提高时间一致性精度:由于获取服务端时间的准确程度受网络延时时长d的影响,理论上d越小的情况下获取的服务端时间越接近实际值;根据这个原则,每次计算请求的网络延时时长d时,当新的d比app记录的d更小时,则采用这次请求的服务端时间更新app记录的servertime;具体实现如下:

(3.1)app在收到服务端应答包后计算本次请求的网络延时d,若d<delaytime则继续后续步骤(3.2)进行校准,否则不进行校准;

(3.2)更新app侧的servertime=t3+d/2;更新elapsedtime=systemclock.elapsedrealtime();更新delaytime=d。

所述步骤s1中,网络延迟时长d、app与服务端之间的时间偏差△t的具体计算方式如下:

根据各时间参数之间的关系,可知:

t2-t1-△t=d1

t4-t3+△t=d2

d1+d2=d

假设请求包网络延迟时长d1与应答包网络延迟时长d2相等,则可以推导出:

△t=((t2+t3)-(t1+t4))/2

d=(t2-t1)+(t4-t3)

由此得出每个请求的app与服务端的时间偏差值△t以及网络延迟时长d。

以下为本发明的具体实现实例。

本发明的一种实现app与服务端时间同步的方法,具体实现过程如下:

1、app与服务端时间偏差值、网络延迟时长的获取与计算方式:

如图1所示,在正常业务请求报文头即httpheader中嵌入客户端和服务端的时间戳,具体记录的时间戳规则如下:(1)app提交给服务端的请求包离开app的时间t1;(2)服务端返回app的应答报文中包含服务端接收到请求包的时间t2、应答包离开服务端的时间t3;(3)app接收到应答包的时间t4。通过上述4个时间参数就能够计算出2个关键参数:请求包的往返延迟d和app与服务端之间的时间偏差△t。

根据图1可以得到如下公式:

t2-t1-△t=d1

t4-t3+△t=d2

d1+d2=d

假设请求包网络延迟与应答包网络延迟相等,即d1=d2则可以推导出:

△t=((t2+t3)-(t1+t4))/2

d=(t2-t1)+(t4-t3)

根据上述计算公式,可以计算出每个请求的app和服务端的时间偏差值△t以及网络延迟d。由于该算法在一定程度上考虑了网络延迟的影响,并且d1和d2越接近则△t越准,当实际d1=d2时,计算出的△t就是真实的双方时间偏差值了。

2、app与服务端保持时间一致性的方式:

1)app在启动时调用接口获取服务端的应答包返回时间t3,app将t3+d/2作为当前的服务端时间保存在app侧,并且标注该变量为servertime。

2)app在收到第1)步的服务端应答包的同时,调用手机端的systemclock.elapsedrealtime()方法,获取该手机系统开机时间(包含睡眠时间),并且记录该变量为elapsedtime。同时记录本次的网络延时d为变量delaytime。

3)app后续请求中,报头中的t1=servertime+systemclock.elapsedrealtime()-elapsedtime,这个时间t1就是目前app侧保持的服务端时间了。

3、持续更新提高时间一致性精度的方式

通过以上步骤1、2已经可以基本保证app与服务端的时间一致性,但是为了防止第一次获取服务端时间时,由于网络波动等对精度的影响,可以在后续的请求过程中对app保留的服务端时间进行持续校准。优化的主要思想为:由于获取服务端时间的准确程度主要受网络延时d的影响,理论上d越小的情况下获取的服务端时间越接近实际值。根据这个原则,可以每次计算请求的网络延时d,当新的d比app记录的d更小时,就使用这次请求的服务端时间更新app记录的servertime了。

具体步骤如下:

1)app在收到服务端应答包后计算本次请求的网络延时d,如果d<delaytime则继续后续步骤进行校准,否则不进行校准。

2)校准更新步骤:更新app侧的servertime=t3+d/2;更新elapsedtime=systemclock.elapsedrealtime();更新delaytime=d。

以上是本发明的较佳实施例,凡依本发明技术方案所作的改变,所产生的功能作用未超出本发明技术方案的范围时,均属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1