时间同步算法探究
背景
时间同步这个问题其实大家都会遇到,比如最常见的,我们的电脑上设置时间为,选择为 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 并不相等
优化模型
将多次同步请求的偏移结果,剔除掉异常数据,剩下数据取平均值处理作为最终结果
具体为:
- 隔 200ms 发起一次同步请求,一共发起 5 次 同步请求,记录五次的偏移结果为: offsets
- 取 offsets 的中位数 offset0
- 求取方差
- 将 offsets 中平方小于方差的累加求和,然后取平均值 offset
- offset 作为时间同步的偏移
其他
http://blog.csdn.net/xufeng0991/article/details/43276363
https://wenku.baidu.com/view/a5e76c07f242336c1fb95e46.html