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.
std.net.socketstd.net.dnsstd.net.types| 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 |
| Feld | Typ | Bedeutung | |
|---|---|---|---|
unixTime | int64 | Unix-Zeitstempel in Sekunden | |
fractional | int64 | Bruchteil der Sekunde (Nanosekunden × 2 | 32) |
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„ |
| 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 |
—-
<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).