Javascript 如何获取从客户端到服务器的单向旅行的延迟时间
我想知道是否有办法获得客户端向服务器发送消息和服务器接收消息之间的时间(毫秒) 我无法使用Javascript 如何获取从客户端到服务器的单向旅行的延迟时间,javascript,node.js,Javascript,Node.js,我想知道是否有办法获得客户端向服务器发送消息和服务器接收消息之间的时间(毫秒) 我无法使用Date.now()将时间(毫秒)与服务器和客户端进行比较,因为每个设备可能会关闭几秒钟 我可以找到双向旅行的时间,记录发送消息的时间,并再次记录从服务器收到消息时的时间。但是,消息从客户端到服务器所需的时间可能与消息在双向行程中从服务器到客户端所需的时间不同。所以我不能简单地把这次除以2 关于如何在客户端和服务器上查找此时间或至少查找Date.now()之间的差异,有什么建议吗 提前感谢。如果首先使用同步
Date.now()
将时间(毫秒)与服务器和客户端进行比较,因为每个设备可能会关闭几秒钟
我可以找到双向旅行的时间,记录发送消息的时间,并再次记录从服务器收到消息时的时间。但是,消息从客户端到服务器所需的时间可能与消息在双向行程中从服务器到客户端所需的时间不同。所以我不能简单地把这次除以2
关于如何在客户端和服务器上查找此时间或至少查找Date.now()
之间的差异,有什么建议吗
提前感谢。如果首先使用同步服务器和客户端的时钟,就可以实现这一点。这需要访问外部服务器,但您也可以将NTP配置为安装在服务器上(请参阅) 有几个模块在节点中实现NTP:或 以下是节点ntp客户端的示例:
var ntpClient = require('ntp-client');
var clientOffset = 0;
ntpClient.getNetworkTime("pool.ntp.org", 123, function(err, date) {
if(err) {
console.error(err);
return;
}
clientOffset = Date.now() - date;
});
向服务器发送数据时,还应发送时间戳:
var clientTimestamp = Date.now() - clientOffset
服务器将有自己的偏移量。接收包时,它可以使用以下公式计算延迟:
var latency = Date.now() - serverOffset - clientTimestamp;
我想知道是否有办法获得客户端向服务器发送消息和服务器接收消息之间的时间(毫秒)
不,没有。至少,没有一个共同的时钟基准
如果我给你寄封信,你知道你是在哪一天收到的,但你不知道是什么时候寄的。因此,你不知道邮局花了多长时间才把信送到你那里
一个可能的解决办法是我在信中注明日期。当您收到它时,您可以将收到的日期与我发送的日期进行比较,并确定它在传输过程中的天数。但是,如果我写错了日期怎么办?假设我以为是星期五,而实际上是星期三。然后,您无法准确确定它是何时发送的
改变这种规模回到计算机,我们将不得不使用我们的实时时钟(RTC)来标记我们发送的数据包的时间。即使具有合理的准确性,我们的RTC也可能彼此相隔一分钟。我可以在我的时间01:23:01.000Z发送一个包给你,你可能会在10毫秒后收到。。。在01:23:55.00Z你的时间和计算,它花了54秒到达你
即使您通过internet与NTP同步,也可能需要10到100毫秒的时间
非常精确的时钟同步通常是通过GPS接收机完成的,GPS接收机本质上是一个非常精确的时钟源。如果你和我都非常准确地同步到GPS接收器,我可以给你发送一个数据包,你可以计算出需要多长时间
这通常是不切实际的,这就是为什么我们ping东西时使用往返时间。正如您所说,客户端和服务器之间很可能存在时差,因此,在隔离中无法可靠地测量单程行程为大量客户端实例找到双向行程时间,然后取一个平均值,然后将其除以2,可能会给出一个非常现实的值,因为对大样本进行平均有助于减少任何特定于实例的极值。我想知道您是否可以(ab)使用XH.TimeUT来同步客户机/服务器时钟,不确定是否足够精确。@ WixWiern考虑将某些问题的答案标记为接受(通过使用答案得分下面的按钮)NTP对于这个任务不够精确。Pin假定您只控制通信的一端,这就是为什么它需要往返。在他的例子中,他控制两端,还可以将它们连接到参考服务器。@mihai如果没有直接连接到公共服务器,比如电路交换路径,就不够准确。当然,互联网上的NTP不够准确。