代码之家  ›  专栏  ›  技术社区  ›  whooops

测量联网设备之间的时差

  •  14
  • whooops  · 技术社区  · 15 年前

    所以,我想知道计算服务器和客户机之间时间差的最佳方法。目前,客户机在初始化期间ping服务器以获取时间戳,注意请求何时发送和何时应答,并猜测时间戳大约是在过程的一半生成的。客户还进行了10次试验,并取平均值。

    但是,问题是我在程序的重复运行中得到了不同的结果。在每组10人中,每个测量值很少偏离超过400毫秒,这可能是可以接受的。但是如果我在每次运行程序之间等待几分钟,得到的平均值可能会相差2秒,这是不可接受的。

    有没有更好的方法来计算两个联网设备的时钟之间的差异?或者至少有办法调整我的算法以得到更准确的结果?


    更新:在下面答案的帮助下,我写了一个objective-c类来处理这个问题。我把它贴在我的博客上: http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html

    2 回复  |  直到 15 年前
        1
  •  26
  •   Karl Bielefeldt    15 年前

    我最近上了一个小时的这门课,时间还不够长,但我会尽量把它浓缩起来,让你知道正确的方向。准备学一点代数。

    让我们根据服务器来计算时间。根据客户的要求,让c等于时间。设d=s-c。d是添加到客户机的时间中,以将其更正为服务器的时间,这是我们需要解决的问题。

    首先,我们从服务器向客户机发送一个带有时间戳的数据包。当客户机接收到该数据包时,它将给定的时间戳和自己的时钟之间的差异存储为t1。

    然后,客户机向服务器发送一个带有自己时间戳的数据包。服务器将时间戳和它自己的时钟之间的差异作为t2发送回客户机。

    注意,t1和t2都包括包的“旅行时间”t加上两个时钟d之间的时间差。假设旅行时间在两个方向上相同,我们现在有两个未知的方程,可以求解:

    t1 = t - d
    t2 = t + d
    t1 + d = t2 - d
    d = (t2 - t1)/2
    

    诀窍来了,因为旅行时间并不总是恒定的,证明你的ping之间的50和200毫秒。它证明了最准确的时间戳使用最小ping时间。这是因为ping时间是“裸机”延迟加上在路由器队列中等待的任何延迟的总和。每隔一段时间,一个幸运的数据包就会在没有任何排队延迟的情况下通过,因此您可以使用该最小时间作为最可重复的时间。

    还要记住,时钟的运行速率是不同的。例如,我可以将家里的电脑重置为毫秒,一天后它会慢8秒。这意味着你必须不断地重新调整d。你可以用不同的d值的斜率来计算你的漂移,并在两次测量之间进行补偿,但这超出了这里的回答范围。

    希望这能帮你指明正确的方向。

        2
  •  2
  •   Cycles McHurtz    15 年前

    除非你能使用一些统计方法,否则你的算法不会精确得多。首先,10英镑可能不够。第一个也是最简单的改变是收集100个运输时间样本,然后去掉x最长和最短的样本。

    另一个需要补充的是,两个客户机在每个数据包中都发送自己的时间戳。然后你也可以计算他们的时钟有多不同,并检查时钟之间的平均差异。

    您还可以具体检查STNP和NTP的实现,因为这些协议是专门做这项工作的。

    推荐文章