我正在寻找一种方法来获得客户端时钟和服务器时钟之间的区别。
到目前为止,我已经尝试了以下方法。
收集:
问题是在到达服务器的请求和到达客户端的响应之间存在未知的延迟。
下面是使用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,用于时间差连接。在数十亿台连接的设备中,可能有数千台配置相同的时钟,但没有两台会把时钟设置在同一时间--至少当你把时钟降到毫秒时就不会了。41 Parameter和AdTruth的创始人奥利·艾森说:“我们把这些完全不同的时间戳与服务器主时钟进行比较,如果有任何疑问的话,TDL就是平局。”
http://www.admonsters.com/blog/adtruth-joins-w3c-qa-ori-eisen-founder-and-chief-innovation-officer
这是他们的“时间差链接”专利的链接。
http://www.google.com/patents/US7853533
发布于 2014-11-04 22:02:04
它实际上很简单,首先有客户计算一个固定的时间-2005年1月31日,18:34:20.050 (以毫秒计)。然后计算客户端计算机上的时间(当前时间),并计算当前时间和固定时间之间的增量。将客户端时间和增量发送回服务器。在服务器上,从相同的固定时间,如果添加相同的增量,服务器当前时间(由于响应时间滞后等而不再是当前时间)是什么。客户端当前时间和服务器当前时间之间的差异将给出客户机和服务器之间的时间差。
发布于 2013-08-12 16:37:34
var oneway = roundtrip / 2;你为什么认为网络是对称的?实际上,这是一个相当合理的假设--您可以尝试通过向两个方向发送数据来校准连接,以获得吞吐量和延迟的估计(关于服务器-客户端度量的示例,请参见回旋镖生物武器模块 ),然而TCP的一个基本特性是拥塞窗口是逐步适应的--因此,即使在静态连接上,在连接的早期阶段(可能尝试并捕获客户端设备标识的点)吞吐量也会显著变化。
一定要确保响应小于1kb,包括报头(以确保它适合于单个数据包),并且保持活动状态是启用的。GET请求将比POST稍微小一些,尽管使用websockets会给出更准确的数字。
一种更现实的方法是以已知的间隔捕获几个样本,然后计算平均值。
estmatedRtt=300;
for (var x=0; x<10; x++) {
setTimeout(estimatedRtt * x * 1.3, captureOffset);
}发布于 2013-08-12 13:17:24
看起来他们在描述中完全忽略了网络滞后的问题。我注意到它们(含糊不清)的措辞:
(...)根据确定匹配的时间参数在选定范围内,(.)
这可能是网络滞后变化的原因。
在像互联网这样的大型繁忙网络上,不可能把准确度“降到毫秒”。其他网络类型(我认为令牌环或具有非常、非常严格的QoS策略的网络)可能允许这种级别的精度。
https://stackoverflow.com/questions/18103341
复制相似问题