2013-08-07 7 views
7

Znajduję sposób, aby uzyskać różnicę między zegarem klienta i zegarem serwera.Porównanie zegara urządzenia klienckiego z zegarem serwera dokładnie do milisekund

Do tej pory próbowałem następujące podejście.

wchłaniania:

  1. czas żądanie klienta
  2. czas serwera
  3. czas reakcji klient

problemem jest dostać nieznanego opóźnienia między żądaniem dotrzeć serwer i odpowiedzi do osiągnięcia klienta.

Oto realizacja tego programu za pomocą JavaScript i 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); 
?> 

nawet z takim podejściem i uzyskać 50-500 błąd ms . Jeśli opóźnienie jest wysokie, błąd będzie większy.

Ale zastanawiam się, jak firma o nazwie "adtruth" twierdzi, że była w stanie odróżnić urządzenia na podstawie czasu zegarowego. nazywają to "Łączeniem Różnic Czasu". Kluczem do rozpoznawania urządzeń w stylu AdTruth jest opatentowana technologia TDL, służąca do różnicowania czasu. Podczas gdy w miliardach podłączonych urządzeń mogą znajdować się tysiące z tą samą konfiguracją, żadne dwa zegary nie będą ustawione w tym samym czasie - przynajmniej nie wtedy, gdy spadnie do milisekundy. Mówi Ori Eisen, założyciel 41. parametru i AdTruth: "Odbieramy te różne znaczniki czasu i porównujemy je z zegarem głównym serwera .Jeśli jest jakakolwiek wątpliwość, TDL jest łącznikiem".

http://www.admonsters.com/blog/adtruth-joins-w3c-qa-ori-eisen-founder-and-chief-innovation-officer

Oto link do ich "Czas różnica łączącego" patent

http://www.google.com/patents/US7853533

Odpowiedz

0

Wygląda na to, że po prostu zignorować problem opóźnienia sieciowego w ich opisie. I zauważyć ich sformułowania (niejasne):

(...), w oparciu o ustalenie, że dopasowanie [delta momencie] parametru wchodzi w wybranym zakresie (...)

Może to tłumaczyć różnice w sieci.

W dużej, zajętej sieci, takiej jak Internet, nie można zwiększyć dokładności "do milisekundy". Inne rodzaje sieci (myślę, że Token Ring lub sieci z bardzo, bardzo surowymi zasadami QoS) mogą pozwolić na taki poziom precyzji.

1
var oneway = roundtrip/2; 

Dlaczego zakładasz, że sieć jest symetryczna?W rzeczywistości jest to dość rozsądne założenie - możesz spróbować skalibrować połączenie, wysyłając dane w obu kierunkach, aby uzyskać szacunkową przepustowość i opóźnienie (patrz boomerang's bw module dla przykładu pomiaru serwer-klient), jednak podstawową cechą TCP jest to, że okno przeciążenia dostosowuje się stopniowo - a więc nawet w przypadku połączenia statycznego, zmiany przepustowości znacznie się zmieniają we wczesnych etapach połączenia (dokładnie w punkcie, w którym prawdopodobnie spróbujesz przechwycić tożsamość urządzenia klienta).

Czy próbujesz upewnić się, że odpowiedź jest mniejsza niż 1kb, w tym nagłówków (aby upewnić się, że pasuje w jednym pakiecie) i że żyjesz jest włączony. Żądanie GET będzie nieco mniejsze niż POST, chociaż użycie websockets dałoby dokładniejszą liczbę.

Bardziej realistycznym podejściem byłoby wychwycenie kilku próbek w znanych odstępach czasu przechwytywania, a następnie obliczanie średniej, np.

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

Jego całkiem proste, najpierw klient obliczyć stałą czasu - 2005 Jan 31, 18: 34: 20,050 (w milisekundach sekund). Następnie obliczyć czas na komputerze klienta (bieżący czas) i obliczyć różnicę między bieżącym czasem i ustalonym czasem. Wyślij czas klienta i deltę z powrotem na serwer. Na serwerze, z tego samego ustalonego czasu, jeśli dodasz tę samą różnicę, jaki byłby bieżący czas serwera (już nie bieżący z powodu opóźnienia czasu odpowiedzi itp.). Różnica między bieżącym czasem klienta a czasem bieżącym serwera daje różnicę czasu między klientem a serwerem.

+0

Całkowicie zignorowałem tę odpowiedź w tym czasie. Naprawdę ma to sens. +1 dla ciebie –

Powiązane problemy