Zum Hauptinhalt springen

7. Data Structures (Datenstrukturen)

Die NTP-Zustandsmaschinen sind in den folgenden Abschnitten definiert. Zustandsvariablen sind gemäß ihrer Funktion in Paket-Headern, Peer- und Abfrageprozessen, dem Systemprozess und dem Uhrenkontrollprozess in Klassen unterteilt. Paketvariablen (Packet variables) repräsentieren die NTP-Header-Werte in gesendeten und empfangenen Paketen. Peer- und Abfragevariablen (Peer and poll variables) repräsentieren den Inhalt der Assoziation für jeden Server separat. Systemvariablen (System variables) repräsentieren den Zustand des Servers, wie er von seinen abhängigen Clients gesehen wird. Uhrenkontrollvariablen (Clock discipline variables) repräsentieren die internen Abläufe des Uhrenkontrollalgorithmus. Ein Beispiel wird in Anhang A beschrieben.

7.1. Structure Conventions (Strukturkonventionen)

Um zwischen verschiedenen Variablen desselben Namens, die aber in verschiedenen Prozessen verwendet werden, zu unterscheiden, wird die in Abbildung 5 zusammengefasste Namenskonvention übernommen. Eine Empfangspaket-Variable v ist ein Mitglied der Paketstruktur r mit vollqualifiziertem Namen r.v. In ähnlicher Weise ist x.v eine Sendepaket-Variable, p.v eine Peer-Variable, s.v eine Systemvariable und c.v eine Uhrenkontrollvariable. Es gibt einen Satz von Peer-Variablen für jede Assoziation; es gibt nur einen Satz von System- und Uhrenvariablen.

NameBeschreibung (Description)
r.Empfangspaket-Header-Variable (receive packet header variable)
x.Sendepaket-Header-Variable (transmit packet header variable)
p.Peer/Abfrage-Variable (peer/poll variable)
s.Systemvariable (system variable)
c.Uhrenkontrollvariable (clock discipline variable)

Abbildung 5: Präfixkonventionen

7.2. Global Parameters (Globale Parameter)

Zusätzlich zu den Variablenklassen werden in diesem Dokument eine Reihe von globalen Parametern definiert, einschließlich derjenigen, die mit Werten in Abbildung 6 dargestellt sind.

NameWert (Value)Beschreibung (Description)
PORT123NTP-Portnummer (NTP port number)
VERSION4NTP-Versionsnummer (NTP version number)
TOLERANCE15e-6Frequenztoleranz PHI (frequency tolerance PHI, s/s)
MINPOLL4Minimaler Abfrageexponent (minimum poll exponent, 16 s)
MAXPOLL17Maximaler Abfrageexponent (maximum poll exponent, 36 h)
MAXDISP16Maximale Dispersion (maximum dispersion, 16 s)
MINDISP.005Minimale Dispersionsinkrement (minimum dispersion increment, s)
MAXDIST1Distanzschwellenwert (distance threshold, 1 s)
MAXSTRAT16Maximale Stratum-Nummer (maximum stratum number)

Abbildung 6: Globale Parameter

Obwohl dies die einzigen für die Interoperabilität erforderlichen globalen Parameter sind, ist in jeder Implementierung eine größere Sammlung erforderlich. Anhang A.1.1 enthält diejenigen, die vom Skelett für die Abschwächungsalgorithmen, den Uhrenkontrollalgorithmus und verwandte implementierungsabhängige Funktionen verwendet werden. Einige dieser Parameterwerte sind in Stein gemeißelt, wie die von der IANA zugewiesene NTP-Portnummer und die NTPv4 selbst zugewiesene Versionsnummer. Andere, wie die Frequenztoleranz (auch PHI genannt), beinhalten eine Annahme über das Worst-Case-Verhalten einer Systemuhr, die einmal synchronisiert und dann driften gelassen wird, wenn ihre Quellen unerreichbar werden. Die Mindest- und Maximalparameter definieren die Grenzen der Zustandsvariablen, wie in späteren Abschnitten dieses Dokuments beschrieben.

Obwohl in diesem Dokument mit festen Werten dargestellt, können einige Implementierungen sie durch Konfigurationsbefehle anpassbar machen. Beispielsweise berechnet die Referenzimplementierung den Wert von PRECISION als log2 der Mindestzeit in mehreren Iterationen zum Lesen der Systemuhr.

7.3. Packet Header Variables (Paket-Header-Variablen)

Die wichtigsten Zustandsvariablen aus externer Sicht sind die in Abbildung 7 und unten beschriebenen Paket-Header-Variablen. Der NTP-Paket-Header besteht aus einer ganzzahligen Anzahl von 32-Bit (4 Oktett) Wörtern in Netzwerk-Byte-Reihenfolge. Das Paketformat besteht aus drei Komponenten: dem Header selbst, einem oder mehreren optionalen Erweiterungsfeldern und einem optionalen Message Authentication Code (MAC). Die Header-Komponente ist identisch mit dem NTPv3-Header und früheren Versionen. Die optionalen Erweiterungsfelder werden von den in [RFC5906] beschriebenen Autokey-Public-Key-Kryptographie-Algorithmen verwendet. Der optionale MAC wird sowohl von Autokey als auch vom symmetrischen Schlüssel-Kryptographie-Algorithmus verwendet, der in diesem RFC beschrieben wird.

NameFormel (Formula)Beschreibung (Description)
leapleapSchaltsekunden-Indikator (leap indicator, LI)
versionversionVersionsnummer (version number, VN)
modemodeModus (mode)
stratumstratumStratum
pollpollAbfrageexponent (poll exponent)
precisionrhoPräzisionsexponent (precision exponent)
rootdelaydelta_rWurzelverzögerung (root delay)
rootdispepsilon_rWurzeldispersion (root dispersion)
refidrefidReferenz-ID (reference ID)
reftimereftimeReferenz-Zeitstempel (reference timestamp)
orgT1Ursprungs-Zeitstempel (origin timestamp)
recT2Empfangs-Zeitstempel (receive timestamp)
xmtT3Sende-Zeitstempel (transmit timestamp)
dstT4Ziel-Zeitstempel (destination timestamp)
keyidkeyidSchlüssel-ID (key ID)
dgstdgstNachrichtenzusammenfassung (message digest)

Abbildung 7: Paket-Header-Variablen

Das NTP-Paket ist ein UDP-Datagramm [RFC0768]. Einige Felder verwenden mehrere Wörter und andere sind in kleinere Felder innerhalb eines Wortes gepackt. Der in Abbildung 8 dargestellte NTP-Paket-Header hat 12 Wörter, gefolgt von optionalen Erweiterungsfeldern und schließlich einem optionalen Message Authentication Code (MAC), bestehend aus dem Schlüsselidentifikatorfeld und dem Nachrichtenzusammenfassungsfeld.

    0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI | VN |Mode | Stratum | Poll | Precision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Delay |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Dispersion |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reference ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Reference Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Origin Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Receive Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Transmit Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Extension Field 1 (variable) .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| dgst (128) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Abbildung 8: Paket-Header-Format

Die Erweiterungsfelder werden verwendet, um optionale Funktionen hinzuzufügen, zum Beispiel das Autokey-Sicherheitsprotokoll [RFC5906]. Das Erweiterungsfeldformat wird präsentiert, damit das Paket ohne Kenntnis der Erweiterungsfeldfunktionen analysiert werden kann. Der MAC wird sowohl von Autokey als auch vom symmetrischen Schlüssel-Authentifizierungsschema verwendet.

Eine Liste der Paket-Header-Variablen ist in Abbildung 7 dargestellt und unten detailliert beschrieben. Mit Ausnahme einer geringfügigen Variation bei Verwendung der IPv6-Adressfamilie sind diese Felder rückwärtskompatibel mit NTPv3. Die Paket-Header-Felder gelten sowohl für gesendete Pakete (Präfix x) als auch für empfangene Pakete (Präfix r). In Abbildung 8 wird die Größe einiger Mehr-Wort-Felder in Bits angegeben, wenn sie nicht der Standardgröße von 32 Bits entspricht. Der Basis-Header erstreckt sich vom Anfang des Pakets bis zum Ende des Sende-Zeitstempelfelds.

Feldinterpretationen

LI (Leap Indicator, Schaltsekunden-Indikator, leap): 2-Bit-Integer, der vor einer bevorstehenden Schaltsekunde warnt, die in der letzten Minute des aktuellen Monats eingefügt oder gelöscht werden soll, mit in Abbildung 9 definierten Werten.

Wert (Value)Bedeutung (Meaning)
0keine Warnung (no warning)
1letzte Minute des Tages hat 61 Sekunden (last minute has 61 seconds)
2letzte Minute des Tages hat 59 Sekunden (last minute has 59 seconds)
3unbekannt (Uhr nicht synchronisiert, clock unsynchronized)

Abbildung 9: Schaltsekunden-Indikator

VN (Version Number, Versionsnummer, version): 3-Bit-Integer, der die NTP-Versionsnummer repräsentiert, derzeit 4.

Mode (Modus, mode): 3-Bit-Integer, der den Modus repräsentiert, mit in Abbildung 10 definierten Werten.

Wert (Value)Bedeutung (Meaning)
0reserviert (reserved)
1symmetrisch aktiv (symmetric active)
2symmetrisch passiv (symmetric passive)
3Client
4Server
5Broadcast
6NTP-Kontrollnachricht (NTP control message)
7reserviert für private Nutzung (reserved for private use)

Abbildung 10: Assoziationsmodi

Stratum (Stratum): 8-Bit-Integer, der das Stratum repräsentiert, mit in Abbildung 11 definierten Werten.

Wert (Value)Bedeutung (Meaning)
0nicht spezifiziert oder ungültig (unspecified or invalid)
1Primärserver (primary server, z.B. mit GPS-Empfänger ausgestattet)
2-15Sekundärserver (secondary server, über NTP)
16nicht synchronisiert (unsynchronized)
17-255reserviert (reserved)

Abbildung 11: Paket-Stratum

Es ist üblich, den Stratum-Wert 0 in empfangenen Paketen auf MAXSTRAT (16) in der Peer-Variablen p.stratum abzubilden und p.stratum-Werte von MAXSTRAT oder größer auf 0 in gesendeten Paketen abzubilden. Dies ermöglicht es, Referenzuhren, die normalerweise bei Stratum 0 erscheinen, bequem unter Verwendung der gleichen Uhrenwahl-Algorithmen abzuschwächen, die für externe Quellen verwendet werden (siehe Anhang A.5.5.1 für ein Beispiel).

Poll (Abfrage): 8-Bit-Vorzeichen-Integer, der das maximale Intervall zwischen aufeinanderfolgenden Nachrichten in log2 Sekunden repräsentiert. Empfohlene Standardgrenzen für minimale und maximale Abfrageintervalle sind 6 bzw. 10.

Precision (Präzision): 8-Bit-Vorzeichen-Integer, der die Präzision der Systemuhr in log2 Sekunden repräsentiert. Beispielsweise entspricht ein Wert von -18 einer Präzision von etwa einer Mikrosekunde. Die Präzision kann beim ersten Start des Dienstes als Mindestzeit in mehreren Iterationen zum Lesen der Systemuhr bestimmt werden.

Root Delay (rootdelay, Wurzelverzögerung): Gesamte Rundlaufverzögerung zur Referenzuhr, im NTP-Kurzformat.

Root Dispersion (rootdisp, Wurzeldispersion): Gesamtdispersion zur Referenzuhr, im NTP-Kurzformat.

Reference ID (refid, Referenz-ID): 32-Bit-Code, der den bestimmten Server oder die Referenzuhr identifiziert. Die Interpretation hängt vom Wert im Stratum-Feld ab. Für Paket-Stratum 0 (nicht spezifiziert oder ungültig) ist dies eine vier Zeichen ASCII [RFC1345] Zeichenkette, genannt "Kiss Code", die für Debugging- und Überwachungszwecke verwendet wird. Für Stratum 1 (Referenzuhr) ist dies eine vier-Oktett, linksbündige, mit Nullen aufgefüllte ASCII-Zeichenkette, die der Referenzuhr zugewiesen ist. Die maßgebliche Liste der Referenzidentifikatoren wird von der IANA gepflegt; jede Zeichenkette, die mit dem ASCII-Zeichen "X" beginnt, ist jedoch für nicht registrierte Experimente und Entwicklung reserviert. Die Identifikatoren in Abbildung 12 wurden als ASCII-Identifikatoren verwendet:

IDUhrenquelle (Clock Source)
GOESGeosynchroner Orbit-Umweltsatellit (Geosynchronous Orbit Environment Satellite)
GPSGlobales Positionierungssystem (Global Position System)
GALGalileo-Positionierungssystem (Galileo Positioning System)
PPSGenerischer Puls pro Sekunde (Generic pulse-per-second)
IRIGInter-Range Instrumentation Group
WWVBLF-Radio WWVB Ft. Collins, CO 60 kHz
DCFLF-Radio DCF77 Mainflingen, DE 77,5 kHz
HBGLF-Radio HBG Prangins, HB 75 kHz
MSFLF-Radio MSF Anthorn, UK 60 kHz
JJYLF-Radio JJY Fukushima, JP 40 kHz, Saga, JP 60 kHz
LORCMF-Radio LORAN C Station, 100 kHz
TDFMF-Radio Allouis, FR 162 kHz
CHUHF-Radio CHU Ottawa, Ontario
WWVHF-Radio WWV Ft. Collins, CO
WWVHHF-Radio WWVH Kauai, HI
NISTNIST-Telefonmodem (NIST telephone modem)
ACTSNIST-Telefonmodem (NIST telephone modem)
USNOUSNO-Telefonmodem (USNO telephone modem)
PTBEuropäisches Telefonmodem (European telephone modem)

Abbildung 12: Referenzidentifikatoren

Über Stratum 1 hinaus (Sekundärserver und Clients): Dies ist der Referenzidentifikator des Servers und kann verwendet werden, um Timing-Schleifen zu erkennen. Bei Verwendung der IPv4-Adressfamilie ist der Identifikator die vier-Oktett-IPv4-Adresse. Bei Verwendung der IPv6-Adressfamilie sind es die ersten vier Oktette des MD5-Hash der IPv6-Adresse. Beachten Sie, dass bei Verwendung der IPv6-Adressfamilie auf einem NTPv4-Server mit einem NTPv3-Client das Referenzidentifikatorfeld als Zufallswert erscheint und eine Timing-Schleife möglicherweise nicht erkannt wird.

Reference Timestamp (Referenz-Zeitstempel): Zeit, zu der die Systemuhr zuletzt eingestellt oder korrigiert wurde, im NTP-Zeitstempelformat.

Origin Timestamp (org, Ursprungs-Zeitstempel): Zeit am Client, als die Anfrage zum Server aufbrach, im NTP-Zeitstempelformat.

Receive Timestamp (rec, Empfangs-Zeitstempel): Zeit am Server, als die Anfrage vom Client ankam, im NTP-Zeitstempelformat.

Transmit Timestamp (xmt, Sende-Zeitstempel): Zeit am Server, als die Antwort zum Client aufbrach, im NTP-Zeitstempelformat.

Destination Timestamp (dst, Ziel-Zeitstempel): Zeit am Client, als die Antwort vom Server ankam, im NTP-Zeitstempelformat.

Hinweis: Das Ziel-Zeitstempelfeld ist nicht als Header-Feld enthalten; es wird bei Ankunft des Pakets bestimmt und in der Paketpuffer-Datenstruktur verfügbar gemacht.

Wenn das NTP Zugriff auf die physische Schicht hat, werden die Zeitstempel mit dem Beginn des Symbols nach dem Start des Rahmens assoziiert. Andernfalls sollten Implementierungen versuchen, den Zeitstempel mit dem frühesten zugänglichen Punkt im Rahmen zu assoziieren.

Der MAC besteht aus dem Schlüsselidentifikator gefolgt von der Nachrichtenzusammenfassung. Die Nachrichtenzusammenfassung oder Prüfsumme wird wie in [RFC1321] über alle NTP-Header- und optionale Erweiterungsfelder berechnet, aber nicht über den MAC selbst.

Extension Field n (Erweiterungsfeld n): Siehe Abschnitt 7.5 für eine Beschreibung des Formats dieses Felds.

Key Identifier (keyid, Schlüsselidentifikator): 32-Bit vorzeichenlose Ganzzahl, die vom Client und Server verwendet wird, um einen geheimen 128-Bit-MD5-Schlüssel zu bezeichnen.

Message Digest (digest, Nachrichtenzusammenfassung): 128-Bit-MD5-Hash, berechnet über den Schlüssel gefolgt von den NTP-Paket-Header- und Erweiterungsfeldern (aber nicht die Schlüsselidentifikator- oder Nachrichtenzusammenfassungsfelder).

Es sollte beachtet werden, dass die hier verwendete MAC-Berechnung von denen in [RFC1305] und [RFC4330] definierten abweicht, aber konsistent damit ist, wie bestehende Implementierungen einen MAC generieren.

7.4. The Kiss-o'-Death Packet (Das Kiss-o'-Death-Paket)

Wenn das Stratum-Feld 0 ist, was nicht spezifiziert oder ungültig bedeutet, kann das Referenzidentifikatorfeld verwendet werden, um Nachrichten zu übermitteln, die für Statusberichte und Zugriffskontrolle nützlich sind. Diese werden Kiss-o'-Death (KoD) Pakete genannt und die ASCII-Nachrichten, die sie übermitteln, werden Kiss-Codes genannt. Die KoD-Pakete erhielten ihren Namen, weil eine frühe Verwendung darin bestand, Clients mitzuteilen, dass sie aufhören sollen, Pakete zu senden, die gegen Server-Zugriffskontrollen verstoßen. Die Kiss-Codes können nützliche Informationen für einen intelligenten Client liefern, entweder NTPv4 oder SNTPv4. Kiss-Codes sind in vier Zeichen ASCII-Zeichenketten kodiert, die linksbündig und mit Nullen gefüllt sind. Die Zeichenketten sind für Zeichenanzeigen und Protokolldateien konzipiert. Eine Liste der derzeit definierten Kiss-Codes ist in Abbildung 13 gegeben. Empfänger von Kiss-Codes MÜSSEN (MUST) sie inspizieren und in den folgenden Fällen diese Aktionen ergreifen:

a. Für Kiss-Codes DENY und RSTR MUSS (MUST) der Client alle Assoziationen zu diesem Server demobilisieren und aufhören, Pakete an diesen Server zu senden;

b. Für Kiss-Code RATE MUSS (MUST) der Client sofort sein Abfrageintervall zu diesem Server reduzieren und es jedes Mal weiter reduzieren, wenn er einen RATE-Kiss-Code erhält.

c. Kiss-Codes, die mit dem ASCII-Zeichen "X" beginnen, sind für nicht registrierte Experimente und Entwicklung bestimmt und MÜSSEN (MUST) ignoriert werden, wenn sie nicht erkannt werden.

d. Außer den oben genannten Bedingungen haben KoD-Pakete keine Protokollbedeutung und werden nach der Inspektion verworfen.

Der Empfangs-Zeitstempel und der Sende-Zeitstempel (vom Server gesetzt) sind in einem KoD-Paket undefiniert und DÜRFEN NICHT (MUST NOT) darauf verlassen werden, gültige Werte zu haben, und MÜSSEN (MUST) verworfen werden.

7.5. NTP Extension Field Format (NTP-Erweiterungsfeldformat)

In NTPv4 können ein oder mehrere Erweiterungsfelder nach dem Header und vor dem MAC eingefügt werden, der immer vorhanden ist, wenn ein Erweiterungsfeld vorhanden ist. Abgesehen von der Definition des Feldformats verwendet dieses Dokument den Feldinhalt nicht. Ein Erweiterungsfeld enthält eine Anfrage- oder Antwortnachricht im in Abbildung 14 dargestellten Format.

    0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Field Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. .
. Value .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Padding (as needed) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Abbildung 14: Erweiterungsfeldformat

Alle Erweiterungsfelder werden auf eine Wortgrenze (vier Oktette) mit Nullen aufgefüllt. Das Field Type-Feld ist spezifisch für die definierte Funktion und wird hier nicht näher erläutert. Während die minimale Feldlänge mit erforderlichen Feldern vier Wörter (16 Oktette) beträgt, muss eine maximale Feldlänge noch festgelegt werden.

Das Längenfeld ist eine 16-Bit vorzeichenlose Ganzzahl, die die Länge des gesamten Erweiterungsfelds in Oktetten angibt, einschließlich des Auffüllungsfelds.