Clock Sync (синхронизација сата) — процес усклађивања показатеља унутрашњег сата уређаја са референтним извором времена. У мобилним апликацијама прецизна синхронизација је критична за исправан рад push обавештења, SSL/TLS сертификата, криптографских протокола и аналитике. Према Google Security Blog (2024), више од 30% отказа HTTPS веза на мобилним уређајима изазвано је десинхронизацијом системског времена већом од 5 секунди.
Главно
Синхронизација сата (Clock Sync) — механизам усклађивања унутрашњег сата уређаја са референтним временом UTC (Universal Coordinated Time). Без синхронизације, кварцни генератор у мобилном уређају постепено одступа — дрифт износи 1–10 секунди дневно у зависности од температуре и квалитета компоненти. Синхронизација компензује овај дрифт, добијајући тачно време из спољних извора: NTP сервера на интернету, GPS сателита или мобилних базних станица. У идеалном случају, уређај би требало да се синхронизује сваких 4–6 сати ради одржавања прецизности у границама 1 секунде.
У мобилном уређају постоје две врсте сатова: хардверски (RTC, Real-Time Clock) са засебним напајањем из батерије — ради чак и када је уређај искључен, и софтверски (system time)) којим управља оперативни систем. При покретању уређаја, системско време се иницијализује из RTC-а, а затим одржава путем прекида тактног генератора. NTP синхронизација коригује системско време, а у неким случајевима — уписује корекцију и у RTC. На Android-у приступ хардверском RTC-у је ограничен — апликације га не могу мењати без root права.
Многи аспекти рада мобилне апликације критично зависе од тачног системског времена. SSL сертификати имају рок трајања: ако је на уређају време подешено раније од датума издавања сертификата или касније од датума његовог истека, HTTPS веза ће бити блокирана. OAuth токени и JWT аутентификација користе временске ознаке за проверу ваљаности — десинхронизација доводи до лажног одбијања ауторизације. Push обавештења се планирају по времену, и ако сат одступа, корисник прима обавештења у погрешно време или их уопште не прима.
Безбедност апликација такође страда од нетачног времена: шифровање засновано на времену (time-based OTP), дневници догађаја са нетачним ознакама, неисправан рад rate-limiting-а на страни сервера (сервер блокира „будуће" захтеве). Према OWASP Mobile Top 10 (2024), неповерење у системско време спада у категорију недовољне безбедности платформе. Програмерима се препоручује да увек проверавају време на серверу, а не да се ослањају искључиво на клијентски сат. Ако разлика премаши праг (препоручује се 5 секунди), апликација треба да блокира критичне операције до синхронизације.
| Сценарио | Ефекат десинхронизације |
|---|---|
| HTTPS/TLS | Сертификати се сматрају истеклим или неважећим |
| OAuth 2.0 / JWT | Токени се одбијају као истекли |
| Push обавештења | Обавештења стижу у погрешно време |
| Аналитика | Догађаји са нетачним временским ознакама искривљују извештаје |
| Криптографија | Time-based OTP се не поклапа са сервером |
| Rate limiting | Сервер блокира захтеве са „будућим" временом |
Основни протоколи за синхронизацију сата — NTP и његова поједностављена верзија SNTP. NTP (RFC 5905) — комплетан протокол са филтрирањем сервера, анализом дрифта и PLL корекцијом. Користи се на серверима и мрежној опреми. SNTP (RFC 4330) — лака верзија за клијентске уређаје, не захтева сталну синхронизацију. SNTP клијент шаље захтев, добија одговор и подешава време без анализе историје. На мобилним уређајима користи се управо SNTP — уграђени Android Google Time Service (GTS) синхронизује се путем SNTP са серверима time.google.com.
Поред NTP/SNTP, синхронизација времена на мобилним уређајима могућа је путем GPS пријемника (прецизност до 10 ns у идеалним условима) и мобилне мреже (путем NITZ — Network Identity and Time Zone). GPS пружа максималну прецизност, али ради само на отвореном простору и троши много енергије. NITZ обезбеђује мобилни оператер аутоматски при регистрацији у мрежи, али га не подржавају сви оператери. Android користи комбинацију свих метода: GTS (SNTP) као приоритет, NITZ као резерву и GPS за апликације које захтевају високу прецизност.
У дистрибуираним системима — када се сервер и клиент налазе на различитим уређајима — синхронизација сата се суочава са фундаменталним ограничењима. Кашњење мреже (latency) онемогућава једнозначно одређивање тачног времена на клијенту: ако је пакет путовао 200 ms, време на серверу у тренутку слања захтева и пријема одговора је већ другачије. NTP решава овај проблем путем RTT мерења и статистичке обраде, али за дистрибуиране трансакције (нпр. банковних трансфера) то није довољно — користе се логички сатови (Lamport ознаке) или векторски сатови.
Физички сатови (wall clock) — реално UTC време, синхронизовано путем NTP. Логички сатови — редни бројеви догађаја у систему, неповезани са физичким временом. У дистрибуираним системима за уређивање догађаја често се користе векторски сатови: сваки чвор чува вектор бројача за све чворове кластера. За мобилне апликације довољна је физичка синхронизација са прецизношћу 1–5 секунди — обезбеђује исправан рад OAuth, SSL и push обавештења. Ако је потребно строго уређивање догађаја (нпр. у четовима у реалном времену), додаје се логичка синхронизација на нивоу сервера.
Имплементација синхронизације сата у Android апликацији може се извести на неколико начина. Најједноставнији — добити време сервера путем REST API-ја: сервер враћа Unix Timestamp у телу одговора или HTTP заглављу Date. Овај приступ не захтева додатне библиотеке и гарантује да се време поклапа са серверским. Други начин — коришћење SNTP клијента за директни упит NTP серверу. Трећи — ослањање на Android Google Time Service, који аутоматски синхронизује системско време ако је уређај повезан на интернет.
У Android апликацијама са ауторизацијом и финансијским операцијама препоручује се комбиновани приступ: при сваком захтеву ка API-ју чува се разлика између времена сервера и System.currentTimeMillis(). Ова разлика се примењује на сва временска израчунавања на клијенту, без обзира на то да ли је системски сат синхронизован. Овај приступ се назива clock skew correction и имплементира се кроз класу која чува последњу познату разлику са сервером. Додатно, може се покренути позадинска NTP синхронизација сваких 4–6 сати путем WorkManager-а.
// Корекција одступања сата
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
}
}
За периодичну позадинску синхронизацију времена на Android-у користите WorkManager са PeriodicWorkRequest-ом. Задатак синхронизације извршава SNTP упит или позив REST API-ја, добија време сервера и ажурира ClockSyncManager. Минимални интервал за PeriodicWorkRequest је 15 минута, али за синхронизацију времена довољно је 4–6 сати. При синхронизацији узмите у обзир стање мреже — користите NetworkType.CONNECTED ради спречавања непотребних захтева у роумингу. Ако синхронизација није успела, сачувајте претходну корекцију — она остаје важећа са постепено опадајућом прецизношћу.
Савремени мобилни уређаји синхронизују време аутоматски путем уграђених сервиса. На Android-у — Google Time Service (GTS), део Google Play Services. На iOS-у — NTP клијент уграђен у оперативни систем. Ови сервиси раде независно од апликација и не захтевају додатну конфигурацију. Корисник може искључити аутоматску синхронизацију у подешавањима, што ствара ризик за апликације — управо у овом случају програмер треба да имплементира сопствену синхронизацију. Препоручује се провера статуса аутоматске синхронизације путем Settings.Global.getInt(AUTO_TIME) и упозорење корисника када је искључена.
| Платформа | Сервис синхронизације | Протокол |
|---|---|---|
| Android | Google Time Service (GTS) | SNTP |
| iOS | Уграђени NTP клијент | NTP |
| Мобилна мрежа | NITZ (оператерски) | NITZ |
| GPS пријемник | Сателитски сигнал | GPS Atomic Time |
Ослањање искључиво на аутоматску синхронизацију је ризично — корисник је може искључити или се налазити у зони без интернета. Најбоља пракса — добијати време са сервера при сваком захтеву ка API-ју и чувати десинхронизацију у SharedPreferences или DataStore-у. За критичне операције (плаћања, ауторизација, потписивање докумената) обавезно проверите isSyncValid() пре извршења. Ако десинхронизација премашује праг — прикажите кориснику екран са предлогом да укључи аутоматску синхронизацију или да сачека синхронизацију. За игре и забавне апликације довољно је добити време са сервера при покретању и ажурирати га сваког сата.
Често постављана питања
Синхронизација сата — процес усклађивања системског времена уређаја са референтним UTC-ом. Функционише путем NTP или SNTP протокола: уређај шаље захтев серверу, мери кашњење мреже и израчунава корекцију за свој сат. Резултат — тачно време са грешком од 1–100 ms у зависности од мреже.
Без синхронизације могући су откази: SSL сертификати блокирају HTTPS, OAuth токени се сматрају истеклим, push обавештења стижу у погрешно време, аналитика бележи нетачне ознаке. За критичне операције (плаћања, ауторизација) десинхронизација већа од 5 секунди сматра се безбедносном претњом и треба да блокира операцију.
Основни — NTP (прецизност 1–50 ms, са филтрирањем и PLL) и SNTP (10–100 ms, поједностављен). Додатно: GPS (10 ns, али само на отвореном) и NITZ (путем мобилног оператера, прецизност ~1 секунда). Android користи Google Time Service на SNTP-у, iOS — уграђени NTP клијент.
Користите библиотеку Apache Commons Net (класа NTPUDPClient) за директни SNTP упит ка time.google.com или pool.ntp.org. Алтернатива — добијање времена сервера из HTTP заглавља одговора вашег API-ја. За сталну корекцију имплементирајте ClockSyncManager који чува разлику између серверског и локалног времена.
Имплементирајте clock skew correction: при сваком захтеву ка API-ју чувајте разлику између времена сервера и System.currentTimeMillis(). Користите ову разлику за корекцију времена у свим операцијама апликације. Ако разлика премаши 5 секунди — блокирајте критичне трансакције и предложите кориснику да укључи аутоматску синхронизацију у подешавањима.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође