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
}
}

同期.php

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

このアプローチでも、50〜500ミリ秒のエラーが発生します。遅延が大きい場合、エラーはさらに大きくなります。

しかし、「adtruth」という名前の会社が、時計の時間に基づいてデバイスを区別できたとどのように主張しているのか疑問に思います。彼らはそれを「時間差分リンク」と呼んでいます AdTruth スタイルのデバイス認識の鍵は、時間差分リンクのための TDL と呼ばれる特許取得済みの技術です。何十億もの接続されたデバイスの中に同じ構成の何千ものデバイスがあるかもしれませんが、時計が同じ時刻に設定されているものは 2 つとありません。41st Parameter と AdTruth の創設者である Ori Eisen 氏は次のように述べています。

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;

ネットワークが対称的であると仮定するのはなぜですか? 実際にはかなり合理的な仮定です - データを両方向に送信して接続を調整し、スループットとレイテンシーの見積もりを取得することができます (サーバークライアント測定の例については、ブーメランの bw モジュールを参照してください)。ただし、TCP の基本的な機能は輻輳ウィンドウが徐々に適応するということです。したがって、静的接続でも、接続の初期段階でスループットが著しく変化します (まさに、クライアント デバイスの ID を取得しようとする可能性が高いポイントです)。

応答がヘッダーを含めて 1kb 未満であること (単一のパケットに収まるようにするため) と、キープアライブが有効になっていることを確認してください。GET リクエストは POST よりもわずかに小さくなりますが、Websocket を使用するとより正確な数値が得られます。

より現実的なアプローチは、既知の間隔でいくつかのサンプルをキャプチャしてから平均を計算することです。

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