从远程服务器获取时间差(以毫秒为单位)API

Get time difference (in Milliseconds accuracy) from remote server API

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

然而,在请求到达服务器之前以及我们的请求获得响应时当然存在延迟。当服务器响应 .555 时,也许恰好在我们服务器上的那一刻(并行地)已经 1600000000.602 或任何不同的时间)。

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

(p.s。语言并不重要 - phpnode-js)

您在此处使用 Internet,即连接的 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 身份验证器样式 TOTP 代码等等)都依赖于时间同步。

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