# Network Time Protocol

Il Network Time Protocol, in sigla NTP, è un protocollo per sincronizzare gli orologi dei computer all'interno di una rete a commutazione di pacchetto, quindi con tempi di latenza variabili ed inaffidabili. L'NTP è un protocollo client-server appartenente al livello applicativo ed è in ascolto sulla porta UDP 123.

## Funzionamento

L'NTP è uno dei più vecchi protocolli tuttora in uso, ed è giunto alla sua quarta versione. Fu sviluppato presso l'Università del Delaware da Dave Mills, che ne ha seguito lo sviluppo fino alla morte. Il funzionamento si basa sul rilevamento dei tempi di latenza nel transito dei pacchetti sulla rete. Utilizza il tempo coordinato universale ed è quindi indipendente dai fusi orari. Attualmente è in grado di sincronizzare gli orologi dei computer su internet entro un margine di 10 millisecondi e con una accuratezza di almeno 200 microsecondi all'interno di una LAN in condizioni ottimali.
I diversi server NTP sono organizzati in una struttura gerarchica di "strati", dove lo strato 1 è sincronizzato con una fonte temporale esterna quale un orologio atomico, GPS o un orologio radiocontrollato, lo strato 2 riceve i dati temporali da server di strato 1, e così via. Un server si sincronizza confrontando il suo orologio con quello di diversi altri server di strato superiore o dello stesso strato. Questo permette di aumentare la precisione e di eliminare eventuali server scorretti.
Un server NTP è in grado di stimare e compensare gli errori sistematici dell'orologio hardware di sistema, che normalmente è di scarsa qualità.
In una macchina che supporti l'NTP, il server è costituito da un processo operante a livello utente, così come da altre funzioni accessorie. Per ottenere le migliori prestazioni è utile che la parte relativa alla sincronizzazione dell'orologio sia implementata nel kernel del sistema operativo, piuttosto che affidata ad un processo utente (tutte le recenti versioni del kernel Linux hanno questa caratteristica). Il dato a 64 bit scambiato dal protocollo è suddiviso in 32 bit che definiscono i secondi e altri 32bit per la parte decimale, potendo così rappresentare un intervallo di 2$^{32}$ ed una risoluzione temporale teorica di 2$^{−32}$ secondi. Ogni 2$^{32}$ secondi l'intervallo temporale descritto dal protocollo si ripete, per cui è necessario specificare a quale periodo ci si riferisce. Questo non è un problema poiché 2$^{32}$ secondi corrispondono a circa 136 anni.
I dettagli sul funzionamento dell'NTP sono definiti in diverse RFC. L'NTP non deve essere confuso con i protocolli daytime e time. Una versione semplificata di questo protocollo che non richiede la memorizzazione dei dati tra due successive comunicazioni è il Simple Network Time Protocol (SNTP), impiegato in sistemi embedded dove non è richiesta una grande precisione. Inoltre SNTP può essere usato su sistemi che agiscano solo da client NTP o solo da server (apparecchiature dedicate che ricevono l'ora da un orologio esterno e la ridistribuiscono via NTP).

## Implementazione pratica

L'implementazione delle funzioni di client e server NTP sono disponibili per diversi sistemi operativi, tra cui Windows, Linux e MacOS. Esistono anche dispositivi autonomi progettati per svolgere la funzione di server NTP. Una implementazione per Linux e MacOS è Chrony.
Di seguito sono riportate le procedure ed i comandi utilizzabili per sincronizzare il proprio computer con un server NTP.

### Linux

La soluzione preferita è usare il demone NTP, ntpd, configurando uno o più server NTP di riferimento nel suo file di configurazione /etc/ntpd.conf. In questo modo, oltre ad aggiornare l'orologio di sistema, ntpd ne stima l'errore sistematico, ed è in grado di correggerlo, evitando un andamento irregolare del tempo, e migliorando la precisione quando il computer non è connesso alla rete.
Per sincronizzare manualmente l'orologio di sistema con quello di un server, da console, con privilegi di root, dare il comando: ${\mbox{ntpdate ntp1.inrim.it}}$
Questo comando viene spesso utilizzato in uno script di avvio, prima di avviare ntpd.
È anche possibile mettere ntpdate in crontab per mantenere automaticamente aggiornato l'orologio.
Un comando più vecchio presente in alcune distribuzioni, ma con sintassi simile a ntpdate, è netdate.
Con il comando hwclock, è possibile trasferire l'ora corretta anche all'orologio del BIOS, in modo che al riavvio del computer l'orologio sia corretto. Questo comando viene talvolta inserito negli script eseguiti al momento dello spegnimento del sistema operativo.

### Windows 95/98/NT

Questi sistemi operativi non implementano un client NTP, che deve essere quindi installato a parte. Un client liberamente scaricabile ed open source è: Nettime

### Windows XP/2000/2003/Vista/2008

Queste versioni implementano di serie un client NTP. In Windows XP, per attivare la sincronizzazione automatica, aprire la sezione data e ora nel pannello di controllo. Aprire la linguetta Ora Internet ed attivare l'opzione Sincronizzazione automatica con server di riferimento ora. Spesso i server di riferimento preimpostati da Windows XP non funzionano, motivo per cui in Italia conviene impostare a mano uno dei server del "NTP POOL PROJECT" attivi per l'Italia (http://www.pool.ntp.org/zone/it) (es. 0.it.pool.ntp.org, 1.it.pool.ntp.org, 2.it.pool.ntp.org, 3.it.pool.ntp.org)
È possibile avere maggiori informazioni direttamente sul sito di support tecnico della Microsoft.
In Windows 2000, da riga di comando è possibile dare i comandi:
net time /setsntp:ntp1.inrim.it
net stop w32time
net start w32time
Per visualizzare il server ntp corrente digitare:
net time /querysntp
In Windows 2003, dai servizi di sistema, è possibile avviare il servizio "Windows Time" e configurare l'indirizzo del server NTP.
In Windows7 e Windows 2008 il comando net time /querysntp è deprecato e sostituito dal w32tm /query /status

### Mac OS X

Il sistema operativo macOS è UNIX compatibile (in particolare il kernel deriva da un sistema BSD), quindi vale lo stesso comando descritto per Linux.
Nelle "Preferenze di Sistema" fare clic sull'icona "Data & Ora". Nel pannello "Data & Ora" della finestra di dialogo, attivare la box di spunta "Imposta automaticamente Data & Ora" e inserire, nel campo di testo, il nome del server NTP. Si può scegliere tra quelli predisposti oppure immettere il nome completo del server.