时间同步算法探究 背景 简单的模型 其他

时间同步这个问题其实大家都会遇到,比如最常见的,我们的电脑上设置时间为,选择为 internet 时间同步,还有网游服务器面对各个客户端的时间不固定,如何才能进行客户端的时间同步,当然还有电商在搞活动的时候,也需要考虑同步客户端的时间。

简单的模型

客户端每次请求服务端的时候,带上偏移信息,服务端将客户端上传的数据时间部分进行矫正,主要是加上这个偏移值,那么客户端如果计算这个偏移值呢?

假设

网络传输时间不变

客户端发送请求前的时间为 t1, 服务端接受请求的时间为 T1, 服务端处理完数据,开始响应数据的时间为 T2, 客户端收到响应的时间为 t2。
client server
t1 -----> T1
-----------|
t2 <----- T2

本次同步网络传输时间为
nt = (t2 - t1) / 2

偏移offset 定义为 同一时刻 服务端时间戳 - 客户端时间戳

请求时offset1为:

offset1 = T1 - nt - t1   ---------1

响应时 offset2 为:

offset2 = T2 + nt - t2    ----------2

略去 nt :

offset = (offset1 + offset2) / 2 = (T1 - t1 + T2 - t2) / 2

计算模型

 offset = (T1 - t1 + T2 - t2) / 2

误差分析:

由于网络传输耗时不是一个常量,1 式 和 2 式 的 nt 并不相等

优化模型

将多次同步请求的偏移结果,剔除掉异常数据,剩下数据取平均值处理作为最终结果

具体为:

  1. 隔 200ms 发起一次同步请求,一共发起 5 次 同步请求,记录五次的偏移结果为: offsets {offset1, offset2, offset3, offset4, offset5}
  2. 取 offsets 的中位数 offset0
  3. 求取方差
  4. 将 offsets 中平方小于方差的累加求和,然后取平均值 offset
  5. offset 作为时间同步的偏移

其他

http://blog.csdn.net/xufeng0991/article/details/43276363
https://wenku.baidu.com/view/a5e76c07f242336c1fb95e46.html