Java 如何测量单向延迟?

Java 如何测量单向延迟?,java,networking,latency,Java,Networking,Latency,我想测量troughput从我的客户机到服务器的时间。目前,我只能测量整个行程(从客户端到服务器,再回到客户端),我可以通过测量发送数据包之前的时间和从服务器接收数据包之后的时间来完成。从技术上讲,如果我要划分整个行程时间,我将获得每个单向吞吐量的平均值 但是,如果某些吞吐量实际需要更长的时间才能达到这样的效果,该怎么办 在我创建的图像中,从客户端到服务器的吞吐量为30毫秒,从服务器到客户端的吞吐量为90毫秒。如果数据具有这样的到达率,那么测量整个往返行程并将其除以2将无法给出准确的单向到达时

我想测量troughput从我的客户机到服务器的时间。目前,我只能测量整个行程(从客户端到服务器,再回到客户端),我可以通过测量发送数据包之前的时间和从服务器接收数据包之后的时间来完成。从技术上讲,如果我要划分整个行程时间,我将获得每个单向吞吐量的平均值

但是,如果某些吞吐量实际需要更长的时间才能达到这样的效果,该怎么办

在我创建的图像中,从客户端到服务器的吞吐量为30毫秒,从服务器到客户端的吞吐量为90毫秒。如果数据具有这样的到达率,那么测量整个往返行程并将其除以2将无法给出准确的单向到达时间。如何准确测量单向到达时间

如何准确测量单向到达时间

TL;博士,你不能

这实际上是一个非常深刻的哲学问题,在物理学的核心(宇宙最底层的“金属”)尚未得到解答。物理学并不明确知道光速的单向性,只知道光速的双向性。到目前为止,我们设计的任何实验都不能回答这个问题。看

虽然可以测量双向路径上的平均速度,但一个方向或另一个方向上的单向速度是未定义的(不仅仅是未知的),除非可以定义两个不同位置上的“同一时间”。为了测量光从一个地方传播到另一个地方所花费的时间,有必要知道在同一时间刻度上测量的开始和结束时间。这需要两个同步时钟,一个在开始时,一个在结束时,或者通过某种方式从开始到结束瞬间发送信号。没有即时的信息传输方式是已知的。因此,平均单向速度的测量值取决于用于同步开始和结束时钟的方法。这是惯例问题

在非相对论的情况下,你可以通过同步时钟任意接近,但是你怎么知道时钟保持同步呢?对于您的情况,您必须同意在同一时间信号上进行同步,但传播延迟可能会导致数十到数百毫秒的延迟和抖动

所以,如果你想把单向时间精确到小于时钟抖动的程度,那你就太倒霉了。这是我的一个Linux系统上的
ntpq对等机的输出

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*unifi.versadns. 71.66.197.233    2 u  289 1024  377    2.298   -0.897   0.747
+eterna.binary.n 68.97.68.79      2 u  615 1024  377   42.258   -3.640   0.430
+homemail.org    139.78.97.128    2 u  160 1024  377   45.257   -0.209   0.391
-time.skylineser 130.207.244.240  2 u  418 1024  103   24.829    2.066   1.376

如果两个系统使用相同的主时钟进行同步,并且有足够的时间使延迟和抖动稳定下来,那么您可以将单向时间限制在5ms以内。

那么您的意思是没有准确的方法来测量单向延迟?但是如果我们将往返时间除以2,我们能得到一个近似值吗?这是正确的。如果除以2,则得到平均延迟。在您的特定示例中,平均延迟为60毫秒。您可以通过在每一端添加时间戳来计算单向延迟,但准确性将取决于时钟的同步程度。