7

我正在寻找一种方法来区分客户端时钟和服务器时钟。

到目前为止,我已经尝试了以下方法。

收集:

  1. 客户请求时间
  2. 服务器时间
  3. 客户响应时间

问题是我们在请求到达服务器和响应到达客户端之间得到未知的延迟。

下面是使用 JavaScript 和 PHP 实现的这个方案:

时间.js

var request = new XMLHttpRequest();
request.onreadystatechange = readystatechangehandler;
request.open("POST", "http://www.example.com/sync.php", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send("original=" + (new Date).getTime());

function readystatechangehandler() {
var returned = (new Date).getTime();
if (request.readyState === 4 && request.status === 200) {
    var timestamp = request.responseText.split('|');
    var original = + timestamp[0];
    var receive = + timestamp[1];
    var transmit = + timestamp[2];
    var sending = receive - original;
    var receiving = returned - transmit;
    var roundtrip = sending + receiving;
    var oneway = roundtrip / 2;
    var difference = sending - oneway; // this is what you want
    // so the server time will be client time + difference
}
}

同步.php

<?php
$receive = round(microtime(true) * 1000);
echo $_POST["original"] . '|';
echo $receive . '|';
echo round(microtime(true) * 1000);
?>

即使使用这种方法,我也会得到 50-500 毫秒的错误。如果延迟高,则误差会更大。

但我想知道一家名为“adtruth”的公司如何声称他们能够根据时钟时间区分设备。他们称其为“时差链接” 设备识别 AdTruth 风格的关键是其名为 TDL 的专利技术,用于时差链接。虽然在数十亿台连接的设备中可能有数千台具有相同的配置,但没有两个设备的时钟会设置为相同的时间——至少,当您将其降低到毫秒时不会。41st Parameter 和 AdTruth 的创始人 Ori Eisen 说:“我们采用这些不同的时间戳并将它们与服务器主时钟进行比较。如果有任何疑问,TDL 就是决胜局。”

http://www.admonsters.com/blog/adtruth-joins-w3c-qa-ori-eisen-founder-and-chief-innovation-officer

这是他们的“时差链接”专利的链接

http://www.google.com/patents/US7853533

4

3 回答 3

2

它实际上很简单,首先让客户端计算一个固定时间 - 2005 年 1 月 31 日 18:34:20.050(以毫秒为单位)。然后计算客户端机器上的时间(当前时间)并计算当前时间和固定时间之间的增量。将客户端时间和增量发送回服务器。在服务器上,从相同的固定时间开始,如果添加相同的增量,服务器当前时间(由于响应时间滞后等原因不再是当前时间)是多少。客户端当前时间和服务器当前时间之间的差异将为您提供客户端和服务器之间的时间差。

于 2014-11-04T22:02:04.117 回答
1
var oneway = roundtrip / 2;

为什么你认为网络是对称的?实际上这是一个相当合理的假设 - 您可以尝试通过在两个方向上发送数据来校准连接,以估计吞吐量和延迟(参见Boomerang 的 bw 模块以获取服务器 - 客户端测量的示例)但是 TCP 的基本功能是拥塞窗口逐渐适应 - 因此即使在静态连接上,吞吐量在连接的早期阶段也会发生显着变化(正是您可能尝试捕获客户端设备身份的点)。

请尝试确保响应小于 1kb,包括标头(以确保它适合单个数据包)并启用保持活动。GET 请求将比 POST 略小,尽管使用 websockets 会给出更准确的数字。

一种更现实的方法是在已知间隔捕获几个样本,然后计算平均值,例如

estmatedRtt=300;
for (var x=0; x<10; x++) {
    setTimeout(estimatedRtt * x * 1.3, captureOffset);
}
于 2013-08-12T16:37:34.400 回答
0

看起来他们只是在描述中忽略了网络滞后的问题。我注意到他们的(含糊的)措辞:

(...) 基于匹配的[时间增量]参数落在所选范围内的确定(...)

这可以解释网络延迟变化。

Over a large, busy network such as the Internet, it is not possible to bring the accuracy "down to the millisecond". Other network types (I'm thinking Token Ring or networks with very, very strict QoS policies) might allow this level of precision.

于 2013-08-12T13:17:24.043 回答