Zum Hauptinhalt springen

8. On-Wire Protocol (On-Wire-Protokoll)

Das Herzstück des NTP-On-Wire-Protokolls ist der Kernmechanismus (core mechanism), der Zeitwerte zwischen Servern, Peers und Clients austauscht. Es ist von Natur aus resistent gegen verlorene oder duplizierte Pakete. Die Datenintegrität wird durch die IP- und UDP-Prüfsummen bereitgestellt. Es werden keine Flusskontroll- oder Neuübertragungseinrichtungen bereitgestellt oder sind erforderlich. Das Protokoll verwendet Zeitstempel (timestamps), die entweder aus Paket-Headern extrahiert oder bei Ankunft oder Abgang eines Pakets von der Systemuhr abgeleitet werden. Zeitstempel sind Präzisionsdaten und sollten im Fall einer Neuübertragung auf Verbindungsebene neu abgeleitet und für die Zeit zur Berechnung eines MAC bei der Übertragung korrigiert werden.

NTP-Nachrichten verwenden zwei verschiedene Kommunikationsmodi, Eins-zu-Eins und Eins-zu-Viele (one-to-one and one-to-many), die üblicherweise als Unicast und Broadcast bezeichnet werden. Für die Zwecke dieses Dokuments wird der Begriff Broadcast als jeder verfügbare Eins-zu-Viele-Mechanismus interpretiert. Für IPv4 entspricht dies entweder IPv4-Broadcast oder IPv4-Multicast. Für IPv6 entspricht dies IPv6-Multicast. Zu diesem Zweck hat die IANA die IPv4-Multicast-Adresse 224.0.1.1 und die IPv6-Multicast-Adresse mit der Endung :101 zugewiesen, wobei das Präfix durch Scoping-Regeln bestimmt wird. Jede andere nicht zugewiesene Multicast-Adresse kann zusätzlich zu diesen zugewiesenen Multicast-Adressen ebenfalls verwendet werden.

Das On-Wire-Protokoll verwendet vier Zeitstempel, die von t1 bis t4 nummeriert sind, und drei Zustandsvariablen org, rec und xmt, wie in Abbildung 15 dargestellt. Diese Abbildung zeigt den allgemeinsten Fall, in dem jeder von zwei Peers, A und B, unabhängig den Versatz und die Verzögerung relativ zum anderen misst. Zu Illustrationszwecken werden die Paket-Zeitstempel in Kleinbuchstaben und die Zustandsvariablen in Großbuchstaben angezeigt. Die Zustandsvariablen werden bei Ankunft oder Abgang eines Pakets aus den Paket-Zeitstempeln kopiert.

          t2            t3           t6            t7
+---------+ +---------+ +---------+ +---------+
| 0 | | t1 | | t3 | | t5 |
+---------+ +---------+ +---------+ +---------+
| 0 | | t2 | | t4 | | t6 | Packet
+---------+ +---------+ +---------+ +---------+ Timestamps
| t1 | |t3=clock | | t5 | |t7=clock |
+---------+ +---------+ +---------+ +---------+
|t2=clock | |t6=clock |
+---------+ +---------+
Peer B
+---------+ +---------+ +---------+ +---------+
org | T1 | | T1 | | t5<>T1? | | T5 |
+---------+ +---------+ +---------+ +---------+ State
rec | T2 | | T2 | | T6 | | T6 | Variables
+---------+ +---------+ +---------+ +---------+
xmt | 0 | | T3 | | t3=T3? | | T7 |
+---------+ +---------+ +---------+ +---------+

t2 t3 t6 t7
---------------------------------------------------------
/\ \ /\ \
/ \ / \
/ \ / \
/ \/ / \/
---------------------------------------------------------
t1 t4 t5 t8

t1 t4 t5 t8
+---------+ +---------+ +---------+ +---------+
| 0 | | t1 | | t3 | | t5 |
+---------+ +---------+ +---------+ +---------+
| 0 | | t2 | | t4 | | t6 | Packet
+---------+ +---------+ +---------+ +---------+ Timestamps
|t1=clock | | t3 | |t5=clock | | t7 |
+---------+ +---------+ +---------+ +---------+
|t4=clock | |t8=clock |
+---------+ +---------+
Peer A
+---------+ +---------+ +---------+ +---------+
org | 0 | | t3<>0? | | T3 | | t7<>T3? |
+---------+ +---------+ +---------+ +---------+ State
rec | 0 | | T4 | | T4 | | T8 | Variables
+---------+ +---------+ +---------+ +---------+
xmt | T1 | | t1=T1? | | T5 | | t5=T5? |
+---------+ +---------+ +---------+ +---------+

Abbildung 15: On-Wire-Protokoll

In der Abbildung enthält das erste von A übertragene Paket nur den Ursprungs-Zeitstempel (origin timestamp) t1, der dann nach T1 kopiert wird. B empfängt das Paket bei t2 und kopiert t1 nach T1 und den Empfangs-Zeitstempel t2 nach T2. Zu diesem Zeitpunkt oder zu einem späteren Zeitpunkt bei t3 sendet B ein Paket an A, das t1 und t2 sowie den Sende-Zeitstempel t3 enthält. Alle drei Zeitstempel werden in die entsprechenden Zustandsvariablen kopiert. A empfängt das Paket bei t4, das die drei Zeitstempel t1, t2 und t3 sowie den Ziel-Zeitstempel t4 enthält. Diese vier Zeitstempel werden verwendet, um den Versatz und die Verzögerung von B relativ zu A zu berechnen, wie unten beschrieben.

Bevor die xmt- und org-Zustandsvariablen aktualisiert werden, werden zwei Plausibilitätsprüfungen (sanity checks) durchgeführt, um vor duplizierten, gefälschten oder wiederholten Paketen zu schützen. Im obigen Austausch ist ein Paket dupliziert oder wiederholt, wenn der Sende-Zeitstempel t3 im Paket mit der org-Zustandsvariablen T3 übereinstimmt. Ein Paket ist gefälscht, wenn der Ursprungs-Zeitstempel t1 im Paket nicht mit der xmt-Zustandsvariablen T1 übereinstimmt. In beiden Fällen werden die Zustandsvariablen aktualisiert und das Paket dann verworfen. Um vor Wiederholung des zuletzt übertragenen Pakets zu schützen, wird die xmt-Zustandsvariable unmittelbar nach einer erfolgreichen Fälschungsprüfung auf Null gesetzt.

Die vier neuesten Zeitstempel, T1 bis T4, werden verwendet, um den Versatz (offset) von B relativ zu A zu berechnen

theta = T(B) - T(A) = 1/2 * [(T2-T1) + (T3-T4)]

und die Rundlaufverzögerung (round-trip delay)

delta = T(ABA) = (T4-T1) - (T3-T2).

Beachten Sie, dass die Mengen in Klammern aus 64-Bit vorzeichenlosen Zeitstempeln berechnet werden und zu vorzeichenbehafteten Werten mit 63 signifikanten Bits plus Vorzeichen führen. Diese Werte können Daten von 68 Jahren in der Vergangenheit bis 68 Jahre in der Zukunft darstellen. Allerdings werden Versatz und Verzögerung als Summen und Differenzen dieser Werte berechnet, die 62 signifikante Bits und zwei Vorzeichenbits enthalten, sodass sie eindeutige Werte von 34 Jahren in der Vergangenheit bis 34 Jahre in der Zukunft darstellen können. Mit anderen Worten, die Zeit des Clients muss innerhalb von 34 Jahren des Servers eingestellt werden, bevor der Dienst gestartet wird. Dies ist eine grundlegende Einschränkung mit 64-Bit-Ganzzahlarithmetik.

In Implementierungen, in denen Gleitkomma-Doppelpräzisionsarithmetik (floating double arithmetic) verfügbar ist, können die Differenzen erster Ordnung in Gleitkomma-Doppelpräzision umgewandelt werden, und die Summen und Differenzen zweiter Ordnung können in dieser Arithmetik berechnet werden. Da die Terme zweiter Ordnung typischerweise sehr klein im Verhältnis zu den Zeitstempelgrößen sind, gibt es keinen Signifikanzverlust, aber der eindeutige Bereich wird von 34 Jahren auf 68 Jahre wiederhergestellt.

In einigen Szenarien, in denen der anfängliche Frequenzversatz des Clients relativ groß und die tatsächliche Ausbreitungszeit klein ist, ist es möglich, dass die Verzögerungsberechnung negativ wird. Wenn beispielsweise die Frequenzdifferenz 100 ppm beträgt und das Intervall T4-T1 64 s beträgt, beträgt die scheinbare Verzögerung -6,4 ms. Da negative Werte in nachfolgenden Berechnungen irreführend sind, sollte der Wert von delta nicht kleiner als s.rho geklammert werden, wobei s.rho die in Abschnitt 11.1 beschriebene Systempräzision ist, ausgedrückt in Sekunden.

Die obige Diskussion geht vom allgemeinsten Fall aus, in dem zwei symmetrische Peers unabhängig die Versätze und Verzögerungen zwischen ihnen messen. Im Fall eines zustandslosen Servers (stateless server) kann das Protokoll vereinfacht werden. Ein zustandsloser Server kopiert T3 und T4 vom Client-Paket zu T1 und T2 des Server-Pakets und fügt den Sende-Zeitstempel T3 hinzu, bevor er ihn an den Client sendet. Zusätzliche Details zum Ausfüllen der verbleibenden Protokollfelder sind in Abschnitt 9 und den folgenden Abschnitten sowie im Anhang angegeben.

Beachten Sie, dass das wie beschrieben On-Wire-Protokoll der Wiederholung eines Server-Antwortpakets widersteht. Es widersteht jedoch nicht der Wiederholung des Client-Anforderungspakets, was zu einem Server-Antwortpaket mit neuen Werten von T2 und T3 führen und zu einem falschen Versatz und einer falschen Verzögerung führen würde. Diese Schwachstelle kann vermieden werden, indem die xmt-Zustandsvariable nach Berechnung des Versatzes und der Verzögerung auf Null gesetzt wird.