NTP (Network Time Protocol), yerel ağlarda milisaniye, küresel ağda ise onlarca milisaniye hassasiyet sağlayan bir ağ zaman senkronizasyon protokolüdür. 1985 yılında David Mills tarafından geliştirilen protokol, tüm modern işletim sistemlerinde, mobil cihazlarda ve ağ ekipmanlarında dahili saatleri UTC referans zamanıyla senkronize etmek için kullanılır. NTP Pool Project'e (2026) göre, günlük 4 milyardan fazla cihaz senkronizasyon için NTP isteği yapmaktadır.
Önemli Noktalar
NTP (Network Time Protocol), bir bilgisayarın dahili saatini, paket anahtarlamalı bir ağ üzerinden referans zaman kaynağıyla hassas bir şekilde senkronize etmek için tasarlanmış bir ağ protokolüdür. RFC 5905'te (NTPv4) açıklanan protokol, her seviyenin stratum olarak adlandırıldığı hiyerarşik bir sunucu sistemi kullanır. Bir NTP istemcisi, sunucuya istek gönderir, paketin gidiş-dönüş süresini (RTT) ölçer ve kendi saatinin referans zamana göre sapmasını hesaplar. Düzeltme algoritması, yalnızca tek bir sapmayı değil, aynı zamanda saat üretecinin sürüklenmesini de dikkate alır ve böylece tekrarlanan istekler olmadan uzun süreler boyunca hassasiyeti korur.
Protokol, David Mills tarafından 1985 yılında ARPANET ağı için geliştirilmiştir. İlk belirtim (RFC 958), 100 ms'ye kadar hassasiyete sahip basit bir senkronizasyon algoritması tanımlıyordu. NTPv3 (RFC 1305, 1992), bir filtreleme algoritması ve geliştirilmiş gecikme işleme ekledi. NTPv4 (RFC 5905, 2010) — mevcut sürüm — IPv6 desteği, otomatik sunucu yapılandırması ve Network Time Security (NTS) aracılığıyla saldırılara karşı koruma içerir. 40 yıl içinde protokol, bir araştırma projesinden, finansal işlemlerin, telekomünikasyonun ve mobil ağların imkansız olacağı bir altyapı standardına dönüşmüştür.
NTP'nin çalışma prensibi, ağdaki paket seyahat süresinin ölçülmesine dayanır. İstemci, T1 zaman damgasıyla (yerel gönderme zamanı) bir istek gönderir. Sunucu, isteği T2 zamanında (sunucu zamanı) alır, T3 zaman damgasıyla bir yanıt oluşturur ve gönderir. İstemci, yanıtı T4 zamanında alır. Dört zaman damgasını kullanarak istemci, sapma = ((T2 - T1) + (T3 - T4)) / 2 ve gecikme = (T4 - T1) - (T3 - T2) hesaplar. Gecikme 1 saniyeyi aşarsa, sonuç güvenilmez olarak kabul edilir — bu, aşırı yüklenmiş veya dengesiz kanallara karşı koruma sağlar.
Sadece doğru saati ayarlamak yeterli değildir — bir cihazdaki kuvars osilatörü, sıcaklık, yaşlanma ve voltaj nedeniyle sürekli olarak sürüklenir (ileri veya geri gider). NTP, bu sorunu PLL (Phase-Locked Loop) algoritmasını kullanarak çözer: saati zorla ayarlamaz, saat hızını ayarlar. Cihaz saatte 0,1 saniye ileri gidiyorsa, NTP, sürüklenme telafi edilene kadar sistem saatini yavaşlatır. Bu yaklaşım, kararlı ağlarda her 30 saniyede bir değil, her birkaç saatte bir senkronizasyona olanak tanır.
// 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);
Tüm NTP sistemi, her seviyenin stratum olarak adlandırıldığı bir hiyerarşi halinde düzenlenmiştir. Stratum 0, referans saattir: atom saatleri, GPS alıcıları veya WWVB radyo sinyalleri. Bu cihazlar doğrudan ağa bağlı değildir. Stratum 1 — referans saatlere doğrudan bağlı sunucular. Stratum 2, stratum 1'den zaman alır, stratum 3, stratum 2'den alır ve bu şekilde stratum 15'e kadar devam eder. Stratum numarası ne kadar yüksekse, hassasiyet o kadar düşük olabilir — her seviye küçük bir gecikme ve hata ekler. Stratum 16, zamanın kullanılamadığı (senkronize edilmediği) anlamına gelir.
| Stratum | Açıklama | Hassasiyet |
|---|---|---|
| Stratum 0 | Atom saatleri, GPS, radyo sinyalleri | Nanisaniye |
| Stratum 1 | Referansa bağlı sunucular | Mikrosaniye |
| Stratum 2 | Genel NTP sunucuları | 1–10 ms |
| Stratum 3 | Kuruluşların yerel sunucuları | 10–50 ms |
| Stratum 4+ | İstemci cihazlar | 100 ms'ye kadar |
Mobil cihazlar için stratum 2 sunucuları idealdir — yeterli sayıdadırlar ve hassasiyet ile kullanılabilirlik arasında iyi bir denge sağlarlar. Örneğin, pool.ntp.org, yükü otomatik olarak dağıtan dünya çapında binlerce sunucudan oluşan bir havuzdur. Android uygulamaları için doğrudan stratum 1 kullanılması önerilmez: ilk olarak, birincil sunucularda aşırı yük oluşturur, ikinci olarak, bir mobil cihaz yalnızca stratum 2'nin sağladığı 10–50 ms hassasiyete ihtiyaç duyar. Kurumsal ağlarda, harici bir stratum 2 ile senkronize olan yerel bir stratum 3-4 sunucusu kurulur.
SNTP (Simple Network Time Protocol, RFC 4330), sınırlı kaynaklara sahip cihazlar için NTP'nin basitleştirilmiş bir uygulamasıdır: mikrokontrolörler, IoT sensörleri ve yüksek hassasiyet gerektirmeyen mobil uygulamalar. Tam NTP'nin aksine, SNTP birden çok sunucu filtrelemesi yapmaz, saat sapmasını analiz etmez ve karmaşık PLL algoritmaları kullanmaz. Bir SNTP istemcisi istek gönderir, yanıt alır ve saati bir kez ayarlar. SNTP hassasiyeti ağa bağlı olarak 10–100 ms'dir — bu, finansal işlemler hariç, mobil senaryoların büyük çoğunluğu için yeterlidir.
SNTP, sürekli senkronizasyonu sürdürmeden sunucudan yalnızca geçerli saati alması gereken Android uygulamaları için uygundur. Örneğin, bir uygulama girişte sunucu saatini gösterir veya günde bir kez senkronize olur. Tam NTP, sürekli hassasiyet ve sapma izlemenin kritik olduğu sunucu sistemleri, telekomünikasyon ekipmanları, finans platformları ve dağıtık veritabanları için gereklidir. Mobil geliştirme için SNTP yeterlidir — Android'in yerleşik zaman servisi, Google sunucularıyla periyodik senkronizasyon için bunu kullanır.
Android uygulamalarında, NTP aracılığıyla doğru saat elde etmek, sistem saatinin kullanıcı tarafından değiştirilebildiği veya ağ olmaması nedeniyle gerçek saatten farklı olduğu durumlarda gereklidir. Android'de yerleşik bir genel NTP istemcisi yoktur — geliştiriciler, Apache Commons Net SntpClient kitaplığını veya üçüncü taraf çözümleri kullanır. 2022'de Google, Android API'sine (Google Play Services aracılığıyla) dahili bir SntpClient sınıfı ekledi, ancak yapılandırma gerektirir ve genel kullanım için belgelenmemiştir. Alternatif bir yaklaşım, yanıt gövdesinde sunucu zaman damgasını döndüren bir REST API aracılığıyla zaman talep etmektir.
Android'de temel bir SNTP uygulaması, bir NTP sunucusuna (örneğin pool.ntp.org) UDP paketi göndermek, yanıtı ayrıştırmak ve iletim zaman damgasını (T3) çıkarmaktan oluşur. Kod, ağ zaman aşımlarını ve ayrıştırma hatalarını işlemelidir — gerçek bir uygulamada, bu işlem bir arka plan iş parçacığında gerçekleştirilir ve sonuç bir sonraki senkronizasyona kadar önbelleğe alınır. Apache Commons Net kitaplığı, build.gradle'a bağımlılık eklenerek minimum değişiklikle Android'de kullanılabilen, kullanıma hazır bir NTPUDPClient sınıfı sağlar.
// 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
}
}
NTP'nin hassasiyeti birkaç faktöre bağlıdır: ağ gecikmesi (RTT), kanal kararlılığı, sunucu yükü ve yerel saat üretecinin kalitesi. 1 ms'den az gecikmeli bir yerel ağda NTP, 0,1–1 ms hassasiyet elde eder. 10–50 ms gecikmeli internet üzerinden hassasiyet 10–50 ms'ye düşer. Tek seferlik hassasiyetten daha önemli olan kararlılıktır: gecikme değişiyorsa (sarsıntı), NTP'nin güvenilir bir sapma hesaplaması için daha fazla zamana ihtiyacı vardır. Mobil cihazlar için ana istikrarsızlık faktörü, gecikmenin büyük ölçüde değişebildiği Wi-Fi ve mobil ağlar arasındaki geçiştir.
Doğru saate duyarlı Android uygulamaları için önerilir: birden çok NTP sunucusu kullanın ve en düşük gecikmeli olanı seçin; ağ geçişleri sırasında senkronizasyondan kaçının; son alınan saati önbelleğe alın ve System.currentTimeMillis ile ayarlayın. Oyunlar ve gerçek zamanlı uygulamalar için (NTP, ağ gecikmesi nedeniyle burada uygun değildir) — her istekte iletilen sunucu saatini kullanın. Finansal uygulamalarda, sunucuyla olan farkı her zaman kontrol edin — fark 5 saniyeyi aşarsa, işlemi potansiyel olarak güvenli değil olarak engelleyin.
Sıkça Sorulan Sorular
NTP (Network Time Protocol), internet üzerinden saat senkronizasyon protokolüdür. Cihazlardaki saati UTC referansıyla hizalamak için gereklidir. NTP olmadan, kuvars osilatör sapması nedeniyle bilgisayar saatleri günde saniyelerce sapar ve bu, finansal işlemler, günlükleme ve güvenlik için kritiktir.
NTP sistemi seviyeler — stratum kullanır: stratum 0 (atom saatleri ve GPS), stratum 1 (referansa bağlı sunucular), stratum 2 (genel NTP sunucuları), stratum 3–4 (yerel sunucular), stratum 5–15 (istemciler). Stratum ne kadar yüksekse, potansiyel hata o kadar büyüktür. Stratum 16, saatin senkronize olmadığı anlamına gelir.
SNTP, sınırlı kaynaklara sahip cihazlar için NTP'nin basitleştirilmiş bir sürümüdür. Sunucuları filtrelemez, saat sapmasını analiz etmez veya PLL kullanmaz. SNTP, 10–100 ms hassasiyetin yeterli olduğu mobil uygulamalar için uygundur. Tam NTP, sunucular, telekomünikasyon ekipmanları ve fintech sistemleri için gereklidir.
Apache Commons Net kitaplığını NTPUDPClient sınıfıyla kullanın. pool.ntp.org'a bir istek gönderin, yanıtı alın ve iletim zaman damgasını çıkarın. Alternatif olarak, Date başlığında veya Unix Timestamp biçimindeki yanıt gövdesinde sunucu saatini döndüren sunucunuzun REST API'sini kullanın.
NTP senkronizasyonu olmadan, bir cihazdaki sistem saati dakikalar veya saatler fark edebilir. Bu, push bildirimlerini, SSL sertifikası doğrulamasını, günlükleri, görev zamanlayıcıları ve kriptografik protokolleri bozar. Finansal uygulamalarda, 5 saniyeden fazla fark bir güvenlik tehdidi olarak kabul edilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun