J o: Javascript Date Zeitdifferenz

Guten Abend zusammen,

Da ich das Wochenende endlich mal wieder ein wenig Zeit gefunden habe, bin ich auch prompt auf ein mir zunächst unverständliches Problem gestoßen.

Kurz grob zum Programm Aufbau/Ablauf: Ich probiere mich an einer Node.js Application mit einem Websocket über socket.io. Sprich ständig werden Daten zwischen Server und Client hin und her geschoben. Das sieht dann so aus, dass der Client irgendwas beim Server nachfragt und Daten bekommt und diese dann verarbeitet. Wenn beim Client ein Event eintritt, dies kann vom Nutzer oder auch eigenständig durch die Daten hervorgerufen werden, dann wird ein erneuter Request an den Server geschickt um die Daten in der Datenbank sowie beim Client auf den neusten Stand zu setzen.

Nun konnte ich durch stundenlanges durchforsten der Daten herausfinden, dass die Zeit von Client und Server unterschiedlich sind, meist im Bereich von 1-2 Sekunden.

Die Zeit wird sowohl auf dem Client als auch auf dem Server mit:

var now = new Date().getTime();

bestimmt.

Nun zu den eigentlichen Fragen. Erstens wie entsteht diese Differenz? Und Zweitens wie kann man alle Clients mit dem Server synchronisieren.

(Eine Idee die ich gerade habe ist, dass der Client seinen Timestamp mit zum Server schickt und dieser dann mit einem Timeout wartet.)

Gruß
Jo

  1. Tach!

    Erstens wie entsteht diese Differenz?

    Wie bekommen die Rechner überhaupt ihre Zeit? Zählen sie selbst oder synchronisieren sie sich regelmäßig?

    Und Zweitens wie kann man alle Clients mit dem Server synchronisieren.

    Über NTP. Aber du kannst auch alle Beteiligten mit öffentlichen NTP-Servers synchronisieren. Wenn du jedoch keinen Zugriff auf die Clients hast, dann wird's schwer. Aber schau erstmal, ob auf dem Server eine ständige Synchronisierung läuft, und nicht nur eine zum Serverstart oder gar keine.

    dedlfix.

    1. Hey,

      Erstens wie entsteht diese Differenz?

      Wie bekommen die Rechner überhaupt ihre Zeit? Zählen sie selbst oder synchronisieren sie sich regelmäßig?

      Da fragst du mich etwas. Dachte die zählen selbst und synchonisieren sich in regelmäßigen Zeitabständen oder zumindest beim booten.

      Und Zweitens wie kann man alle Clients mit dem Server synchronisieren.

      Über NTP. Aber du kannst auch alle Beteiligten mit öffentlichen NTP-Servers synchronisieren. Wenn du jedoch keinen Zugriff auf die Clients hast, dann wird's schwer. Aber schau erstmal, ob auf dem Server eine ständige Synchronisierung läuft, und nicht nur eine zum Serverstart oder gar keine.

      Auf dem Server läuft derzeit CentOS 7 sprich etwas wie :

      yum install ntp
      chkconfig ntpd on
      ntpdate 0.europe.pool.ntp.org
      /etc/init.d/ntpd start

      richtig? Wie schaue ich sonst wie oder ob die Zeit synchronisiert wird?

      Hatte gerade auch die Überlegung, dass der Server seine Zeit zum Client schickt und der Client mit dieser Zeit rechnet, und nicht mit seiner eigenen.

      Gruß
      Jo

      1. Tach!

        Wie bekommen die Rechner überhaupt ihre Zeit? Zählen sie selbst oder synchronisieren sie sich regelmäßig?

        Da fragst du mich etwas. Dachte die zählen selbst und synchonisieren sich in regelmäßigen Zeitabständen oder zumindest beim booten.

        Das ist je nach Betriebssystem und Individualkonfiguration anders.

        Wenn es nur beim Booten synchronisiert, dann hat der Rechner genug Chancen wegzulaufen, je länger er läuft desto mehr.

        Auf dem Server läuft derzeit CentOS 7 sprich etwas wie :

        yum install ntp
        chkconfig ntpd on
        ntpdate 0.europe.pool.ntp.org
        /etc/init.d/ntpd start

        richtig? Wie schaue ich sonst wie oder ob die Zeit synchronisiert wird?

        ntpd ist auf alle Fälle ein Dienst, der ständig läuft. ntpdate aber setzt die Zeit nur einmalig. Du müsstest einen Server in der /etc/ntp.conf eintragen oder zumindest prüfen, dass da was passendes drin steht und gegebenenfalls korrigieren.

        Bei Centos 7 konfiguriert man das Startverhalten von Services mit systemctl. chkconfig war für ältere Systeme. Auch zum Starten/stoppen sollte man systemctl nehmen.

        dedlfix.

        1. Hey,

          ntpd ist auf alle Fälle ein Dienst, der ständig läuft. ntpdate aber setzt die Zeit nur einmalig. Du müsstest einen Server in der /etc/ntp.conf eintragen oder zumindest prüfen, dass da was passendes drin steht und gegebenenfalls korrigieren.

          Bei Centos 7 konfiguriert man das Startverhalten von Services mit systemctl. chkconfig war für ältere Systeme. Auch zum Starten/stoppen sollte man systemctl nehmen.

          Danke schön, hab da etwas gefunden. Werd ich mir dann mal genauer anschauen wenn ich wieder Zeit hab.

          Gruß
          Jo

      2. Mahlzeit,

        Wie schaue ich sonst wie oder ob die Zeit synchronisiert wird?

        ntpq -p damit sollte die die Zeitdifferenz zu allen Zeitservern angezeigt werden. Ob ntpd läuft, kannst du per ps rausfinden.

        Hatte gerade auch die Überlegung, dass der Server seine Zeit zum Client schickt und der Client mit dieser Zeit rechnet, und nicht mit seiner eigenen.

        Das kommt auf deine Anwendung an, welche Zeit du brauchst. Wenn es für dich wichtig ist, wann deine Daten auf dem Server verarbeitet wurden, lässt du dir ne Timestamp mit schicken und benutzt die. Gilt natürlich auch in umgekehrter Richtung.

        --
        42
  2. Hallo,

    könnte das die Folge der Laufzeit zwischen Server und Client sein?

    Gruß
    Jürgen

    1. Hey,

      könnte das die Folge der Laufzeit zwischen Server und Client sein?

      Nein. Die Laufzeit von Cleint zu Server und wieder zurück beträgt nur etwa 200 bis 500 Millisekunden. Doch der Server läuft etwa 2 Sekunden nach der Zeit vom Client (also derzeit mein Rechner der direkt daneben steht).

      Gruß
      Jo