NTP (Network Time Protocol) è un protocollo di rete per la sincronizzazione dell’ora che garantisce una precisione di millisecondi nelle reti locali e decine di millisecondi nella rete globale. Sviluppato da David Mills nel 1985, il protocollo è utilizzato in tutti i sistemi operativi moderni, dispositivi mobili e apparecchiature di rete per sincronizzare gli orologi interni con l’ora di riferimento UTC. Secondo l’NTP Pool Project (2026), oltre 4 miliardi di dispositivi eseguono richieste NTP ogni giorno per la sincronizzazione.
Punti chiave
NTP (Network Time Protocol) è un protocollo di rete progettato per la sincronizzazione precisa dell’orologio interno di un computer con una sorgente di riferimento temporale attraverso una rete a commutazione di pacchetto. Descritto nella RFC 5905 (NTPv4), il protocollo utilizza un sistema gerarchico di server, dove ogni livello è chiamato stratum. Un client NTP invia richieste a un server, misura il tempo di andata e ritorno del pacchetto (RTT) e calcola lo scostamento del proprio orologio rispetto al tempo di riferimento. L’algoritmo di correzione tiene conto non solo di uno scostamento singolo, ma anche della deriva del generatore di clock, consentendo di mantenere la precisione per lunghi periodi senza richieste ripetute.
Il protocollo è stato sviluppato da David Mills nel 1985 per la rete ARPANET. La prima specifica (RFC 958) descriveva un semplice algoritmo di sincronizzazione con una precisione fino a 100 ms. NTPv3 (RFC 1305, 1992) ha aggiunto un algoritmo di filtraggio e una migliore elaborazione dei ritardi. NTPv4 (RFC 5905, 2010) — la versione corrente — include supporto IPv6, configurazione automatica dei server e protezione dagli attacchi tramite Network Time Security (NTS). In 40 anni, il protocollo si è evoluto da un progetto di ricerca a uno standard infrastrutturale senza il quale le transazioni finanziarie, le telecomunicazioni e le reti mobili sarebbero impossibili.
Il principio di funzionamento di NTP si basa sulla misurazione del tempo di viaggio del pacchetto nella rete. Il client invia una richiesta con un timestamp T1 (ora locale di invio). Il server riceve la richiesta al momento T2 (ora del server), genera una risposta con il timestamp T3 e la invia. Il client riceve la risposta al momento T4. Utilizzando tutti e quattro i timestamp, il client calcola lo scostamento = ((T2 - T1) + (T3 - T4)) / 2 e il ritardo = (T4 - T1) - (T3 - T2). Se il ritardo supera 1 secondo, il risultato è considerato inaffidabile — questo protegge dai canali sovraccarichi o instabili.
Semplicemente impostare l’ora esatta non è sufficiente — l’oscillatore al quarzo di un dispositivo deriva costantemente (anticipa o ritarda) a causa di temperatura, invecchiamento e tensione. NTP risolve questo problema utilizzando l’algoritmo PLL (Phase-Locked Loop): non imposta l’ora forzatamente, ma regola la velocità dell’orologio. Se il dispositivo anticipa di 0,1 secondi all’ora, NTP rallenta l’orologio di sistema fino a quando la deriva non viene compensata. Questo approccio consente la sincronizzazione ogni poche ore su reti stabili, anziché ogni 30 secondi.
// Simplified NTP algorithm schema
struct NTPPacket {
uint8_t flags; // LI, VN, Mode
uint8_t stratum; // server stratum level
uint32_t refTimestamp; // reference timestamp
uint32_t originTimestamp; // T1
uint32_t recvTimestamp; // T2
uint32_t xmitTimestamp; // T3
};
// Calculate offset and delay
double offset = ((t2 - t1) + (t3 - t4)) / 2.0;
double delay = (t4 - t1) - (t3 - t2);
L’intero sistema NTP è organizzato in una gerarchia, dove ogni livello è chiamato stratum. Lo stratum 0 è l’orologio di riferimento: orologi atomici, ricevitori GPS o segnali radio WWVB. Questi dispositivi non sono collegati direttamente alla rete. Lo stratum 1 sono i server direttamente collegati agli orologi di riferimento. Lo stratum 2 riceve l’ora dallo stratum 1, lo stratum 3 dallo stratum 2, e così via fino allo stratum 15. Più alto è il numero di stratum, potenzialmente minore è la precisione — ogni livello aggiunge un piccolo ritardo ed errore. Lo stratum 16 significa che l’ora non è disponibile (non sincronizzata).
| Stratum | Descrizione | Precisione |
|---|---|---|
| Stratum 0 | Orologi atomici, GPS, segnali radio | Nanosecondi |
| Stratum 1 | Server collegati al riferimento | Microsecondi |
| Stratum 2 | Server NTP pubblici | 1–10 ms |
| Stratum 3 | Server locali delle organizzazioni | 10–50 ms |
| Stratum 4+ | Dispositivi client | fino a 100 ms |
Per i dispositivi mobili, i server di stratum 2 sono ottimali — ce ne sono abbastanza e offrono un buon equilibrio tra precisione e disponibilità. Ad esempio, pool.ntp.org è un pool di migliaia di server in tutto il mondo che distribuisce automaticamente il carico. Per le applicazioni Android, non è consigliato utilizzare direttamente lo stratum 1: in primo luogo, crea un carico eccessivo sui server primari, e in secondo luogo, un dispositivo mobile necessita solo di una precisione di 10–50 ms, che lo stratum 2 fornisce. Nelle reti aziendali, viene installato un server locale di stratum 3-4 che si sincronizza con uno stratum 2 esterno.
SNTP (Simple Network Time Protocol, RFC 4330) è un’implementazione semplificata di NTP per dispositivi con risorse limitate: microcontrollori, sensori IoT e applicazioni mobili che non richiedono alta precisione. A differenza di NTP completo, SNTP non esegue il filtraggio di più server, non analizza la deriva dell’orologio e non utilizza algoritmi PLL complessi. Un client SNTP invia una richiesta, riceve una risposta e imposta l’ora una sola volta. La precisione di SNTP è di 10–100 ms a seconda della rete — sufficiente per la grande maggioranza degli scenari mobili, ad eccezione delle transazioni finanziarie.
SNTP è adatto per applicazioni Android che devono semplicemente ottenere l’ora corrente dal server senza mantenere una sincronizzazione continua. Ad esempio, un’app mostra l’ora del server all’accesso o si sincronizza una volta al giorno. NTP completo è necessario per sistemi server, apparecchiature di telecomunicazione, piattaforme finanziarie e database distribuiti dove la precisione costante e il monitoraggio della deriva sono critici. Per lo sviluppo mobile, SNTP è sufficiente — il servizio orario integrato di Android lo utilizza per la sincronizzazione periodica con i server Google.
Nelle applicazioni Android, ottenere l’ora esatta tramite NTP è necessario quando l’ora di sistema può essere modificata dall’utente o differisce dall’ora reale a causa della mancanza di rete. Android non dispone di un client NTP pubblico integrato — gli sviluppatori utilizzano la libreria Apache Commons Net SntpClient o soluzioni di terze parti. Nel 2022, Google ha aggiunto una classe SntpClient interna all’API Android (tramite Google Play Services), ma richiede configurazione e non è documentata per uso generale. Un approccio alternativo è richiedere l’ora tramite un’API REST che restituisce il timestamp del server nel corpo della risposta.
Un’implementazione di base di SNTP su Android consiste nell’inviare un pacchetto UDP a un server NTP (ad esempio pool.ntp.org), analizzare la risposta ed estrarre il timestamp di trasmissione (T3). Il codice deve gestire i timeout di rete e gli errori di analisi — in un’applicazione reale, questa operazione viene eseguita in un thread in background e il risultato viene memorizzato nella cache fino alla successiva sincronizzazione. La libreria Apache Commons Net fornisce una classe NTPUDPClient pronta all’uso che può essere utilizzata in Android con modifiche minime, aggiungendo la dipendenza a build.gradle.
// Get NTP time via Apache Commons Net
fun getNtpTime(server: String = "pool.ntp.org"): Date? {
return try {
val client = NTPUDPClient()
client.setDefaultTimeout(5000)
val info = client.getTime(InetAddress.getByName(server))
client.close()
Date(info.getMessage().getTransmitTimeStamp().getTime())
} catch (e: Exception) {
null
}
}
La precisione di NTP dipende da diversi fattori: ritardo di rete (RTT), stabilità del canale, carico del server e qualità del generatore di clock locale. Su una rete locale con ritardo inferiore a 1 ms, NTP raggiunge una precisione di 0,1–1 ms. Attraverso Internet con ritardo di 10–50 ms, la precisione scende a 10–50 ms. Più importante della precisione puntuale è la stabilità: se il ritardo varia (jitter), NTP ha bisogno di più tempo per calcolare uno scostamento affidabile. Per i dispositivi mobili, il principale fattore di instabilità è il passaggio tra Wi-Fi e reti mobili, dove il ritardo può cambiare di un ordine di grandezza.
Per le applicazioni Android sensibili all’ora esatta, si raccomanda: utilizzare più server NTP e selezionare quello con il ritardo minore; evitare la sincronizzazione durante i cambi di rete; memorizzare nella cache l’ultima ora ottenuta e regolarla tramite System.currentTimeMillis. Per giochi e applicazioni in tempo reale (NTP non è adatto qui a causa della latenza di rete), utilizzare l’ora del server trasmessa in ogni richiesta. Nelle applicazioni finanziarie, verificare sempre la discrepanza con il server — se la differenza supera i 5 secondi, bloccare l’operazione come potenzialmente non sicura.
Domande frequenti
NTP (Network Time Protocol) è un protocollo di sincronizzazione dell’orologio tramite Internet. Serve per allineare l’ora dei dispositivi con il riferimento UTC. Senza NTP, gli orologi dei computer deviano di secondi al giorno a causa della deriva dell’oscillatore al quarzo, il che è critico per le transazioni finanziarie, la registrazione e la sicurezza.
Il sistema NTP utilizza livelli — stratum: stratum 0 (orologi atomici e GPS), stratum 1 (server collegati al riferimento), stratum 2 (server NTP pubblici), stratum 3–4 (server locali), stratum 5–15 (client). Più alto è lo stratum, maggiore è l’errore potenziale. Lo stratum 16 significa che l’ora non è sincronizzata.
SNTP è una versione semplificata di NTP per dispositivi con risorse limitate. Non filtra i server, non analizza la deriva dell’orologio e non utilizza PLL. SNTP è adatto per applicazioni mobili dove una precisione di 10–100 ms è sufficiente. NTP completo è necessario per server, apparecchiature di telecomunicazione e sistemi fintech.
Utilizzare la libreria Apache Commons Net con la classe NTPUDPClient. Inviare una richiesta a pool.ntp.org, ottenere la risposta ed estrarre il timestamp di trasmissione. In alternativa, utilizzare l’API REST del proprio server, che restituisce l’ora del server nell’intestazione Date o nel corpo della risposta in formato Unix Timestamp.
Senza la sincronizzazione NTP, l’ora di sistema su un dispositivo può differire di minuti o ore. Ciò interrompe le notifiche push, la validazione dei certificati SSL, i log, gli scheduler di attività e i protocolli crittografici. Nelle applicazioni finanziarie, una discrepanza superiore a 5 secondi è considerata una minaccia alla sicurezza.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche