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 ثانیه باشد، نتیجه غیرقابل اعتماد در نظر گرفته میشود — این محافظتی در برابر کانالهای بیش از حد بارگذاری شده یا ناپایدار است.
تنظیم ساده زمان دقیق کافی نیست — مولد کوارتز روی دستگاه به دلیل دما، پیری و ولتاژ constantly دریفت میکند (عقب یا جلو میرود). NTP این مشکل را با الگوریتم PLL (Phase-Locked Loop) حل میکند: زمان را به زور تنظیم نمیکند، بلکه سرعت حرکت ساعت را تنظیم میکند. اگر دستگاه 0.1 ثانیه در ساعت جلو باشد، NTP سرعت ساعت سیستم را کاهش میدهد تا زمانی که دریفت جبران شود. این رویکرد امکان همگامسازی هر چند ساعت یک بار در شبکههای پایدار را فراهم میکند، نه هر 30 ثانیه.
// طرح سادهشده الگوریتم NTP
struct NTPPacket {
uint8_t flags; // LI، VN، حالت
uint8_t stratum; // سطح استرات سرور
uint32_t refTimestamp; // timestamp مرجع
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 optimal هستند — تعداد آنها کافی است و تعادل خوبی بین دقت و دسترسی فراهم میکنند. به عنوان مثال، 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 که timestamp سرور را در بدنه پاسخ برمیگرداند.
پیادهسازی پایه SNTP در Android شامل ارسال بسته UDP به سرور NTP (مثلاً pool.ntp.org)، تجزیه پاسخ و استخراج زمان ارسال (T3 — Transmit Timestamp) است. کد باید timeout شبکه و خطاهای تجزیه را مدیریت کند — در برنامه واقعی این عملیات در پسزمینه انجام میشود و نتیجه تا همگامسازی بعدی کش میشود. کتابخانه 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 کامل برای سرورها، تجهیزات مخابراتی و سیستمهای فینتک مورد نیاز است.
از کتابخانه Apache Commons Net با کلاس NTPUDPClient استفاده کنید. به pool.ntp.org درخواست ارسال کنید، پاسخ را دریافت و Transmit Timestamp را استخراج کنید. همچنین میتوانید از REST API سرور خود استفاده کنید که زمان سرور را در هدر Date یا بدنه پاسخ در قالب Unix Timestamp برمیگرداند.
بدون همگامسازی NTP، زمان سیستم روی دستگاه میتواند دقیقهها و ساعتها تفاوت داشته باشد. این کار اعلانهای push، گواهیهای SSL (بررسی اعتبار)، لاگها، زمانبندهای وظایف و پروتکلهای رمزنگاری را مختل میکند. در برنامههای با تراکنشهای مالی، عدم همگامسازی بیش از 5 ثانیه تهدید امنیتی محسوب میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید