客户端设备时钟与服务器时钟的精确比较可达数毫秒
我正在寻找一种方法来获得客户端时钟和服务器时钟之间的差异。
直到现在我已经尝试了以下方法。
搜罗:
问题是我们在到达服务器的请求和到达客户端的响应之间得到了未知的延迟。
下面是使用JavaScript和PHP的这个方案的一个实现:
time.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
}
}
Sync.php
<?php
$receive = round(microtime(true) * 1000);
echo $_POST["original"] . '|';
echo $receive . '|';
echo round(microtime(true) * 1000);
?>
即使有了这种方法,我得到50-500毫秒的错误。 如果延迟很高,错误会更多。
但我想知道一家名为“adtruth”的公司如何声称他们能够根据时钟时间区分设备。 他们称之为“时差链接”设备识别的关键AdTruth-style是其专利技术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
其实很简单,首先让客户计算一个固定的时间 - 2005年1月31日,18:34:20.050(以毫秒为单位)。 然后计算客户端机器上的时间(当前时间)并计算当前时间与固定时间之间的增量。 将客户端时间和三角洲发送回服务器。 在服务器上,从相同的固定时间开始,如果添加相同的增量,那么服务器当前时间(由于响应时间延迟等原因不再是当前时间)是什么。 客户端当前时间和服务器当前时间之间的差异会给你客户端和服务器之间的时间差异。
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);
}
看起来他们简单地忽略了描述中网络滞后的问题。 我注意到他们(模糊)的措辞:
(...)基于确定匹配[时间差]参数落入所选范围 (...)
这可能导致网络滞后变化。
在诸如互联网这样的大型繁忙网络中,不可能将精度“降至毫秒”。 其他网络类型(我正在考虑令牌环或具有非常非常严格的QoS策略的网络)可能会允许这种级别的精度。
链接地址: http://www.djcxy.com/p/15113.html上一篇: compare client device clock with server clock exactly upto milliseconds