6. Data Types (Datentypen)
Alle NTP-Zeitwerte werden im Zweierkomplement-Format (twos-complement format) dargestellt, wobei die Bits in Big-Endian-Weise (wie in Anhang A von [RFC0791] beschrieben) von Null beginnend von links oder von der höherwertigen Position aus nummeriert sind. Es gibt drei NTP-Zeitformate: ein 128-Bit-Datumsformat (date format), ein 64-Bit-Zeitstempelformat (timestamp format) und ein 32-Bit-Kurzformat (short format), wie in Abbildung 3 dargestellt. Das 128-Bit-Datumsformat wird verwendet, wo ausreichend Speicher und Wortgröße verfügbar sind. Es enthält ein 64-Bit-Vorzeichenbehaftetes Sekundenfeld (signed seconds field), das 584 Milliarden Jahre umfasst, und ein 64-Bit-Bruchfeld (fraction field), das 0,05 Attosekunden (d.h. 0,5e-18) auflöst. Zur Vereinfachung der Zuordnung zwischen Formaten ist das Sekundenfeld in ein 32-Bit-Ära-Nummernfeld (Era Number field) und ein 32-Bit-Ära-Versatzfeld (Era Offset field) unterteilt. Ären können von NTP nicht direkt erzeugt werden, noch ist dies erforderlich. Bei Bedarf können sie aus externen Mitteln abgeleitet werden, wie z.B. dem Dateisystem oder dedizierter Hardware.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seconds | Fraction |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NTP-Kurzformat
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seconds |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Fraction |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NTP-Zeitstempelformat
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Era Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Era Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Fraction |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NTP-Datumsformat
Abbildung 3: NTP-Zeitformate
Das 64-Bit-Zeitstempelformat wird in Paket-Headern und anderen Orten mit begrenzter Wortgröße verwendet. Es enthält ein 32-Bit-Vorzeichenloses Sekundenfeld (unsigned seconds field), das 136 Jahre umfasst, und ein 32-Bit-Bruchfeld, das 232 Pikosekunden (picoseconds) auflöst. Das 32-Bit-Kurzformat wird in Verzögerungs- und Dispersions-Header-Feldern verwendet, wo die volle Auflösung und Reichweite der anderen Formate nicht gerechtfertigt sind. Es enthält ein 16-Bit-Vorzeichenloses Sekundenfeld und ein 16-Bit-Bruchfeld.
In den Datums- und Zeitstempelformaten ist die Hauptepoche (prime epoch) oder das Basisdatum der Ära 0 0 Uhr am 1. Januar 1900 UTC, wenn alle Bits Null sind. Es sollte beachtet werden, dass streng genommen UTC vor dem 1. Januar 1972 nicht existierte, aber es ist bequem anzunehmen, dass es für alle Ewigkeit existiert hat, selbst wenn alles Wissen über historische Schaltsekunden verloren gegangen ist. Daten sind relativ zur Hauptepoche; Werte größer als Null repräsentieren Zeiten nach diesem Datum; Werte kleiner als Null repräsentieren Zeiten davor. Beachten Sie, dass das Ära-Versatzfeld des Datumsformats und das Sekundenfeld des Zeitstempelformats dieselbe Interpretation haben.
Zeitstempel sind vorzeichenlose Werte, und Operationen an ihnen erzeugen ein Ergebnis in derselben oder benachbarten Ären. Ära 0 umfasst Daten von der Hauptepoche bis zu einem bestimmten Zeitpunkt im Jahr 2036, wenn das höchstwertige Bit Null ist. Ära 1 setzt sich von diesem Punkt fort und dauert 136 Jahre, dann beginnt Ära 2 und so weiter. In Ära 0 repräsentiert der Zeitstempel von Null die Hauptepoche, 2^(31) Sekunden repräsentiert die Zeit im Jahr 2036, und 2^(32)-1 Sekunden repräsentiert die Sekunde vor der Hauptepoche. Bei Verwendung vorzeichenloser Zeitstempel werden sie auf die gleiche Weise verarbeitet. Eine wahrgenommene Gefahr bei 64-Bit-Zeitstempelberechnungen, die eine Ära überspannen, wie es im Jahr 2036 möglich ist, könnte zu einem Überlauf führen. Tatsächlich werden korrekte Werte erhalten, wenn der Client innerhalb von 68 Jahren des Servers eingestellt ist, bevor das Protokoll gestartet wird, selbst wenn sich Client und Server in benachbarten Ären befinden.
Einige Zeitwerte werden im Exponentialformat (exponent format) dargestellt, einschließlich der Präzision (precision), der Zeitkonstante (time constant) und des Abfrageintervalls (poll interval). Diese sind im 8-Bit-Vorzeichenbehafteten Ganzzahlformat in log2 (Logarithmus zur Basis 2) Sekunden. Die einzigen erlaubten arithmetischen Operationen an ihnen sind Inkrementierung und Dekrementierung. Für die Zwecke dieses Dokuments und zur Vereinfachung der Darstellung bedeutet ein Verweis auf eine dieser Variablen nach Namen den exponentierten Wert, z.B. das Abfrageintervall beträgt 1024 s, während ein Verweis nach Namen und Exponent den tatsächlichen Wert bedeutet, z.B. der Abfrageexponent ist 10.
Um die Systemzeit in jedem Format in NTP-Datums- und Zeitstempelformate zu konvertieren, muss die Anzahl der Sekunden s von der Hauptepoche bis zur Systemzeit bestimmt werden. Um die Ganzzahl-Ära und den Zeitstempel bei gegebenem s zu bestimmen,
era = s / 2^(32) und timestamp = s - era * 2^(32),
was für positive und negative Daten funktioniert. Um s bei gegebener Ära und Zeitstempel zu bestimmen,
s = era * 2^(32) + timestamp.
Die Konvertierung zwischen NTP- und Systemzeit kann etwas kompliziert sein und liegt außerhalb des Umfangs dieses Dokuments. Beachten Sie, dass die Anzahl der Tage in Ära 0 um einen Tag größer ist als die Anzahl der Tage in den meisten anderen Ären, und dies wird erst im Jahr 2400 in Ära 3 wieder vorkommen.
In der folgenden Beschreibung der Zustandsvariablen impliziert eine explizite Referenz auf den Ganzzahltyp eine 32-Bit-Vorzeichenlose Ganzzahl. Dies vereinfacht Grenzwertprüfungen, da nur die Obergrenze definiert werden muss. Ohne explizite Referenz ist der Standardtyp 64-Bit-Gleitkomma-Doppelpräzision (floating double). Ausnahmen werden bei Bedarf vermerkt.