std.net.ntp

NTP (Network Time Protocol, RFC 5905) synchronisiert die Uhrzeit von Systemen mit einem Zeitserver. Die Unit baut NTP-Anfragepakete auf (Version 3, Client-Modus, UDP Port 123) und parst die Antwort des Servers inklusive Stratum-Angabe, Referenzzeitquelle und Zeitstempel im NTP-Epoch-Format (Sekunden seit 1900).

Einsatzbereiche sind zeitkritische Anwendungen, präzises Log-Timestamping, verteilte Systeme mit Uhrzeitsynchronisation und Anwendungen, die ohne libc-Systemzeit-APIs eine verlässliche UTC-Zeit benötigen.


Imports

  • std.net.socket
  • std.net.dns
  • std.net.types

Konstanten

Name Typ Wert Sichtbarkeit
NTP_PORT int64 123 pub
NTP_VERSION int64 4 pub
NTP_MODE_CLIENT int64 3 pub
NTP_MODE_SERVER int64 4 pub
NTP_EPOCH_OFFSET int64 2208988800 pub
NTP_PACKET_SIZE int64 48 pub
NTP_STRATUM_KOD int64 0 pub
NTP_STRATUM_PRIMARY int64 1 pub
NTP_STRATUM_SECONDARY int64 2 pub
NTP_ERR_OK int64 0 pub
NTP_ERR_NETZ int64 -1 pub
NTP_ERR_MODE int64 -2 pub
NTP_ERR_ORIGIN int64 -3 pub
NTP_ERR_KOD int64 -4 pub
NTP_ERR_UNSYNC int64 -5 pub

Typen

NTPTime (struct)

Feld Typ Bedeutung
unixTime int64 Unix-Zeitstempel in Sekunden
fractional int64 Bruchteil der Sekunde (Nanosekunden × 232)
stratum int64 Stratum des Servers
precision int64 Präzisionsangabe des Servers
delay int64 Umlaufzeit in Millisekunden
offset int64 Abweichung der eigenen Uhr in Millisekunden
status int64 NTP_ERR_*0 heißt „Antwort ist brauchbar„

Funktionen

Signatur Sichtbarkeit Beschreibung
NTPJetzt(): int64 pub aktuelle Zeit als NTP-Zeitstempel (32 Bit Sekunden seit 1900 + 32 Bit Bruchteil)
NTPBuildRequest(): int64 pub NTP-Anfrage-Paket (48 Byte) aufbauen — trägt den eigenen Sendezeitstempel ein
NTPReadTS64(buf: int64, offset: int64): int64 pub NTP-Zeitstempel (64 Bit) aus dem Puffer lesen
NTPWriteTS64(buf: int64, offset: int64, ts: int64): void pub NTP-Zeitstempel in den Puffer schreiben
NTPReadU32BE(buf: int64, offset: int64): int64 pub 32-Bit-Big-Endian-Wert aus Puffer lesen
NTPReadTimestamp(buf: int64, offset: int64): int64 pub NTP-Zeitstempel in Unix-Zeit umrechnen
NTPParseResponse(buf: int64, T1: int64, T4: int64): NTPTime pub Antwort parsen; T1 = eigener Sendezeitstempel, T4 = Empfangszeitstempel
NTPGetTime(host: int64): NTPTime pub Aktuelle Zeit per Hostname abfragen
NTPGetTimeFromIP(ip: int64): NTPTime pub Aktuelle Zeit per IP-Adresse abfragen
NTPFormatTime(unixTime: int64): int64 pub Unix-Zeit als Datumsstring formatieren

—-

Auswertung und Zuordnung

<WRAP alert> status prüfen, bevor unixTime benutzt wird. Bis lyxc 1.1.1C blieben offset und delay immer 0, und die Antwort wurde der Anfrage nicht zugeordnet (#1609). Über UDP genügte einem Angreifer damit ein Paket mit der richtigen Absenderadresse — er musste die Anfrage nicht einmal gesehen haben. Zeit trägt Zertifikatsgültigkeit, Einmalkennwörter und Protokolle. </WRAP>

Seither gilt:

  • NTPBuildRequest schreibt den eigenen Sendezeitstempel in die Bytes 40–47. Genau den spiegelt der Server zurück.
  • NTPParseResponse weist eine Antwort mit fremdem Origin-Stempel ab (NTP_ERR_ORIGIN) und prüft zusätzlich Betriebsart 4 (NTP_ERR_MODE), LI != 3 und Stratum ≥ 16 (NTP_ERR_UNSYNC) sowie Stratum 0, also Kiss-o'-Death (NTP_ERR_KOD).
  • offset und delay werden nach RFC 5905 aus allen vier Zeitstempeln gerechnet. Deshalb nimmt NTPParseResponse jetzt T1 und T4 — die beiden Zeitpunkte, die nur der Aufrufer kennt.

Die eigene Uhr stellt man nicht auf unixTime, sondern korrigiert sie um offset: der rohe Sendezeitstempel des Servers ist beim Eintreffen bereits um die halbe Umlaufzeit veraltet.


Letzte Aktualisierung: 2026-08-18 — Zuordnung der Antwort, NTP_ERR_*, offset/delay und die geänderte Signatur von NTPParseResponse nachgezogen (#1609).