【问题标题】:Get time difference (in Milliseconds accuracy) from remote server API [closed]从远程服务器 API 获取时间差(以毫秒为单位)[关闭]
【发布时间】:2021-12-14 13:18:24
【问题描述】:

假设从当前服务器的时间戳1600000000.123123 是毫秒部分)我们确实初始化 ping 到外部服务器的 API server-time 端点,这表示当时的服务器时间(当请求到达那里时)是1600000000.555.

但是,在请求到达服务器之前当然会有延迟,而且,当我们的请求获得响应时。当服务器响应 .555 时,可能恰好在我们服务器上的那个时刻(平行)已经是 1600000000.602 或任何不同的时间)。

那么,如何确定发起服务器上的时间,远程 API 何时响应该答案 .555。我们应该检查headers 还是我们应该使用哪种方法,以尽可能准确地找出毫秒差异。

(附言语言无关紧要 - 无论是 php 还是 node-js

【问题讨论】:

  • 网络时间同步是一个广泛的话题,也是一个复杂的话题。因为不知道源服务器是如何同步到某个权威时间源的,也不知道它当前的漂移,所以只能这么准确。
  • 您将如何处理服务器和用户之间的缓慢请求?有很多方法可以尝试用多个时间戳来处理数据包,但它会偏离一定的百分比。
  • @Pointy 非常感谢您的评论,这是有道理的。
  • @epascarello 我认为请求速度慢或快并不重要。让它延迟5秒。我们只想找出“如何找出那个差异”。教授有什么方法可以衡量吗?

标签: javascript php datetime ntp


【解决方案1】:

您在这里使用互联网,一个由连接的 IP 网络组成的网络,从您的客户端与服务器进行通信,然后再返回。如您所知,IP 网络的时间不确定。所以还有很多未知数。

按照您的要求做事的一个好方法是假设两件事。

  1. 当您的客户端第一次访问远程 API 时,会有一些连接设置时间。例如,建立 https 连接需要一些时间。

  2. 在第一次访问 API 后,您的请求到达网络并返回响应所需的时间大致相同。

鉴于这些假设,您可以试试这个。

  • 点击 API 两次并忽略结果(以确保已建立连接)。

  • 记下当地时间。 local_start_time

  • 再次点击 API。

  • 收到回复后,再次记下当地时间。 local_end_time.

  • 假设服务器在您的start_timeend_time 之间作出响应。

    actual_server_time = reported_server_time 
                          + (local_end_time - local_start_time) * 0.5 
    

这已经接近你能做到的最好了。

另一个提示:如果服务器时间(以 UTC 为单位)不在客户端时间的几秒钟内,请发出警告消息。如果您信任服务器的管理员,请警告您的用户,他们的本地计算机未使用Network Time Protocol 同步。如今,几乎所有联网操作系统都会自动处理这种时间同步。

如果您不信任服务器的管理员,您的警告肯定会更加模糊。

许多授权/身份验证技术(Javascript Web 令牌、SAML、Google Authenticator 风格的 TOTP 代码等等)都依赖于时间同步。

(我曾经有一个客户尝试与设置为一天中某个随机时间的非同步机器的 SAML 身份验证协议集成。我的 SAML 实现正确地拒绝了传入的身份验证令牌,因为它们来自未来几分钟。所以我添加了警告消息。它要求我的客户使用他们的操作系统日期和时间设置屏幕进行同步。此后问题没有再次出现。)

【讨论】:

  • 伟大的提示 O.Jones,我很感激。有趣的是,在两者之间进行估计。我可能会走那条路,因为在这种情况下这似乎是最好的选择。
  • 你能提一下,在这种情况下“ping”有什么帮助?例如,当做 ping google.com 并且响应是 Reply from 142.250.187.142: bytes=32 time=27ms TTL=112 时,27ms 是这个问题的任何有意义/替代解决方案吗?
  • ping 输出中列出的时间是从发送 ping(ICMP/IP 回显)数据包到收到响应的往返时间。它不包含有关响应服务器上时钟设置的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2013-05-26
  • 2017-08-05
  • 2013-05-09
相关资源
最近更新 更多