7. Data Structures (Strutture dati)
Le macchine a stati NTP sono definite nelle sezioni seguenti. Le variabili di stato sono separate in classi in base alla loro funzione nelle intestazioni dei pacchetti, nei processi di peer e polling, nel processo di sistema e nel processo di disciplina dell'orologio. Le variabili di pacchetto (Packet variables) rappresentano i valori di intestazione NTP nei pacchetti trasmessi e ricevuti. Le variabili di peer e polling (Peer and poll variables) rappresentano il contenuto dell'associazione per ciascun server separatamente. Le variabili di sistema (System variables) rappresentano lo stato del server come visto dai suoi client dipendenti. Le variabili di disciplina dell'orologio (Clock discipline variables) rappresentano il funzionamento interno dell'algoritmo di disciplina dell'orologio. Un esempio è descritto nell'Appendice A.
7.1. Structure Conventions (Convenzioni di struttura)
Per distinguere tra variabili diverse con lo stesso nome ma utilizzate in processi diversi, viene adottata la convenzione di denominazione riassunta nella Figura 5. Una variabile di pacchetto di ricezione v è un membro della struttura di pacchetto r con nome completamente qualificato r.v. In modo simile, x.v è una variabile di pacchetto di trasmissione, p.v è una variabile di peer, s.v è una variabile di sistema e c.v è una variabile di disciplina dell'orologio. Esiste un insieme di variabili di peer per ciascuna associazione; esiste un solo insieme di variabili di sistema e di orologio.
| Nome (Name) | Descrizione (Description) |
|---|---|
| r. | variabile di intestazione pacchetto di ricezione (receive packet header variable) |
| x. | variabile di intestazione pacchetto di trasmissione (transmit packet header variable) |
| p. | variabile di peer/polling (peer/poll variable) |
| s. | variabile di sistema (system variable) |
| c. | variabile di disciplina dell'orologio (clock discipline variable) |
Figura 5: Convenzioni di prefisso
7.2. Global Parameters (Parametri globali)
Oltre alle classi di variabili, in questo documento sono definiti numerosi parametri globali, inclusi quelli mostrati con valori nella Figura 6.
| Nome (Name) | Valore (Value) | Descrizione (Description) |
|---|---|---|
| PORT | 123 | numero di porta NTP (NTP port number) |
| VERSION | 4 | numero di versione NTP (NTP version number) |
| TOLERANCE | 15e-6 | tolleranza di frequenza PHI (frequency tolerance PHI, s/s) |
| MINPOLL | 4 | esponente di polling minimo (minimum poll exponent, 16 s) |
| MAXPOLL | 17 | esponente di polling massimo (maximum poll exponent, 36 h) |
| MAXDISP | 16 | dispersione massima (maximum dispersion, 16 s) |
| MINDISP | .005 | incremento di dispersione minimo (minimum dispersion increment, s) |
| MAXDIST | 1 | soglia di distanza (distance threshold, 1 s) |
| MAXSTRAT | 16 | numero di strato massimo (maximum stratum number) |
Figura 6: Parametri globali
Sebbene questi siano gli unici parametri globali necessari per l'interoperabilità, una raccolta più ampia è necessaria in qualsiasi implementazione. L'Appendice A.1.1 contiene quelli utilizzati dallo scheletro per gli algoritmi di mitigazione, l'algoritmo di disciplina dell'orologio e le funzioni dipendenti dall'implementazione correlate. Alcuni di questi valori di parametro sono scolpiti nella pietra, come il numero di porta NTP assegnato dall'IANA e il numero di versione assegnato a NTPv4 stesso. Altri, come la tolleranza di frequenza (chiamata anche PHI), coinvolgono un'ipotesi sul comportamento nel caso peggiore di un orologio di sistema una volta sincronizzato e poi lasciato derivare quando le sue sorgenti diventano irraggiungibili. I parametri minimo e massimo definiscono i limiti delle variabili di stato come descritto nelle sezioni successive di questo documento.
Sebbene mostrati con valori fissi in questo documento, alcune implementazioni possono renderli variabili regolabili tramite comandi di configurazione. Ad esempio, l'implementazione di riferimento calcola il valore di PRECISION come log2 del tempo minimo in diverse iterazioni per leggere l'orologio di sistema.
7.3. Packet Header Variables (Variabili di intestazione pacchetto)
Le variabili di stato più importanti dal punto di vista esterno sono le variabili di intestazione del pacchetto descritte nella Figura 7 e di seguito. L'intestazione del pacchetto NTP è costituita da un numero integrale di parole da 32 bit (4 ottetti) in ordine di byte di rete. Il formato del pacchetto è costituito da tre componenti: l'intestazione stessa, uno o più campi di estensione opzionali e un codice di autenticazione del messaggio opzionale (message authentication code, MAC). Il componente di intestazione è identico all'intestazione NTPv3 e alle versioni precedenti. I campi di estensione opzionali sono utilizzati dagli algoritmi crittografici a chiave pubblica Autokey descritti in [RFC5906]. Il MAC opzionale è utilizzato sia da Autokey che dall'algoritmo crittografico a chiave simmetrica descritto in questo RFC.
| Nome (Name) | Formula | Descrizione (Description) |
|---|---|---|
| leap | leap | indicatore di salto (leap indicator, LI) |
| version | version | numero di versione (version number, VN) |
| mode | mode | modalità (mode) |
| stratum | stratum | strato (stratum) |
| poll | poll | esponente di polling (poll exponent) |
| precision | rho | esponente di precisione (precision exponent) |
| rootdelay | delta_r | ritardo radice (root delay) |
| rootdisp | epsilon_r | dispersione radice (root dispersion) |
| refid | refid | ID di riferimento (reference ID) |
| reftime | reftime | timestamp di riferimento (reference timestamp) |
| org | T1 | timestamp di origine (origin timestamp) |
| rec | T2 | timestamp di ricezione (receive timestamp) |
| xmt | T3 | timestamp di trasmissione (transmit timestamp) |
| dst | T4 | timestamp di destinazione (destination timestamp) |
| keyid | keyid | ID chiave (key ID) |
| dgst | dgst | digest del messaggio (message digest) |
Figura 7: Variabili di intestazione pacchetto
Il pacchetto NTP è un datagramma UDP [RFC0768]. Alcuni campi utilizzano più parole e altri sono impacchettati in campi più piccoli all'interno di una parola. L'intestazione del pacchetto NTP mostrata nella Figura 8 ha 12 parole seguite da campi di estensione opzionali e infine da un codice di autenticazione del messaggio opzionale (MAC) composto dal campo Identificatore chiave e dal campo Digest del messaggio.
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) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figura 8: Formato intestazione pacchetto
I campi di estensione vengono utilizzati per aggiungere capacità opzionali, ad esempio il protocollo di sicurezza Autokey [RFC5906]. Il formato del campo di estensione viene presentato in modo che il pacchetto possa essere analizzato senza la conoscenza delle funzioni del campo di estensione. Il MAC viene utilizzato sia da Autokey che dallo schema di autenticazione a chiave simmetrica.
Un elenco delle variabili di intestazione del pacchetto è mostrato nella Figura 7 e descritto in dettaglio di seguito. Ad eccezione di una variazione minore quando si utilizza la famiglia di indirizzi IPv6, questi campi sono retrocompatibili con NTPv3. I campi di intestazione del pacchetto si applicano sia ai pacchetti trasmessi (prefisso x) che ai pacchetti ricevuti (prefisso r). Nella Figura 8, la dimensione di alcuni campi multi-parola è mostrata in bit se non è il valore predefinito di 32 bit. L'intestazione di base si estende dall'inizio del pacchetto alla fine del campo Timestamp di trasmissione.
Interpretazione dei campi
LI (Leap Indicator, Indicatore di salto, leap): intero a 2 bit che avverte di un secondo intercalare imminente da inserire o eliminare nell'ultimo minuto del mese corrente con valori definiti nella Figura 9.
| Valore (Value) | Significato (Meaning) |
|---|---|
| 0 | nessun avviso (no warning) |
| 1 | l'ultimo minuto del giorno ha 61 secondi (last minute has 61 seconds) |
| 2 | l'ultimo minuto del giorno ha 59 secondi (last minute has 59 seconds) |
| 3 | sconosciuto (orologio non sincronizzato, clock unsynchronized) |
Figura 9: Indicatore di salto
VN (Version Number, Numero di versione, version): intero a 3 bit che rappresenta il numero di versione NTP, attualmente 4.
Mode (Modalità, mode): intero a 3 bit che rappresenta la modalità, con valori definiti nella Figura 10.
| Valore (Value) | Significato (Meaning) |
|---|---|
| 0 | riservato (reserved) |
| 1 | simmetrico attivo (symmetric active) |
| 2 | simmetrico passivo (symmetric passive) |
| 3 | client |
| 4 | server |
| 5 | broadcast |
| 6 | messaggio di controllo NTP (NTP control message) |
| 7 | riservato per uso privato (reserved for private use) |
Figura 10: Modalità di associazione
Stratum (Strato, stratum): intero a 8 bit che rappresenta lo strato, con valori definiti nella Figura 11.
| Valore (Value) | Significato (Meaning) |
|---|---|
| 0 | non specificato o non valido (unspecified or invalid) |
| 1 | server primario (primary server, ad es. dotato di ricevitore GPS) |
| 2-15 | server secondario (secondary server, tramite NTP) |
| 16 | non sincronizzato (unsynchronized) |
| 17-255 | riservato (reserved) |
Figura 11: Strato del pacchetto
È consuetudine mappare il valore di strato 0 nei pacchetti ricevuti a MAXSTRAT (16) nella variabile di peer p.stratum e mappare i valori p.stratum di MAXSTRAT o superiori a 0 nei pacchetti trasmessi. Ciò consente agli orologi di riferimento, che normalmente appaiono allo strato 0, di essere convenientemente mitigati utilizzando gli stessi algoritmi di selezione dell'orologio utilizzati per le sorgenti esterne (vedere l'Appendice A.5.5.1 per un esempio).
Poll (Polling): intero con segno a 8 bit che rappresenta l'intervallo massimo tra messaggi successivi, in log2 secondi. I limiti predefiniti suggeriti per gli intervalli di polling minimo e massimo sono rispettivamente 6 e 10.
Precision (Precisione): intero con segno a 8 bit che rappresenta la precisione dell'orologio di sistema, in log2 secondi. Ad esempio, un valore di -18 corrisponde a una precisione di circa un microsecondo. La precisione può essere determinata all'avvio del servizio come il tempo minimo in diverse iterazioni per leggere l'orologio di sistema.
Root Delay (rootdelay, Ritardo radice): ritardo totale di andata e ritorno all'orologio di riferimento, in formato breve NTP.
Root Dispersion (rootdisp, Dispersione radice): dispersione totale all'orologio di riferimento, in formato breve NTP.
Reference ID (refid, ID di riferimento): codice a 32 bit che identifica il particolare server o orologio di riferimento. L'interpretazione dipende dal valore nel campo strato. Per lo strato di pacchetto 0 (non specificato o non valido), questa è una stringa ASCII [RFC1345] di quattro caratteri, chiamata "kiss code", utilizzata per scopi di debug e monitoraggio. Per lo strato 1 (orologio di riferimento), questa è una stringa ASCII di quattro ottetti, giustificata a sinistra e riempita di zeri, assegnata all'orologio di riferimento. L'elenco autorevole degli identificatori di riferimento è mantenuto dall'IANA; tuttavia, qualsiasi stringa che inizia con il carattere ASCII "X" è riservata per sperimentazione e sviluppo non registrati. Gli identificatori nella Figura 12 sono stati utilizzati come identificatori ASCII:
| ID | Sorgente orologio (Clock Source) |
|---|---|
| GOES | Satellite ambientale in orbita geostazionaria (Geosynchronous Orbit Environment Satellite) |
| GPS | Sistema di posizionamento globale (Global Position System) |
| GAL | Sistema di posizionamento Galileo (Galileo Positioning System) |
| PPS | Impulso per secondo generico (Generic pulse-per-second) |
| IRIG | Inter-Range Instrumentation Group |
| WWVB | Radio LF WWVB Ft. Collins, CO 60 kHz |
| DCF | Radio LF DCF77 Mainflingen, DE 77,5 kHz |
| HBG | Radio LF HBG Prangins, HB 75 kHz |
| MSF | Radio LF MSF Anthorn, UK 60 kHz |
| JJY | Radio LF JJY Fukushima, JP 40 kHz, Saga, JP 60 kHz |
| LORC | Stazione radio MF LORAN C, 100 kHz |
| TDF | Radio MF Allouis, FR 162 kHz |
| CHU | Radio HF CHU Ottawa, Ontario |
| WWV | Radio HF WWV Ft. Collins, CO |
| WWVH | Radio HF WWVH Kauai, HI |
| NIST | Modem telefonico NIST (NIST telephone modem) |
| ACTS | Modem telefonico NIST (NIST telephone modem) |
| USNO | Modem telefonico USNO (USNO telephone modem) |
| PTB | Modem telefonico europeo (European telephone modem) |
Figura 12: Identificatori di riferimento
Oltre lo strato 1 (server secondari e client): questo è l'identificatore di riferimento del server e può essere utilizzato per rilevare loop di temporizzazione. Se si utilizza la famiglia di indirizzi IPv4, l'identificatore è l'indirizzo IPv4 a quattro ottetti. Se si utilizza la famiglia di indirizzi IPv6, sono i primi quattro ottetti dell'hash MD5 dell'indirizzo IPv6. Si noti che, quando si utilizza la famiglia di indirizzi IPv6 su un server NTPv4 con un client NTPv3, il campo Identificatore di riferimento appare essere un valore casuale e un loop di temporizzazione potrebbe non essere rilevato.
Reference Timestamp (Timestamp di riferimento): tempo in cui l'orologio di sistema è stato impostato o corretto l'ultima volta, in formato timestamp NTP.
Origin Timestamp (org, Timestamp di origine): tempo al client quando la richiesta è partita per il server, in formato timestamp NTP.
Receive Timestamp (rec, Timestamp di ricezione): tempo al server quando la richiesta è arrivata dal client, in formato timestamp NTP.
Transmit Timestamp (xmt, Timestamp di trasmissione): tempo al server quando la risposta è partita per il client, in formato timestamp NTP.
Destination Timestamp (dst, Timestamp di destinazione): tempo al client quando la risposta è arrivata dal server, in formato timestamp NTP.
Nota: il campo Timestamp di destinazione non è incluso come campo di intestazione; viene determinato all'arrivo del pacchetto e reso disponibile nella struttura dati del buffer del pacchetto.
Se l'NTP ha accesso allo strato fisico, i timestamp sono associati all'inizio del simbolo dopo l'inizio del frame. Altrimenti, le implementazioni dovrebbero tentare di associare il timestamp al punto più presto accessibile nel frame.
Il MAC è costituito dall'Identificatore chiave seguito dal Digest del messaggio. Il digest del messaggio, o somma di controllo crittografica, è calcolato come in [RFC1321] su tutti i campi di intestazione NTP e i campi di estensione opzionali, ma non il MAC stesso.
Extension Field n (Campo di estensione n): vedere la Sezione 7.5 per una descrizione del formato di questo campo.
Key Identifier (keyid, Identificatore chiave): intero senza segno a 32 bit utilizzato dal client e dal server per designare una chiave MD5 segreta a 128 bit.
Message Digest (digest, Digest del messaggio): hash MD5 a 128 bit calcolato sulla chiave seguita dai campi di intestazione e estensione del pacchetto NTP (ma non i campi Identificatore chiave o Digest del messaggio).
Si noti che il calcolo del MAC utilizzato qui differisce da quelli definiti in [RFC1305] e [RFC4330] ma è coerente con il modo in cui le implementazioni esistenti generano un MAC.
7.4. The Kiss-o'-Death Packet (Il pacchetto Kiss-o'-Death)
Se il campo Stratum è 0, il che implica non specificato o non valido, il campo Identificatore di riferimento può essere utilizzato per trasmettere messaggi utili per i rapporti di stato e il controllo degli accessi. Questi sono chiamati pacchetti Kiss-o'-Death (KoD) e i messaggi ASCII che trasmettono sono chiamati kiss codes. I pacchetti KoD hanno ottenuto il loro nome perché un uso precoce era dire ai client di smettere di inviare pacchetti che violano i controlli di accesso del server. I kiss codes possono fornire informazioni utili per un client intelligente, sia NTPv4 che SNTPv4. I kiss codes sono codificati in stringhe ASCII di quattro caratteri che sono giustificate a sinistra e riempite di zeri. Le stringhe sono progettate per visualizzazioni di caratteri e file di log. Un elenco dei kiss codes attualmente definiti è fornito nella Figura 13. I destinatari dei kiss codes DEVONO (MUST) ispezionarli e, nei seguenti casi, intraprendere queste azioni:
a. Per i kiss codes DENY e RSTR, il client DEVE (MUST) smobilitare tutte le associazioni a quel server e smettere di inviare pacchetti a quel server;
b. Per il kiss code RATE, il client DEVE (MUST) ridurre immediatamente il suo intervallo di polling a quel server e continuare a ridurlo ogni volta che riceve un kiss code RATE.
c. I kiss codes che iniziano con il carattere ASCII "X" sono per sperimentazione e sviluppo non registrati e DEVONO (MUST) essere ignorati se non riconosciuti.
d. A parte le condizioni sopra, i pacchetti KoD non hanno significato di protocollo e vengono scartati dopo l'ispezione.
Il Timestamp di ricezione e il Timestamp di trasmissione (impostato dal server) sono indefiniti in un pacchetto KoD e NON DEVONO (MUST NOT) essere considerati avere valori validi e DEVONO (MUST) essere scartati.
7.5. NTP Extension Field Format (Formato campo di estensione NTP)
In NTPv4, uno o più campi di estensione possono essere inseriti dopo l'intestazione e prima del MAC, che è sempre presente quando è presente un campo di estensione. A parte la definizione del formato del campo, questo documento non fa uso del contenuto del campo. Un campo di estensione contiene un messaggio di richiesta o risposta nel formato mostrato nella Figura 14.
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) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figura 14: Formato campo di estensione
Tutti i campi di estensione sono riempiti con zeri fino al confine di una parola (quattro ottetti). Il campo Tipo di campo è specifico per la funzione definita e non è elaborato qui. Mentre la lunghezza minima del campo contenente i campi richiesti è di quattro parole (16 ottetti), una lunghezza massima del campo rimane da stabilire.
Il campo Lunghezza è un intero senza segno a 16 bit che indica la lunghezza dell'intero campo di estensione in ottetti, incluso il campo Riempimento.