测量网络中跃点之间的时间 (JAVA)

Measuring time between hops in network (JAVA)

我正在尝试收集 HTTP 请求从网络中的一个节点传输到另一个节点所需的时间数据,这是我正在处理的一个简单网络拓扑: 我正在使用 Raspberry Pi 4 模型 B

     PC ---- RaspPi(1) ---- RaspPi(2) ---- RaspPi(n) ---- ...

这些节点中的每一个都有自己的可以使用 HTTP 的应用程序,收集数据的想法是: 假设我有一个以 RaspPi(n) 作为目的地的 HTTP 请求,现在一旦请求遍历每个节点,我在到达节点时注销 TIMESTAMP,从那时起我可以计算DeltaT,也就是我的请求在连续2个节点之间穿行所花费的时间。

我试过使用:

Date now = Calendar.getInstance();
TimeStamp ts = new TimeStamp(now.getTime());

System.currentTimeMillis()

要获取时间戳,问题是,我收集的数据具有 负 DeltaT,例如:RaspPi(2) 的时间戳早于 RaspPi(1) 的时间戳.我做了一些搜索,发现我上面使用的 2 种方法是 not monotonic (Source 1 and Source 2)。 所以我想的另一种方法是使用 System.nanoTime() 但这似乎不适用于不同的 JVM,这是我所有的网络节点。

我不知道是否有更好的方法来收集这些数据,或者我可以采取一些解决方法来修复我使用的那些方法。

如果我没有说清楚,请告诉我。感谢阅读。

要获得 wall-clock 时间,请使用 System.currentTimeInMillis

System.nanoTime 可以是任意的,应该用于测量同一 node/machine 上的操作的持续时间。如果您尝试使用它来测量两台不同计算机之间的时间差,您将得到任意结果。

在某些情况下,System.curentTimeInMillis may go backward 但我猜您更有可能观察到由于这些机器上的系统时钟未完全同步而导致的问题 - 这通常具有挑战性,并且还取决于您的时间间隔一般期望测量(微秒,毫秒?)。

查看 NTP 协议以及如何保持时钟同步并对获得的结果持保留态度。 以下是有关此主题的一些有用信息:https://codeburst.io/why-shouldnt-you-trust-system-clocks-72a82a41df93 - 一篇有趣的文章:

According to google, there is a 6ms drift in a clock which is synchronised every 30s

一篇与主题相关的有趣论文:Clock Synchronization for One-Way Delay Measurement: A Survey