Spec couche 5 — air-ntp (client NTP/SNTP + NTS, patron sans-IO)
Spécification technique — Version 0.1 (proposition). Couche 5 « Services système ».
Cadrage.
air-ntp= client de synchronisation d’horloge : NTPv4/SNTP (RFC 5905) + NTS (Network Time Security, RFC 8915 — temps authentifié). Maison, pur Rust, zéro-C, zérounsafe. Crate-lib + daemon.airservice(note réseau §1 : NTP = L5, UDP).
Position et méthode
Protocole filaire → cœur sans-IO + pilote I/O (air-socket UDP). Le daemon discipline
l’horloge système via une interface temps privilégiée (couche 0 clock_settime/
adjtimex — additif à instruire). Consomme air-runtime, air-base-core, et
air-tls/air-crypto pour NTS.
Périmètre — moderne, sûr
- SNTP client (RFC 4330/5905) : offset/délai, filtrage, sélection.
- NTS (RFC 8915) — recommandé : établissement de clés par TLS 1.3 (
air-tls, ALPNntske/1) puis NTP authentifié (AEAD viaair-crypto, cookies NTS). Défend contre le spoofing (NTP nu est non authentifié). - Discipline d’horloge bornée : jamais de saut d’horloge géant silencieux (bornes de sanité, step vs slew) ; refus des serveurs incohérents (falsetickers).
- Omis : mode serveur ; NTP symétrique/broadcast ; autokey (déprécié, remplacé par NTS).
Anatomie : les 9 composants
| # | Composant | air-ntp | Pur ? |
|---|---|---|---|
| 1 | Framer | // TRIVIAL : datagramme UDP = 1 paquet NTP (48 o + extensions) | ✅ triv. |
| 2 | Codec | NtpPacketCodec — en-tête 48 o + champs d’extension NTS bornés | ✅ |
| 3 | StateMachine | SyncStateMachine — poll, filtre, algorithme de discipline (RFC 5905 §11) | ✅ |
| 4 | Handshaker | NTS-KE via air-tls (établit cookies+clés) ; sinon // NO (NTP nu) | ✅ + air-tls |
| 5 | Flow Controller | // NO | — |
| 6 | Multiplexer | // NO | — |
| 7 | Timer Manager | PollTimers — intervalle de poll adaptatif (minpoll/maxpoll) ; horloge injectée | ✅ |
| 8 | Session Context | NtsSession (cookies+clés AEAD) + état de discipline (offset/jitter) | ✅ |
| 9 | Extension hooks | champs d’extension NTS (RFC 8915) | ✅ |
Inventaire — ~10 objets
Surface (~6) : NtpClient, NtsConfig, TimeSample (offset/delay/dispersion),
ClockDiscipline (step/slew), NtpEvent (Synchronized/Stepped/Unsynced), NtpError.
Cœur sans-IO (~4) : NtpPacketCodec, SyncStateMachine, PollTimers, NtsSession.
Dépendances
air-socket (L1, UDP), air-tls (L2, NTS-KE), air-crypto (L1, AEAD NTS),
air-runtime/air-base-core (L1). Réglage d’horloge : clock_settime (step)
déjà présent en couche 0 ; additif adjtimex (slew, discipline fine) —
instruit (ADR-083).
Zéro-C, zéro tierce.
Sécurité & tests
- NTS préféré (temps authentifié) ; NTP nu marqué non authentifié (avertissement).
- Bornes de sanité sur l’offset (anti-saut) ; sélection multi-serveurs (anti-falseticker).
- Tests : codec fuzzé (paquets + extensions NTS), discipline property (offset borné),
timers virtual clock, interop
chrony/ntpd/serveur NTS (Cloudflaretime.cloudflare.com).
Travail à reprendre
- Additif couche 0 :
adjtimex/clock_adjtime(slew) — instruit (ADR-083) ;clock_settime(step) déjà présent. - Daemon
.airservice(L5) ; sources multiples + sélection ; ABI C différée.
Licence : MPL 2.0. Statut : spec air-ntp (L5) v0.1 — client SNTP + NTS, sans-IO.