هم‌زمان‌سازی ساعت در برنامه‌ها — ماهیت، پروتکل‌ها و پیاده‌سازی

نویسنده: IT Sectr منتشر شده: 2026-07-14 زمان مطالعه: 9 دقیقه

Clock Sync (هم‌زمان‌سازی ساعت) — فرآیند تطبیق نشانگرهای ساعت داخلی دستگاه با منبع زمان مرجع. در برنامه‌های موبایل، هم‌زمان‌سازی دقیق برای عملکرد صحیح اعلان‌های push، گواهی‌های SSL/TLS، پروتکل‌های رمزنگاری و تحلیل داده حیاتی است. طبق Google Security Blog (2024)، بیش از 30٪ از خرابی‌های اتصالات HTTPS در دستگاه‌های موبایل به دلیل عدم هم‌زمان‌سازی زمان سیستم بیش از 5 ثانیه ایجاد می‌شود.

نکات اصلی

  • Clock Sync — تطبیق ساعت دستگاه با UTC مرجع از طریق پروتکل‌های NTP، SNTP یا GPS
  • اهمیت — عدم هم‌زمان‌سازی بیش از 5 ثانیه عملکرد SSL، اعلان‌های push، توکن‌های OAuth و لاگ‌ها را مختل می‌کند
  • پروتکل‌های اصلی — NTP (دقت 1–50 میلی‌ثانیه) و SNTP (نسخه ساده‌شده، 10–100 میلی‌ثانیه)
  • هم‌زمان‌سازی اندروید — سرویس زمان داخلی Google (GTS) از طریق SNTP با سرورهای Google هم‌زمان می‌شود
  • تصحیح نرم‌افزاری — برای برنامه‌ها مقایسه زمان با سرور حیاتی است، نه اتکا به زمان سیستم دستگاه

هم‌زمان‌سازی ساعت چیست؟

هم‌زمان‌سازی ساعت (Clock Sync) — مکانیزم تطبیق ساعت داخلی دستگاه با زمان مرجع UTC (Universal Coordinated Time) است. بدون هم‌زمان‌سازی، نوسان‌ساز کوارتزی در دستگاه موبایل به تدریج دچار خطا می‌شود — رانش روزانه 1–10 ثانیه بسته به دما و کیفیت قطعات. هم‌زمان‌سازی این رانش را جبران کرده و زمان دقیق را از منابع خارجی دریافت می‌کند: سرورهای NTP در اینترنت، ماهواره‌های GPS یا ایستگاه‌های پایه سلولی. در حالت ایده‌آل، دستگاه باید هر 4–6 ساعت برای حفظ دقت در محدوده 1 ثانیه هم‌زمان شود.

ساعت سخت‌افزاری و نرم‌افزاری

در دستگاه موبایل دو نوع ساعت وجود دارد: سخت‌افزاری (RTC، Real-Time Clock) با تغذیه جداگانه از باتری — حتی هنگام خاموش بودن دستگاه کار می‌کند، و نرم‌افزاری (system time) که توسط سیستم عامل مدیریت می‌شود. هنگام بوت دستگاه، زمان سیستم از RTC مقداردهی می‌شود و سپس از طریق وقفه‌های نوسان‌ساز حفظ می‌شود. هم‌زمان‌سازی NTP زمان سیستم را تصحیح می‌کند و در برخی موارد تصحیح را به RTC نیز می‌نویسد. در اندروید دسترسی به 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 با سرور مطابقت ندارد
محدودسازی نرخسرور درخواست‌های با زمان «آینده» را مسدود می‌کند

پروتکل‌های هم‌زمان‌سازی: NTP و SNTP

پروتکل‌های اصلی برای هم‌زمان‌سازی ساعت — NTP و نسخه ساده‌شده آن SNTP. NTP (RFC 5905) — پروتکل کامل با فیلتر کردن سرورها، تحلیل رانش و تصحیح PLL. روی سرورها و تجهیزات شبکه استفاده می‌شود. SNTP (RFC 4330) — نسخه سبک برای دستگاه‌های کلاینت که نیاز به هم‌زمان‌سازی مداوم ندارد. کلاینت SNTP درخواست می‌فرستد، پاسخ می‌گیرد و زمان را بدون تحلیل تاریخچه تنظیم می‌کند. در دستگاه‌های موبایل دقیقاً از SNTP استفاده می‌شود — سرویس زمان Google اندروید (GTS) از طریق SNTP با سرورهای time.google.com هم‌زمان می‌شود.

روش‌های اضافی هم‌زمان‌سازی

علاوه بر NTP/SNTP، هم‌زمان‌سازی زمان در دستگاه‌های موبایل از طریق گیرنده GPS (دقت تا 10 ns در شرایط ایده‌آل) و شبکه سلولی (از طریق NITZ — Network Identity and Time Zone) امکان‌پذیر است. GPS حداکثر دقت را فراهم می‌کند اما فقط در فضای باز کار می‌کند و انرژی زیادی مصرف می‌کند. NITZ به طور خودکار توسط اپراتور سلولی هنگام ثبت در شبکه ارائه می‌شود، اما همه اپراتورها از آن پشتیبانی نمی‌کنند. اندروید از ترکیب همه روش‌ها استفاده می‌کند: GTS (SNTP) اولویت، NITZ به عنوان پشتیبان و GPS برای برنامه‌هایی که دقت بالا نیاز دارند.

مشکلات هم‌زمان‌سازی در سیستم‌های توزیع‌شده

در سیستم‌های توزیع‌شده — زمانی که سرور و کلاینت روی دستگاه‌های مختلف قرار دارند — هم‌زمان‌سازی ساعت با محدودیت‌های بنیادین مواجه است. تأخیر شبکه (latency) تعیین دقیق زمان روی کلاینت را غیرممکن می‌کند: اگر بسته 200 میلی‌ثانیه در راه بود، زمان روی سرور در لحظه ارسال درخواست و دریافت پاسخ متفاوت است. NTP این مشکل را از طریق اندازه‌گیری RTT و پردازش آماری حل می‌کند، اما برای تراکنش‌های توزیع‌شده (مثلاً انتقال بانکی) کافی نیست — از ساعت‌های منطقی (مهرهای Lamport) یا ساعت‌های برداری استفاده می‌شود.

ساعت‌های فیزیکی در مقابل منطقی

ساعت‌های فیزیکی (wall clock) — زمان واقعی UTC که از طریق NTP هم‌زمان می‌شود. ساعت‌های منطقی — شماره‌های ترتیبی رویدادها در سیستم که به زمان فیزیکی وابسته نیستند. در سیستم‌های توزیع‌شده برای مرتب‌سازی رویدادها اغلب از ساعت‌های برداری استفاده می‌شود: هر گره یک بردار شمارنده برای تمام گره‌های خوشه نگه می‌دارد. برای برنامه‌های موبایل، هم‌زمان‌سازی فیزیکی با دقت 1–5 ثانیه کافی است — این عملکرد صحیح OAuth، SSL و اعلان‌های push را تضمین می‌کند. اگر ترتیب‌بندی دقیق رویدادها لازم باشد (مثلاً در چت‌های بلادرنگ)، هم‌زمان‌سازی منطقی در سطح سرور اضافه می‌شود.

پیاده‌سازی هم‌زمان‌سازی ساعت در اندروید

هم‌زمان‌سازی ساعت در برنامه اندروید به چند روش قابل پیاده‌سازی است. ساده‌ترین — دریافت زمان سرور از طریق REST API: سرور Unix Timestamp را در بدنه پاسخ یا هدر HTTP Date برمی‌گرداند. این رویکرد به کتابخانه اضافی نیاز ندارد و تضمین می‌کند زمان با سرور مطابقت دارد. روش دوم — استفاده از کلاینت SNTP برای درخواست مستقیم به سرور NTP. روش سوم — اتکا به سرویس زمان Google اندروید که اگر دستگاه به اینترنت متصل باشد، زمان سیستم را به طور خودکار هم‌زمان می‌کند.

مقایسه رویکردها برای اندروید

در برنامه‌های اندروید با احراز هویت و عملیات مالی، رویکرد ترکیبی توصیه می‌شود: در هر درخواست به API اختلاف بین زمان سرور و System.currentTimeMillis() ذخیره می‌شود. این اختلاف به تمام محاسبات زمانی روی کلاینت اعمال می‌شود، صرف‌نظر از اینکه ساعت سیستم هم‌زمان شده یا نه. این رویکرد clock skew correction نامیده می‌شود و از طریق کلاسی که آخرین اختلاف شناخته شده با سرور را ذخیره می‌کند پیاده‌سازی می‌شود. علاوه بر این، می‌توان هر 4–6 ساعت یک هم‌زمان‌سازی NTP پس‌زمینه از طریق WorkManager اجرا کرد.

kotlin
// تصحیح انحراف ساعت
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
    }
}

هم‌زمان‌سازی پس‌زمینه از طریق WorkManager

برای هم‌زمان‌سازی دوره‌ای زمان در پس‌زمینه روی اندروید از WorkManager با PeriodicWorkRequest استفاده کنید. وظیفه هم‌زمان‌سازی یک درخواست SNTP یا فراخوانی REST API اجرا می‌کند، زمان سرور را دریافت و ClockSyncManager را به‌روز می‌کند. حداقل فاصله برای PeriodicWorkRequest 15 دقیقه است، اما برای هم‌زمان‌سازی زمان 4–6 ساعت کافی است. هنگام هم‌زمان‌سازی وضعیت شبکه را در نظر بگیرید — از NetworkType.CONNECTED برای جلوگیری از درخواست‌های اضافی در رومینگ استفاده کنید. اگر هم‌زمان‌سازی ناموفق بود، تصحیح قبلی را حفظ کنید — با دقت تدریجی کاهش‌یافته معتبر می‌ماند.

هم‌زمان‌سازی خودکار زمان در دستگاه‌ها

دستگاه‌های موبایل مدرن زمان را به طور خودکار از طریق سرویس‌های داخلی هم‌زمان می‌کنند. در اندروید — Google Time Service (GTS)، بخشی از Google Play Services. در iOS — کلاینت NTP داخلی در سیستم عامل. این سرویس‌ها مستقل از برنامه‌ها کار می‌کنند و نیاز به تنظیمات اضافی ندارند. کاربر می‌تواند هم‌زمان‌سازی خودکار را در تنظیمات غیرفعال کند که برای برنامه‌ها خطر ایجاد می‌کند — در این صورت توسعه‌دهنده باید هم‌زمان‌سازی خود را پیاده‌سازی کند. توصیه می‌شود وضعیت هم‌زمان‌سازی خودکار را از طریق Settings.Global.getInt(AUTO_TIME) بررسی کرده و در صورت غیرفعال بودن به کاربر هشدار دهید.

پلتفرمسرویس هم‌زمان‌سازیپروتکل
AndroidGoogle Time Service (GTS)SNTP
iOSکلاینت NTP داخلیNTP
شبکه سلولیNITZ (اپراتور)NITZ
گیرنده GPSسیگنال ماهوارهGPS Atomic Time

توصیه‌هایی برای توسعه‌دهندگان

اتکا صرفاً به هم‌زمان‌سازی خودکار خطرناک است — کاربر ممکن است آن را غیرفعال کند یا در منطقه بدون اینترنت باشد. بهترین روش — دریافت زمان از سرور در هر درخواست API و ذخیره اختلاف در SharedPreferences یا DataStore. برای عملیات حیاتی (پرداخت، احراز هویت، امضای اسناد) حتماً قبل از اجرا isSyncValid() را بررسی کنید. اگر اختلاف از آستانه فراتر رفت — صفحه‌ای با پیشنهاد فعال‌سازی هم‌زمان‌سازی خودکار یا انتظار برای هم‌زمان‌سازی به کاربر نشان دهید. برای برنامه‌های بازی و سرگرمی، دریافت زمان از سرور هنگام راه‌اندازی و به‌روزرسانی هر ساعت کافی است.

سوالات متداول

هم‌زمان‌سازی ساعت چیست و چگونه کار می‌کند؟

هم‌زمان‌سازی ساعت — فرآیند تطبیق زمان سیستم دستگاه با UTC مرجع است. از طریق پروتکل‌های NTP یا SNTP کار می‌کند: دستگاه به سرور درخواست می‌فرستد، تأخیر شبکه را اندازه می‌گیرد و تصحیح ساعت خود را محاسبه می‌کند. نتیجه — زمان دقیق با خطای 1–100 میلی‌ثانیه بسته به شبکه.

چرا در برنامه‌های موبایل باید زمان را هم‌زمان کرد؟

بدون هم‌زمان‌سازی ممکن است خطاهایی رخ دهد: گواهی‌های SSL HTTPS را مسدود می‌کنند، توکن‌های OAuth منقضی تلقی می‌شوند، اعلان‌های push در زمان اشتباه می‌رسند، تحلیل داده مهرهای نادرست ثبت می‌کند. برای عملیات حیاتی (پرداخت، احراز هویت) عدم هم‌زمان‌سازی بیش از 5 ثانیه تهدید امنیتی محسوب می‌شود و باید عملیات را مسدود کند.

چه پروتکل‌هایی برای هم‌زمان‌سازی استفاده می‌شود؟

اصلی — NTP (دقت 1–50 میلی‌ثانیه، با فیلتر و PLL) و SNTP (10–100 میلی‌ثانیه، ساده‌شده). اضافی: GPS (10 ns، اما فقط در فضای باز) و NITZ (از طریق اپراتور سلولی، دقت ~1 ثانیه). اندروید از Google Time Service روی SNTP استفاده می‌کند، iOS — کلاینت NTP داخلی.

چگونه از طریق NTP در اندروید زمان را هم‌زمان کنیم؟

از کتابخانه Apache Commons Net (کلاس NTPUDPClient) برای درخواست مستقیم SNTP به time.google.com یا pool.ntp.org استفاده کنید. جایگزین — دریافت زمان سرور از هدرهای پاسخ HTTP API خود. برای تصحیح دائمی، ClockSyncManager را پیاده‌سازی کنید که اختلاف بین زمان سرور و محلی را ذخیره می‌کند.

اگر زمان دستگاه با سرور متفاوت است چه باید کرد؟

Clock skew correction را پیاده‌سازی کنید: در هر درخواست API اختلاف بین زمان سرور و System.currentTimeMillis() را ذخیره کنید. از این اختلاف برای تصحیح زمان در تمام عملیات برنامه استفاده کنید. اگر اختلاف بیش از 5 ثانیه است — تراکنش‌های حیاتی را مسدود کرده و به کاربر پیشنهاد فعال‌سازی هم‌زمان‌سازی خودکار در تنظیمات را بدهید.

خلاصه

  • Clock Sync — فرآیند تطبیق ساعت سیستم با زمان مرجع UTC از طریق NTP، SNTP، GPS یا شبکه سلولی
  • اهمیت — عدم هم‌زمان‌سازی بیش از 5 ثانیه SSL/TLS، OAuth، اعلان‌های push، تحلیل داده و رمزنگاری را مختل می‌کند
  • پروتکل‌های اصلی — NTP (با تصحیح PLL و فیلتر، دقت 1–50 میلی‌ثانیه) و SNTP (ساده‌شده، دقت 10–100 میلی‌ثانیه)
  • پیاده‌سازی اندروید — از طریق Google Time Service داخلی، از طریق Apache Commons Net یا REST API برنامه‌نویسی؛ WorkManager برای هم‌زمان‌سازی پس‌زمینه
  • Clock skew correction — روش اجباری: اختلاف زمان سرور و محلی را ذخیره کنید، تمام محاسبات را روی کلاینت تصحیح کنید
  • سیستم‌های توزیع‌شده — برای ترتیب‌بندی دقیق رویدادها از ساعت‌های منطقی (Lamport، برداری) نیز استفاده می‌شود
  • توصیه — وضعیت AUTO_TIME را در اندروید بررسی کنید، در صورت غیرفعال بودن هم‌زمان‌سازی خودکار به کاربر هشدار دهید و در اختلاف > 5 ثانیه عملیات را مسدود کنید

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید