Zeitsynchronisation in Netwerken für Angeber: NTP und PTP


In verteilten Architekturen ist es oftmals notwendig, dass die unterschiedlichen Teilnehmer möglichst synchron zueinander arbeiten und eine gemeinsame Vorstellung der aktuellen Uhrzeit besitzen. Da Computersysteme bis auf Nanosekunden genau arbeiten können stellt die Zeitsynchronisation in solchen Netzwerken eine grosse Herausforderung dar. Das Problem ist nicht neu und wurde bereits auf verschiedenen Arten gelöst. In diesem Beitrag möchte ich die populärsten Protokolle NTP und PTP vorstellen.

Algorithmus von Cristian

Die Probleme bei der Zeitsynchronisation lassen sich anhand des Algorithmus von Cristian verdeutlichen.

In diesem Beispiel möchte der Client vom Server die aktuelle Uhrzeit erfragen. Er sendet dazu zum Zeitpunk t_0 eine Anfrage an den Server. Die Anfrage, welche durch das Netzwerk eine gewisse Zeit in Anspruch nimmt, kommt zum Zeitpunkt t_1 beim Server an. Der Server muss die Anfrage entgegennehmen, verarbeiten, seine eigene Uhrzeit t_{server} ablesen und eine Antwort erstellen. Diese wird zum Zeitpunkt t_2 wieder zurück an den Client geschickt. Bis diese dann letztendlich beim Client ankommt ist der Zeitpunkt t_3 erreicht. Anfrage und Antwort können je nach Auslastung des Netzwerks unterschiedlich lange dauern. Auch die Zeit zwischen t_1 und t_2 ist je nach Serverauslastung und Scheduling der Server-Threads unterschiedlich. Der Client kann nur mit Sicherheit sagen, dass der empfangene Zeitstempel t_{server} irgendwo zwischen t_0 und t_3 liegt. Alles andere bleibt ihm verborgen.

Der Algorithmus von Cristian nimmt nun pragmatisch an, dass sowohl die Anfrage wie auch die Antwort des Server gleich lange gedauert haben. Addiert man also die Hälfte dieser Zeit (Round Trip Time) auf den Zeitstempel t_{server}, so sollte man die genaue Zeit t_{real} ermitteln können.

(1)   \begin{gather*} t_{real} = t_{server} + \frac{t_3 - t_0}{2} \end{gather*}

Wie wir bereits erörtert haben stimmt diese Zeit nur näherungsweise. In realen Umgebungen mit unterschiedlicher Auslastung der Komponenten und Netzwerke kann diese Annahme zu erheblichen Differenzen führen.

Network Time Protocol

Das Network Time Protocol (NTP) wurde bereits 1985 von David L. Mills an der Universität von Delaware entwickelt. Es hat sich im Laufe der Zeit als das Standard-Protocol zur Zeitsynchronisation durchgesetzt und kommt in den meisten Rechnern zum Einsatz. Die aktuelle Version 4 lässt sich RFC 5905 entnehmen.

Das NTP basiert auf einem Netzwerk von Referenz-Uhren. Meist handelt es sich dabei um hochpräzise Atomuhren. Die Uhren liefern die Referenzzeit für die erste Schicht, Stratum 0 genannt, von NTP-Servern. Darauf aufbauend befinden sich hierarchisch angeordnet weitere Schichten von NTP-Servern. Jeder Server ist gleichzeitig ein Client für einen Server welcher sich auf einer höher gelegenen Schicht befindet. Diese erfragen die Zeit in regelmässigen Abständen und stellen ihre lokale Uhr danach ein.

Die Tiefe eines Stratum sagt dabei nichts über die Präzession der darin enthaltenen Uhren aus. Durch die dichtere Vernetzung von tieferen Schichten können die darin enthaltenen Uhren sogar genauer gehen als die in einer höheren Schicht. Während Stratum 0 Server nicht offiziell verfügbar sind, können private Netzwerke bereits auf Stratum 1 Server zugreifen und ein eigenes Stratum lokal einrichten.

Das NTP synchronisiert Uhrzeiten nicht direkt. Vielmehr korrigieren einzelne Server ihre Uhrzeiten nach und nach. Mit jedem empfangenen Zeitstempel wird die eigene Uhr ein klein wenig korrigiert. Dadurch ist es möglich die Zeitstempel von verschiedenen Server in die eigene Uhrzeit mit einzubeziehen. Gleichzeitig wird verhindert, dass einzelne Uhren abdriften. Die Abstände in der neue Zeitstempel aus einem höheren Stratum angefragt werden richtet sich dabei nach der aktuellen Abweichung eines Client. Ist diese gross, so werden häufiger Aktualisierungen durchgeführt als bei kleinen Abweichungen. Diese Regeln werden als Stepping und Slewing bezeichnet.

Weicht ein neuer Zeitstempel mehr als 17 Minuten von der Uhrzeit des Client ab, so wird dieser komplett ignoriert. Dies kann dazu führen, dass ein Client, welcher selbst eine grosse Abweichung besitzt niemals mit dem Netzwerk synchron wird.

Zeitstempel werden in NTP als zwei 32 Bit-Werte respäsentiert. Der erste Wert entspricht den Sekunden seit dem 1 Januar 1900 während der zweite Wert die Sekundenbruchteile darstellt. Für 32 Bit sind das 232 Bruchteile einer Sekunde, was ungefähr 2,33 Nanosekunden entspricht. Seit Version 4 sind Zeitstempel mit 64 Bit-Werten möglich, was zu einer Genauigkeit von 2-64 Sekunden führt.

Eine NTP-Nachricht enthält nicht nur einen Zeitstempel, sondern die Zeit der Ankunft der Nachfrage t_1 sowie wann diese vom Server zurück an den Client geschickt wurde t_2. Dadurch ist es dem Client exakt möglich die Zeitspanne d zu berechnen, die die Nachricht durch das Netzwerk gebraucht hat.

(2)   \begin{gather*} d = (t_3 - t_1) - (t_2 - t_1) \end{gather*}

Wie beim Algorithmus von Cristian wird angenommen, dass die Nachricht in beide Richtungen gleich lange durch das Netzwerk gebraucht hat, nämlich d/2. Die Abweichung o des Client kann daraufhin berechnet werden.

(3)   \begin{gather*} o = \frac{(t_1 - t_0) + (t_2 - t_3)}{2} \end{gather*}

Precision Time Protocol

Während das NTP auf globale Server für eine Synchronisation aller Geräte nach hochgenauen Atomuhren setzt, geht das Precision Time Protocol (PTP) einen Schritt zurück. Es ist dazu ausgelegt einzelne Geräte innerhalb eines kleinen beschränkten Netzwerkes zu synchronisieren. Hierbei geht es mehr um Genauigkeit untereinander als zu einer globalen Weltzeit. Die genaue Definition befindet sich in IEEE 1588.

Ein weiterer Unterschied besteht darin, dass ein Schichtenmodel wie bei NTP keine Verwendung findet. Vielmehr handeln einzelne Teilnehmer untereinander die Master-Slave-Beziehung aus. Dadurch entsteht ebenfalls eine Hierarchie, diese ist jedoch nicht so strikt wie beim NTP. Um den Master zu ermitteln wird der Best Master Clock Algorithmus verwendet. Dieser vergleicht unterschiedliche Parameter und entscheidet dann über die Beziehung. Einer dieser Parameter ist die Genauigkeit der eigenen Uhr. Zudem gibt es Parameter wie etwa die Priorität oder die Identität der vorgelagerten Uhren, um einen Loop zu vermeiden. Die beste Uhr im Netzwerk wird als Grandmaster bezeichnet.

M: Master, S: Slave, P: Passiv

Eine Ungenauigkeit bei der Übertragung von Zeitstempeln besteht nicht nur in der Latenz der Netzwerke, sondern auch im Netzwerk-Stack direkt. Wird eine Nachricht erstellt, so kann es durchaus einige Zeit dauern bis die darunterliegende Hardware diese ins Netzwerk stellt. Um diesem zeitlichen Versatz entgegen zu wirken sendet der Zeitserver (Master) in zeitlichen Abständen Synchronisationsnachrichten t_{0} und ermittelt anschliessend wann diese wirklich durch seine Hardware versandt wurden und sendet den Zeitstempel dieser Verzögerung t'_0 ebenfalls an den Client (Slave). Für Hardware-Implementierungen von PTP ist die zweite Nachricht nicht nötig.

Der Client sendet daraufhin eine Nachricht zum Zeitpunkt t_2 an den Server, welcher wiederum mit dem Zeitstempel antwortet, wann dieser von ihm empfangen wurde t_3. Der Offset d berechnet sich dann analog zu der Berechnung aus dem NTP, nur das die Zeitstempel von Client und Server vertauscht wurden.

(4)   \begin{gather*} o = \frac{(t_1 - t'_0) + (t_2 - t_3)}{2} \end{gather*}