测量联网设备之间的时差

who*_*ops 14 networking

我正在为我制作的游戏添加网络多人游戏.当服务器向客户端发送更新数据包时,我会包含一个时间戳,以便客户端确切知道该信息何时有效.但是,服务器计算机和客户端计算机的时钟可能设置为不同的时间(甚至可能只有几秒钟的差异),因此服务器的时间戳需要转换为客户端的本地时间.

所以,我想知道计算服务器和客户端之间时差的最佳方法.当前,客户端在初始化期间对服务器执行时间戳记录,记录请求何时被发送以及何时被应答,并且猜测时间戳大致在旅程的中途生成.客户还运行其中10个试验并取平均值.

但是,问题是我在重复运行程序时会得到不同的结果.在每组10中,每次测量很少发生超过400毫秒的偏差,这可能是可以接受的.但是如果我在程序的每次运行之间等待几分钟,那么得到的平均值可能不同意多达2秒,这是不可接受的.

有没有更好的方法来确定两个联网设备的时钟之间的差异?或者至少有一种方法来调整我的算法以产生更准确的结果?

可能相关或不相关的详细信息:这些设备是通过蓝牙进行通信的iPod Touch.我测量的ping是50-200毫秒.我不能要求用户同步他们的时钟.:)


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

Kar*_*ldt 24

我最近上了一个小时的课程并且时间不长,但是我会尝试将它煮沸以使你指向正确的方向.为一个小代数做好准备.

让s等于服务器的时间.让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
Run Code Online (Sandbox Code Playgroud)

这个诀窍是因为旅行时间并不总是恒定的,这可以通过50到200毫秒之间的ping来证明.事实证明,使用最短ping时间的时间戳是最准确的.那是因为您的ping时间是"裸机"延迟加上在路由器队列中等待所花费的任何延迟的总和.每隔一段时间,一个幸运的数据包通过而没有任何排队延迟,因此您将最小时间用作最可重复的时间.

另请注意,时钟以不同的速率运行.例如,我可以将我家中的计算机重置为毫秒,一天之后它会慢8秒.这意味着你必须不断调整d.您可以使用随时间计算的各种d值的斜率来计算您的漂移并在两次测量之间进行补偿,但这超出了答案的范围.

希望这有助于指明您正确的方向.

  • 这非常有效。我发现,如果我总是采用最小(即最负)t1 和 t2 值,则与采用最小 ping 相同,因此它会收敛到正确的偏移量。我有 t1 = 客户端标记 - 服务器标记和 t2 = 服务器标记 - 客户端标记 另外,我发现 iphone 漂移非常明显!在半小时内,两个设备之间的实际偏移可能会改变多达半秒。我通过联系 NTP 服务器的时钟程序验证了这一点。 (2认同)