Passa al contenuto principale

6. Data Types (Tipi di dati)

Tutti i valori temporali NTP sono rappresentati in formato complemento a due (twos-complement format), con bit numerati in formato big-endian (come descritto nell'Appendice A di [RFC0791]) a partire da zero iniziando dalla sinistra, o posizione di ordine superiore. Ci sono tre formati temporali NTP, un formato di data a 128 bit (date format), un formato di timestamp a 64 bit (timestamp format) e un formato breve a 32 bit (short format), come mostrato nella Figura 3. Il formato di data a 128 bit viene utilizzato dove sono disponibili spazio di archiviazione e dimensione della parola sufficienti. Include un campo di secondi con segno a 64 bit (signed seconds field) che copre 584 miliardi di anni e un campo di frazione a 64 bit (fraction field) che risolve 0,05 attosecondi (cioè 0,5e-18). Per comodità nella mappatura tra i formati, il campo dei secondi è diviso in un campo Numero Era (Era Number field) a 32 bit e un campo Offset Era (Era Offset field) a 32 bit. Le ere non possono essere prodotte direttamente da NTP, né è necessario farlo. Quando necessario, possono essere derivate da mezzi esterni, come il filesystem o hardware dedicato.

    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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Formato breve NTP

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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Formato timestamp NTP

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 |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Formato data NTP

Figura 3: Formati temporali NTP

Il formato di timestamp a 64 bit viene utilizzato nelle intestazioni dei pacchetti e in altri luoghi con dimensione di parola limitata. Include un campo di secondi senza segno a 32 bit (unsigned seconds field) che copre 136 anni e un campo di frazione a 32 bit che risolve 232 picosecondi (picoseconds). Il formato breve a 32 bit viene utilizzato nei campi di intestazione di ritardo e dispersione dove la risoluzione completa e l'intervallo degli altri formati non sono giustificati. Include un campo di secondi senza segno a 16 bit e un campo di frazione a 16 bit.

Nei formati di data e timestamp, l'epoca primaria (prime epoch), o data base dell'era 0, è le 0 del 1° gennaio 1900 UTC, quando tutti i bit sono zero. Va notato che, a rigor di termini, l'UTC non esisteva prima del 1° gennaio 1972, ma è conveniente presumere che sia esistito per tutta l'eternità, anche se tutta la conoscenza dei secondi intercalari storici è andata perduta. Le date sono relative all'epoca primaria; valori maggiori di zero rappresentano tempi dopo quella data; valori minori di zero rappresentano tempi prima di essa. Si noti che il campo Offset Era del formato data e il campo Secondi del formato timestamp hanno la stessa interpretazione.

I timestamp sono valori senza segno e le operazioni su di essi producono un risultato nella stessa era o in ere adiacenti. L'era 0 include date dall'epoca primaria fino a un certo momento nel 2036, quando il bit più significativo è zero. L'era 1 continua da quel punto e dura 136 anni, quando inizia l'era 2, e così via. Nell'era 0, il timestamp di zero rappresenta l'epoca primaria, 2^(31) secondi rappresenta il tempo nel 2036, e 2^(32)-1 secondi rappresenta il secondo prima dell'epoca primaria. Utilizzando timestamp senza segno, vengono elaborati nello stesso modo. Un pericolo percepito con calcoli di timestamp a 64 bit che coprono un'era, come è possibile nel 2036, potrebbe provocare un overflow. In realtà, se il client è impostato entro 68 anni dal server prima dell'avvio del protocollo, si ottengono valori corretti anche se il client e il server sono in ere adiacenti.

Alcuni valori temporali sono rappresentati in formato esponenziale (exponent format), inclusa la precisione (precision), la costante di tempo (time constant) e l'intervallo di polling (poll interval). Questi sono in formato intero con segno a 8 bit in log2 (logaritmo in base 2) secondi. Le uniche operazioni aritmetiche consentite su di essi sono incremento e decremento. Ai fini di questo documento e per semplificare la presentazione, un riferimento a una di queste variabili per nome significa il valore esponenziato, ad esempio, l'intervallo di polling è 1024 s, mentre il riferimento per nome ed esponente significa il valore effettivo, ad esempio, l'esponente di polling è 10.

Per convertire il tempo di sistema in qualsiasi formato in formati di data e timestamp NTP è necessario determinare il numero di secondi s dall'epoca primaria al tempo di sistema. Per determinare l'era intera e il timestamp dato s,

era = s / 2^(32) e timestamp = s - era * 2^(32),

che funziona per date positive e negative. Per determinare s data l'era e il timestamp,

s = era * 2^(32) + timestamp.

La conversione tra tempo NTP e tempo di sistema può essere un po' complicata ed è al di fuori dello scopo di questo documento. Si noti che il numero di giorni nell'era 0 è uno in più rispetto al numero di giorni nella maggior parte delle altre ere, e questo non accadrà di nuovo fino all'anno 2400 nell'era 3.

Nella descrizione delle variabili di stato che segue, un riferimento esplicito al tipo intero implica un intero senza segno a 32 bit. Questo semplifica i controlli dei limiti, poiché è necessario definire solo il limite superiore. Senza riferimento esplicito, il tipo predefinito è double a virgola mobile a 64 bit (floating double). Le eccezioni saranno annotate se necessario.