我正在寻找一种方法来区分客户端时钟和服务器时钟。
到目前为止,我已经尝试了以下方法。
收集:
- 客户请求时间
- 服务器时间
- 客户响应时间
问题是我们在请求到达服务器和响应到达客户端之间得到未知的延迟。
下面是使用 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
这是他们的“时差链接”专利的链接