NTP (Network Time Protocol) — мрежови протокол за синхронизация на часовника, осигуряващ точност на времето до милисекунди в локални мрежи и до десетки милисекунди в глобалната мрежа. Протоколът, разработен от Дейвид Милс през 1985 г., се използва във всички съвременни операционни системи, мобилни устройства и мрежово оборудване за съгласуване на вътрешните часовници с референтното време UTC. Според NTP Pool Project (2026) над 4 милиарда устройства ежедневно изпълняват NTP заявки за синхронизация.
Основни точки
NTP (Network Time Protocol) — мрежови протокол, предназначен за прецизна синхронизация на вътрешния часовник на компютъра с референтен източник на време през мрежа с пакетна комутация. Протоколът, описан в RFC 5905 (NTPv4), използва йерархична система от сървъри, където всяко ниво се нарича стратум (stratum). NTP клиентът изпраща заявки към сървъра, измерва времето за преминаване на пакета (RTT) и изчислява отместването на собствения си часовник спрямо референтното време. Алгоритъмът за корекция взема предвид не само еднократното отместване, но и отклонението на тактовия генератор, което позволява поддържане на точност за дълго време без повторни заявки.
Протоколът е разработен от Дейвид Милс през 1985 г. за мрежата ARPANET. Първата спецификация (RFC 958) описва прост алгоритъм за синхронизация с точност до 100 ms. NTPv3 (RFC 1305, 1992) добавя алгоритъм за филтриране и подобрена обработка на закъснения. NTPv4 (RFC 5905, 2010) — текущата версия — включва поддръжка за IPv6, автоматична конфигурация на сървъри и защита срещу атаки чрез Network Time Security (NTS). За 40 години протоколът преминава от научен проект до инфраструктурен стандарт, без който работата на финансови транзакции, телекомуникации и мобилни мрежи е невъзможна.
Принципът на работа на NTP се основава на измерване на времето за преминаване на пакета в мрежата. Клиентът изпраща заявка с времеви печат T1 (локално време на изпращане). Сървърът получава заявката в момент T2 (сървърно време), създава отговор с печат T3 и го изпраща. Клиентът получава отговора в момент T4. Познавайки всичките четири времеви печата, клиентът изчислява отместване offset = ((T2 - T1) + (T3 - T4)) / 2 и закъснение delay = (T4 - T1) - (T3 - T2). Ако закъснението е по-голямо от 1 секунда, резултатът се счита за ненадежден — това е защита срещу претоварени или нестабилни канали.
Простото задаване на точно време не е достатъчно — кварцовият генератор на устройството постоянно се отклонява (избързва или закъснява) поради температура, стареене и напрежение. NTP решава този проблем с алгоритъма PLL (Phase-Locked Loop): той не задава времето насила, а настройва скоростта на часовника. Ако устройството избързва с 0,1 секунди на час, NTP забавя системния часовник, докато отклонението бъде компенсирано. Този подход позволява синхронизация веднъж на няколко часа в стабилни мрежи, вместо на всеки 30 секунди.
// Опростена схема на NTP алгоритъм
struct NTPPacket {
uint8_t flags; // LI, VN, Режим
uint8_t stratum; // ниво стратум на сървъра
uint32_t refTimestamp; // референтен времеви печат
uint32_t originTimestamp; // T1
uint32_t recvTimestamp; // T2
uint32_t xmitTimestamp; // T3
};
// Изчислете отместване и закъснение
double offset = ((t2 - t1) + (t3 - t4)) / 2.0;
double delay = (t4 - t1) - (t3 - t2);
Цялата система NTP е организирана в йерархия, където всяко ниво се нарича стратум (stratum). Stratum 0 — референтни часовници: атомни часовници, GPS приемници или радиосигнали WWVB. Тези устройства не са директно свързани към мрежата. Stratum 1 — сървъри, директно свързани към референтните часовници. Stratum 2 получават време от stratum 1, stratum 3 — от stratum 2 и така нататък до stratum 15. Колкото по-висок е номерът на стратума, толкова по-ниска е потенциалната точност — всяко ниво добавя малко закъснение и грешка. Stratum 16 означава, че времето не е достъпно (не е синхронизирано).
| Стратум | Описание | Точност |
|---|---|---|
| Stratum 0 | Атомни часовници, GPS, радиосигнали | Наносекунди |
| Stratum 1 | Сървъри, свързани към референтен | Микросекунди |
| Stratum 2 | Публични NTP сървъри | 1–10 ms |
| Stratum 3 | Локални сървъри на организации | 10–50 ms |
| Stratum 4+ | Клиентски устройства | до 100 ms |
За мобилни устройства оптимални са сървърите stratum 2 — достатъчно са много и осигуряват добър баланс между точност и достъпност. Например pool.ntp.org — група от хиляди сървъри по целия свят, която автоматично разпределя натоварването. За Android приложения не се препоръчва директно използване на stratum 1: първо, създава прекомерно натоварване на първичните сървъри, и второ, мобилното устройство се нуждае от точност 10–50 ms, която осигурява stratum 2. В корпоративни мрежи се инсталира локален stratum 3-4 сървър, който се синхронизира с външен stratum 2.
SNTP (Simple Network Time Protocol, RFC 4330) — опростена имплементация на NTP за устройства с ограничени ресурси: микроконтролери, IoT сензори и мобилни приложения, които не изискват висока точност. За разлика от пълния NTP, SNTP не извършва филтриране на множество сървъри, не анализира отклонение на часовника и не използва сложни PLL алгоритми. SNTP клиентът изпраща заявка, получава отговор и еднократно задава времето. Точността на SNTP е 10–100 ms в зависимост от мрежата — това е достатъчно за огромното мнозинство от мобилни сценарии, с изключение на финансови транзакции.
SNTP е подходящ за Android приложения, които просто трябва да получат текущото време от сървъра, без да поддържат постоянна синхронизация. Например приложението показва времето от сървъра при влизане или се синхронизира веднъж дневно. Пълен NTP е необходим за сървърни системи, телекомуникационно оборудване, финансови платформи и разпределени бази данни, където постоянната точност и мониторингът на отклонение са критични. За мобилно разработване SNTP е достатъчен — вградената услуга за време на Android го използва за периодична синхронизация със сървърите на Google.
В Android приложения получаването на точно време чрез NTP е необходимо, когато системното време може да бъде променено от потребителя или се различава от реалното поради липса на мрежа. Android няма вграден публичен NTP клиент — разработчиците използват библиотеката Apache Commons Net SntpClient или решения на трети страни. През 2022 г. Google добави вътрешния клас SntpClient към Android API (чрез Google Play Services), но той изисква конфигурация и не е документиран за общо ползване. Алтернативен подход — заявка за време чрез REST API, който връща времевия печат на сървъра в тялото на отговора.
Основната имплементация на SNTP в Android се състои от изпращане на UDP пакет до NTP сървър (напр. pool.ntp.org), парсване на отговора и извличане на времето за изпращане (T3 — Transmit Timestamp). Кодът трябва да обработва мрежови таймаути и грешки при парсване — в реално приложение тази операция се изпълнява на заден план, а резултатът се кешира до следващата синхронизация. Библиотеката Apache Commons Net предоставя готовия клас NTPUDPClient, който може да се използва в Android с минимални промени, чрез добавяне на зависимост в build.gradle.
// Получете NTP време чрез 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
}
}
Точността на NTP зависи от няколко фактора: мрежово закъснение (RTT), стабилност на канала, натоварване на сървъра и качество на локалния тактов генератор. В локална мрежа със закъснение под 1 ms NTP постига точност 0.1–1 ms. Чрез интернет при закъснение 10–50 ms точността спада до 10–50 ms. По-важна от еднократната точност е стабилността: ако закъснението варира (jitter), NTP изисква повече време за изчисляване на надеждно отместване. За мобилни устройства основният фактор за нестабилност е превключването между Wi-Fi и мобилна мрежа, при което закъснението може да се промени с порядък.
За Android приложения, чувствителни към точно време, се препоръчва: използвайте няколко NTP сървъра и изберете минимално закъснение; не синхронизирайте в моменти на превключване на мрежата; кеширайте последното получено време и го коригирайте чрез System.currentTimeMillis. За игри и приложения в реално време (NTP не е подходящ поради мрежово закъснение) — използвайте сървърно време, предавано във всяка заявка. В приложения за финансови транзакции задължително проверявайте разликата със сървъра — ако разликата е над 5 секунди, блокирайте операцията като потенциално несигурна.
Често задавани въпроси
NTP (Network Time Protocol) — протокол за синхронизация на часовника през интернет. Необходим е за съгласуване на времето на устройствата с референтно UTC. Без NTP компютърните часовници се разминават със секунди на ден поради отклонение на кварцовия генератор, което е критично за финансови транзакции, логване и сигурност.
NTP системата използва нива — стратуми: stratum 0 (атомни часовници и GPS), stratum 1 (сървъри, свързани към референтен), stratum 2 (публични NTP сървъри), stratum 3–4 (локални сървъри), stratum 5–15 (клиенти). Колкото по-висок е стратумът, толкова по-голяма е потенциалната грешка. Stratum 16 означава, че времето не е синхронизирано.
SNTP — опростена версия на NTP за устройства с ограничени ресурси. Той не филтрира сървъри, не анализира отклонение на часовника и не използва PLL. SNTP е подходящ за мобилни приложения, където точност 10–100 ms е достатъчна. Пълният NTP е необходим за сървъри, телекомуникационно оборудване и fintech системи.
Използвайте библиотека Apache Commons Net с клас NTPUDPClient. Изпратете заявка до pool.ntp.org, получете отговор и извлечете Transmit Timestamp. Алтернативно, използвайте REST API на вашия сървър, който връща сървърно време в хедъра Date или в тялото на отговора във формат Unix Timestamp.
Без синхронизация NTP системното време на устройството може да се различава с минути и часове. Това нарушава push известия, SSL сертификати (проверка на валидност), логове, планировчици на задачи и криптографски протоколи. В приложения с финансови транзакции десинхронизация над 5 секунди се счита за заплаха за сигурността.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също