zoukankan      html  css  js  c++  java
  • 时间同步算法探究

    背景

    时间同步这个问题其实大家都会遇到,比如最常见的,我们的电脑上设置时间为,选择为 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

  • 相关阅读:
    确定比赛名次
    What Are You Talking About
    小兔的棋盘
    How Many Answers Are Wrong
    备份当前的ubuntu系统生成iso
    eclipse导入maven项目有时出现web.xml is missing的问题
    eclipse自动添加版权信息
    javac不是内部或外部命令
    linux目录权限
    python import error:no module named yaml
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/6640445.html
Copyright © 2011-2022 走看看