Clock Sync (sincronizarea ceasului) — procesul de aliniere a indicațiilor ceasului intern al dispozitivului cu o sursă de timp de referință. În aplicațiile mobile, sincronizarea precisă este critică pentru funcționarea corectă a notificărilor push, certificatelor SSL/TLS, protocoalelor criptografice și analiticii. Conform Google Security Blog (2024), peste 30% din eșecurile conexiunilor HTTPS pe dispozitivele mobile sunt cauzate de desincronizarea timpului de sistem cu mai mult de 5 secunde.
Principalele puncte
Sincronizarea ceasului (Clock Sync) — este mecanismul de aliniere a ceasului intern al dispozitivului cu timpul de referință UTC (Universal Coordinated Time). Fără sincronizare, generatorul de cuarț din dispozitivul mobil se dereglează treptat — derivata este de 1–10 secunde pe zi, în funcție de temperatură și calitatea componentelor. Sincronizarea compensează această derivată, obținând timpul exact din surse externe: servere NTP pe internet, sateliți GPS sau stații de bază celulare. În mod ideal, dispozitivul ar trebui să se sincronizeze la fiecare 4–6 ore pentru a menține precizia în limita a 1 secundă.
În dispozitivul mobil există două tipuri de ceasuri: hardware (RTC, Real-Time Clock) cu alimentare separată de la baterie — continuă să funcționeze chiar și când dispozitivul este oprit, și software (system time), gestionat de sistemul de operare. La pornirea dispozitivului, timpul de sistem este inițializat din RTC, apoi menținut prin întreruperi ale generatorului de tact. Sincronizarea NTP corectează timpul de sistem, iar în unele cazuri — scrie corecția și în RTC. Pe Android, accesul la RTC hardware este limitat — aplicațiile nu îl pot modifica fără drepturi root.
Multe aspecte ale funcționării aplicației mobile depind critic de timpul exact al sistemului. Certificatele SSL au o perioadă de valabilitate: dacă pe dispozitiv timpul este setat înainte de data emiterii certificatului sau după data expirării acestuia, conexiunea HTTPS va fi blocată. Tokenurile OAuth și autentificarea JWT utilizează marcaje temporale pentru verificarea valabilității — desincronizarea duce la refuzuri false de autorizare. Notificările push sunt planificate în funcție de timp, iar dacă ceasul se dereglează, utilizatorul primește notificări la momentul nepotrivit sau nu le primește deloc.
Securitatea aplicațiilor are și ea de suferit de pe urma timpului incorect: criptarea bazată pe timp (time-based OTP), jurnalele de evenimente cu marcaje incorecte, funcționarea incorectă a rate-limiting pe partea serverului (serverul blochează cererile „viitoare"). Conform OWASP Mobile Top 10 (2024), neîncrederea în timpul de sistem se încadrează în categoria securității insuficiente a platformei. Dezvoltatorilor li se recomandă să verifice întotdeauna timpul pe server, nu să se bazeze exclusiv pe ceasul clientului. Dacă diferența depășește pragul (recomandat 5 secunde), aplicația ar trebui să blocheze operațiunile critice până la sincronizare.
| Scenariu | Efectul desincronizării |
|---|---|
| HTTPS/TLS | Certificatele sunt considerate expirate sau nevalide |
| OAuth 2.0 / JWT | Tokenurile sunt respinse ca expirate |
| Notificări push | Notificările sosesc la momentul nepotrivit |
| Analitică | Evenimentele cu marcaje incorecte denaturează rapoartele |
| Criptografie | Time-based OTP nu se potrivește cu serverul |
| Rate limiting | Serverul blochează cererile cu timp „viitor" |
Protocoalele principale pentru sincronizarea ceasului — NTP și versiunea sa simplificată SNTP. NTP (RFC 5905) — protocol complet cu filtrare de servere, analiză a derivării și corecție PLL. Este utilizat pe servere și echipamente de rețea. SNTP (RFC 4330) — versiune ușoară pentru dispozitive client, care nu necesită sincronizare continuă. Clientul SNTP trimite o cerere, primește răspunsul și setează timpul fără analiza istoricului. Pe dispozitivele mobile se utilizează exact SNTP — serviciul încorporat Android Google Time Service (GTS) se sincronizează prin SNTP cu serverele time.google.com.
Pe lângă NTP/SNTP, sincronizarea timpului pe dispozitivele mobile este posibilă prin receptor GPS (precizie de până la 10 ns în condiții ideale) și rețeaua celulară (prin NITZ — Network Identity and Time Zone). GPS oferă precizie maximă, dar funcționează doar în aer liber și consumă multă energie. NITZ este furnizat de operatorul de rețea celulară automat la înregistrarea în rețea, dar nu toți operatorii îl suportă. Android utilizează o combinație a tuturor metodelor: GTS (SNTP) ca prioritate, NITZ ca rezervă și GPS pentru aplicațiile care necesită precizie ridicată.
În sistemele distribuite — când serverul și clientul se află pe dispozitive diferite — sincronizarea ceasului se confruntă cu limitări fundamentale. Întârzierea rețelei (latency) face imposibilă determinarea unică a timpului exact pe client: dacă pachetul a durat 200 ms, timpul pe server la momentul trimiterii cererii și primirii răspunsului este deja diferit. NTP rezolvă această problemă prin măsurarea RTT și procesare statistică, dar pentru tranzacțiile distribuite (de exemplu, transferuri bancare) acest lucru nu este suficient — se utilizează ceasuri logice (marcaje Lamport) sau ceasuri vectoriale.
Ceasurile fizice (wall clock) — timpul real UTC, sincronizat prin NTP. Ceasurile logice — numere de ordine ale evenimentelor din sistem, nelegate de timpul fizic. În sistemele distribuite pentru ordonarea evenimentelor se folosesc adesea ceasuri vectoriale: fiecare nod stochează un vector de contoare pentru toate nodurile clusterului. Pentru aplicațiile mobile, sincronizarea fizică cu o precizie de 1–5 secunde este suficientă — asigură funcționarea corectă a OAuth, SSL și notificărilor push. Dacă se necesită o ordonare strictă a evenimentelor (de exemplu, în chat-uri în timp real), se adaugă sincronizarea logică la nivel de server.
Implementarea sincronizării ceasului într-o aplicație Android se poate face în mai multe moduri. Cel mai simplu — obținerea timpului serverului prin REST API: serverul returnează Unix Timestamp în corpul răspunsului sau în antetul HTTP Date. Această abordare nu necesită biblioteci suplimentare și garantează că timpul coincide cu cel al serverului. Al doilea mod — utilizarea unui client SNTP pentru interogarea directă a unui server NTP. Al treilea — bazarea pe serviciul Android Google Time Service, care sincronizează automat timpul de sistem dacă dispozitivul este conectat la internet.
În aplicațiile Android cu autentificare și operațiuni financiare, se recomandă o abordare combinată: la fiecare cerere către API se salvează diferența dintre timpul serverului și System.currentTimeMillis(). Această diferență se aplică la toate calculele de timp pe client, indiferent dacă ceasul de sistem este sincronizat sau nu. Această abordare se numește clock skew correction și se implementează printr-o clasă care stochează ultima diferență cunoscută cu serverul. Suplimentar, se poate rula o sincronizare NTP de fundal la fiecare 4–6 ore prin WorkManager.
// Corectarea derivării ceasului
class ClockSyncManager {
private var serverTimeDiff: Long = 0 // serverTime - deviceTime (ms)
fun updateServerTime(serverTimestampMs: Long) {
serverTimeDiff = serverTimestampMs - System.currentTimeMillis()
}
fun getCorrectedTime(): Long {
return System.currentTimeMillis() + serverTimeDiff
}
fun isSyncValid(maxDiffMs: Long = 5000): Boolean {
return Math.abs(serverTimeDiff) < maxDiffMs
}
}
Pentru sincronizarea periodică de fundal a timpului pe Android, utilizați WorkManager cu PeriodicWorkRequest. Sarcina de sincronizare execută o cerere SNTP sau un apel REST API, primește timpul serverului și actualizează ClockSyncManager. Intervalul minim pentru PeriodicWorkRequest este de 15 minute, dar pentru sincronizarea timpului sunt suficiente 4–6 ore. La sincronizare, luați în considerare starea rețelei — utilizați NetworkType.CONNECTED pentru a preveni cererile inutile în roaming. Dacă sincronizarea eșuează, păstrați corecția anterioară — rămâne valabilă cu o precizie în scădere treptată.
Dispozitivele mobile moderne sincronizează timpul automat prin servicii încorporate. Pe Android — Google Time Service (GTS), parte din Google Play Services. Pe iOS — client NTP încorporat în sistemul de operare. Aceste servicii funcționează independent de aplicații și nu necesită configurare suplimentară. Utilizatorul poate dezactiva sincronizarea automată în setări, ceea ce creează un risc pentru aplicații — tocmai în acest caz dezvoltatorul trebuie să implementeze propria sincronizare. Se recomandă verificarea stării autosincronizării prin Settings.Global.getInt(AUTO_TIME) și avertizarea utilizatorului când este dezactivată.
| Platformă | Serviciu de sincronizare | Protocol |
|---|---|---|
| Android | Google Time Service (GTS) | SNTP |
| iOS | Client NTP încorporat | NTP |
| Rețea celulară | NITZ (operator) | NITZ |
| Receptor GPS | Semnale satelitare | GPS Atomic Time |
Bazarea exclusiv pe sincronizarea automată este riscantă — utilizatorul o poate dezactiva sau se poate afla într-o zonă fără internet. Cea mai bună practică — obțineți timpul de la server la fiecare cerere API și stocați desincronizarea în SharedPreferences sau DataStore. Pentru operațiuni critice (plăți, autentificare, semnarea documentelor) verificați întotdeauna isSyncValid() înainte de execuție. Dacă desincronizarea depășește pragul — afișați utilizatorului un ecran cu propunerea de a activa autosincronizarea sau de a aștepta sincronizarea. Pentru jocuri și aplicații de divertisment, este suficient să obțineți timpul de la server la pornire și să îl actualizați la fiecare oră.
Întrebări frecvente
Sincronizarea ceasului — este procesul de aliniere a timpului de sistem al dispozitivului cu UTC de referință. Funcționează prin protocoalele NTP sau SNTP: dispozitivul trimite o cerere către server, măsoară întârzierea rețelei și calculează corecția pentru ceasul său. Rezultatul — timp exact cu o eroare de 1–100 ms în funcție de rețea.
Fără sincronizare sunt posibile defecțiuni: certificatele SSL blochează HTTPS, tokenurile OAuth sunt considerate expirate, notificările push sosesc la momentul nepotrivit, analitica înregistrează marcaje incorecte. Pentru operațiunile critice (plăți, autentificare) desincronizarea de peste 5 secunde este considerată o amenințare de securitate și ar trebui să blocheze operațiunea.
Principale — NTP (precizie 1–50 ms, cu filtrare și PLL) și SNTP (10–100 ms, simplificat). Suplimentar: GPS (10 ns, dar doar în aer liber) și NITZ (prin operatorul celular, precizie ~1 secundă). Android utilizează Google Time Service pe SNTP, iOS — client NTP încorporat.
Utilizați biblioteca Apache Commons Net (clasa NTPUDPClient) pentru o cerere SNTP directă către time.google.com sau pool.ntp.org. Alternativă — obțineți timpul serverului din anteturile de răspuns HTTP ale API-ului dumneavoastră. Pentru corecție permanentă, implementați ClockSyncManager care stochează diferența dintre timpul serverului și cel local.
Implementați clock skew correction: la fiecare cerere API salvați diferența dintre timpul serverului și System.currentTimeMillis(). Utilizați această diferență pentru corecția timpului în toate operațiunile aplicației. Dacă diferența depășește 5 secunde — blocați tranzacțiile critice și sugerați utilizatorului să activeze autosincronizarea în setări.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și