2013-08-07 71 views
7

我正在找到一种方法来获取客户端时钟和服务器时钟之间的差异。比较客户端设备时钟和服务器时钟精确到毫秒

直到现在我已经尝试了以下方法。

搜罗:

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

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

下面是使用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风格是其专利技术TDL,用于时差连接。在数十亿台连接的设备中,可能会有数千台配置相同的设备,但没有两台设备的时钟设置为同一时间 - 至少,不会将时间设置为毫秒。 012r41st 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

回答

0

看起来,他们根本无视其描述网络滞后的问题。我注意到他们的(模糊)措辞:

基于该参数匹配 [时间增量]落入所选范围(...)

内的判定

(...)

这可能导致网络延迟变化。

在互联网等大型,繁忙的网络中,不可能将精度“降至毫秒”。其他网络类型(我正在考虑令牌环或非常网络,非常严格的QoS策略)可能会允许这个级别的精度。

1
var oneway = roundtrip/2; 

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

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

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

estmatedRtt=300; 
for (var x=0; x<10; x++) { 
    setTimeout(estimatedRtt * x * 1.3, captureOffset); 
} 
1

其实很简单,先让客户计算一个固定时间 - 2005年1月31日18:34:20.050(以毫秒为单位)。然后计算客户端机器上的时间(当前时间)并计算当前时间与固定时间之间的增量。将客户端时间和三角洲发送回服务器。在服务器上,从相同的固定时间开始,如果添加相同的增量,那么服务器当前时间(由于响应时间延迟等原因不再是当前时间)是什么。客户端当前时间和服务器当前时间之间的差异会给你客户端和服务器之间的时间差异。

+0

那时我完全忽略了这个答案。真的很有意义。为你+1 –