0

我有一个服务器-客户端应用程序,该应用程序的一般用途是让一个客户端同时连接到多个服务器。DateTime客户端请求每个服务器从给定的一些开始在服务器本地记录数据TimeSpan。发出请求后,客户端与服务器断开连接。然后,一段时间后,客户端重新连接到服务器以检索记录的数据。为了让客户端正确解析记录的数据,所有服务器之间的时间参考必须匹配(在某种合理的准确度范围内,例如 1 秒)。

因此,我需要能够在记录期间实现该客户端引用的所有服务器的同步时间。

我不能保证服务器在线(它们可能仅在本地 LAN 上),因此我不能让它们轮询某些 Internet 数据库的 UTC 时间。我不能保证客户端在整个录制过程中都会保持连接,因此我不能让客户端不断发送它的时间作为参考。

我想这只留下了一个选择:客户端必须告诉每个服务器它认为设置记录的时间,并且服务器必须找出该时间与他们认为的时间之间的增量。然后服务器必须将该增量应用于任何记录的数据。

我对这种方法感到担忧。它会在很长一段时间内(比如 10 天)在服务器上保持准确的时间吗?如果其中一台服务器无法保持良好的时间,增量会随着时间的推移而漂移吗?

或者,有没有更好的方法来做到这一点?

4

3 回答 3

1

If I understand your task correctly, you need to measure relative time from the start of the request to the end of data collection, i.e. you must know when exactly certain piece of data was collected. To address this task your servers need to track only relative time of their activity (on Windows this can be done using GetTickCount function, on unix there exist similar functions) and record the relative time since beginning of data collection. On the client you can just add the absolute time when the client sent data collection requests (and you can store this time on the client as well).

于 2013-10-23T10:37:27.990 回答
1

我不能让他们轮询一些互联网数据库的 UTC 时间......但是,即使只能不时访问互联网 UTC(例如 NTP 服务器),也可以估计本地时间与互联网相比的进展情况世界标准时间。这基本上可以用来预测offset一段时间内的情况。典型的现代硬件显示出每秒 5 到 20 微秒的漂移率。一些实施工作允许将漂移率提高到大约 1 微秒/秒的精度。因此,1 us/s 的剩余“不准确性”将产生 3.6 ms/小时或 ~90 ms/天的误差。

您的要求在某种合理的准确度范围内,比如 1 秒在很长一段时间内,比如 10 天,这样的方案可以满足,1 us/s 的偏差累积到大约 900 ms/10 天。

怎么做:(一个非常基本的描述)

  • 在可以访问 Internet 时收集 Internet UTC(NTP 服务器)。
  • 建立本地 UTC 和互联网 UTC 对。
  • 预测漂移率(使用数学来提高其准确性,例如平均、异常值拒绝等)
  • 对您的数据包应用漂移率校正。

这也可以在客户端完成。客户端不仅接收记录的数据,还接收服务器的时间戳。这样,客户端可以估计自处理最后一个请求以来在服务器端经过了多少时间。它比较服务器端的经过时间和客户端的经过时间,估计漂移率,并对记录的数据进行校正。这基本上可以在没有任何互联网 UTC 的情况下工作。

于 2013-10-23T07:42:34.033 回答
1

您主要关心内部一致性,而不是绝对时间,所以:

  1. 在局域网上设置一个ntp服务器。
  2. 让所有基于局域网的机器从这里同步。
  3. (可选:让这个 ntp 服务器在连接时从 inet 同步。)
于 2013-10-23T08:00:26.360 回答