تشخیص زمان شبکه

دستگاه‌های Android به‌طور خودکار تلاش می‌کنند زمان صحیح مبدأ Unix را از منبع شبکه دریافت کنند. ‫Android از «پروتکل زمان شبکه ساده» (SNTP) استفاده می‌کند که از «پروتکل داده‌گرام کاربر» (UDP) برای دریافت اطلاعات زمان استفاده می‌کند.

عناصر توصیف‌شده در این صفحه بخشی از سیستم تشخیص خودکار زمان هستند که به‌عنوان منبع زمان شبکه شناخته می‌شود. وقتی تشخیص خودکار زمان در دستگاه پشتیبانی شود و سرویس time_detector برای استفاده از آن پیکربندی شده باشد، می‌توان از سیگنال زمان سرور زمان شبکه برای تنظیم ساعت سیستم دستگاه Android استفاده کرد.

به‌طور پیش‌فرض، Android از مبدأ زمان شبکه به‌عنوان مبدأ اصلی تشخیص خودکار زمان استفاده می‌کند.

سیستم تشخیص زمان شبکه

سرویس network_time_update_service که در سرور سیستم Android اجرا می‌شود سیستم تشخیص زمان شبکه را پیاده‌سازی می‌کند. این سرویس به‌صورت دوره‌ای از SNTP برای دریافت سیگنال زمان از سرور استفاده می‌کند. این سرویس همچنین اتصال‌پذیری شبکه را پایش می‌کند و وقتی سیگنال زمان اخیر پس‌از دوره‌های طولانی اتصال‌پذیری ضعیف دردسترس نباشد، بازآوری زمان را راه‌اندازی می‌کند.

خدمات network_time_update_service پس‌از راه‌اندازی و زمانی که اتصال شبکه برای اولین‌بار برقرار می‌شود، سعی می‌کند سیگنال زمان را دریافت کند. سپس سرویس تلاش می‌کند آخرین سیگنالی را که دارد به‌روز نگه دارد. این ویژگی نیازهای دستگاه‌های Android را با بار قابل‌توجهی که ممکن است ازسوی بسیاری از دستگاه‌های Android در سراسر جهان که زمان خود را به‌روز می‌کنند ایجاد شود، متعادل می‌کند.

سرویس network_time_update_service پیشنهادهای زمان شبکه را بااستفاده از میاناهای برنامه‌سازی کاربردی داخلی به سرویس time_detector ارسال می‌کند. سپس دیگر مؤلفه‌های پلاتفرم Android از این پیشنهادهای زمان شبکه استفاده می‌کنند.

پس‌از دریافت پیشنهادها از مبدأ زمان شبکه، سرویس time_detector تعیین می‌کند که آیا ساعت سیستم را طبق قوانین اولویت‌بندی پیکربندی‌شده به‌روز کند یا نه.

برای پیکربندی سیستم تشخیص زمان خودکار به‌طوری که از پیشنهادهای مبدأ شبکه برای تنظیم خودکار ساعت سیستم استفاده کند، از core/res/res/values/config.xml فایل پیکربندی سرور سیستم استفاده کنید. مطمئن شوید مقدار network در config_autoTimeSourcesPriority در موقعیت موردنظر قرار دارد. برای اطلاعات بیشتر، به اولویت منبع زمان مراجعه کنید.

پیکربندی دستگاه

این بخش توضیح می‌دهد که سازندگان دستگاه چگونه می‌توانند سیستم تشخیص زمان شبکه را پیکربندی کنند.

پیکربندی پایه AOSP در فایل config.xml قرار دارد: frameworks/base/core/res/res/values/config.xml:

کلید پیکربندی مقدار AOSP شرح
config_ntpRetry 3 پس‌از ناموفق بودن در بازآوری، این تعداد دفعاتی است که سیستم با فاصله زمانی کوتاه‌تر برای نظرسنجی NTP تلاش می‌کند (config_ntpPollingIntervalShorter)، قبل‌از اینکه از این کار دست بکشد و از فاصله زمانی نظرسنجی عادی (config_ntpPollingInterval) استفاده کند. مقدار کمتر از 0 به این معنی است که سیستم نظرسنجی را با فاصله زمانی کوتاه‌تر برای نظرسنجی NTP تکرار می‌کند تا زمانی که بتواند با موفقیت بازآوری کند.
config_ntpPollingInterval ‫64800000 (۱۸ ساعت) فاصله زمانی نظرسنجی زمان شبکه عادی برحسب میلی‌ثانیه.
config_ntpPollingIntervalShorter ‫60000 (۱ دقیقه) فاصله زمانی نظرسنجی شبکه برای تلاش مجدد برحسب میلی‌ثانیه. وقتی بازآوری زمان ناموفق باشد استفاده می‌شود.
config_ntpServers یک ورودی تکی: ntp://time.android.com سرورهای NTP برای استفاده در دریافت زمان دقیق. موارد باید در قالب زیر باشد: ntp://<host>[:port].
این طرح‌واره URI ثبت‌شده IANA نیست.
config_ntpTimeout ۵۰۰۰ زمان انتظار برای پاسخ سرور NTP برحسب میلی‌ثانیه قبل‌از اتمام زمان.

سرورها

به‌طور پیش‌فرض، AOSP از سرورهای زمان در time.android.com استفاده می‌کند که نام مستعار Google Public NTP است. این سرویس «قرارداد سطح خدمات» ندارد. برای اطلاعات بیشتر، پرسشگان «سرور زمان شبکه عمومی Google» را ببینید.

پشتیبانی از چند سرور

برای Android 14 و بالاتر، چارچوب از چندین سرور NTP پشتیبانی می‌کند. این از شرایطی پشتیبانی می‌کند که دستگاه‌ها با یک پیکربندی واحد در سراسر جهان توزیع می‌شوند، اما دسترسی به سرورهایی مانند time.android.com در برخی مکان‌ها محدود است.

الگوریتم هر سرور مشخص‌شده در config_ntpServers کلید پیکربندی را امتحان می‌کند. وقتی الگوریتم سروری را پیدا می‌کند که پاسخ می‌دهد، سیستم به استفاده از آن سرور ادامه می‌دهد تا زمانی که سرور نتواند بازآوری کند یا دستگاه بازراه‌اندازی شود.

درستی

همگام‌سازی زمان شبکه پیش‌فرض Android از SNTP با یک پُرسمان زمان استفاده می‌کند تقریباً یک‌بار در روز تا همیشه سیگنال زمان جدیدی داشته باشد.

تأثیرات تأخیر شبکه عامل مهمی در عدم دقت زمان در پیاده‌سازی SNTP در Android است. SNTP تأخیرهای شبکه متقارن را فرض می‌کند، یعنی تأخیر شبکه برای درخواست با تأخیر شبکه برای پاسخ یکسان است و زمان صحیح دقیقاً در وسط آن رفت‌وبرگشت شبکه قرار دارد. اغلب، زمان رفت‌وبرگشت شبکه در حد چند صد میلی‌ثانیه است و در شبکه سیمی، تأخیر تقریباً متقارن است که منجر به سطوحی از عدم دقت می‌شود که برای کاربران تقریباً غیرقابل تشخیص است. بااین‌حال، در تلفن همراه یا تلفن رادیویی، چندین مرحله وجود دارد که در آن‌ها تأخیرهای نسبتاً طولانی و نامتقارن می‌تواند در تراکنش شبکه وارد شود و منجر به عدم دقت بیشتر شود.

با تنظیم پیش‌فرض AOSP برای config_ntpTimeout روی 5000 میلی‌ثانیه، و اگر همه تأخیر شبکه صرفاً روی بخش ورودی یا خروجی متمرکز باشد، حداکثر خطای نظری تقریباً ۲٫۵ ثانیه است.

دقت کلی ساعت سیستم تحت‌تأثیر توانایی دستگاه Android برای ردیابی دقیق زمان سپری‌شده پس‌از دریافت سیگنال زمان نیز قرار دارد. این مشکل مربوط به همه زمان‌سنجی‌ها در Android است، نه فقط تشخیص زمان شبکه، به همین دلیل سرویس time_detector پیشنهادهای زمان قدیمی را نادیده می‌گیرد. سرویس network_time_update_service به‌طور منظم بااستفاده از فاصله config_ntpPollingInterval بازآوری می‌شود تا سرویس time_detector با پیشنهادهای زمانی جدید تأمین شود و اطمینان حاصل شود که سرویس time_detector به مبدأهای زمانی با اولویت پایین‌تر و اغلب با دقت کمتر یا گاهی اوقات نادرست مانند telephony برنگردد.

وقتی از تشخیص خودکار زمان استفاده می‌شود، دقت ساعت سیستم دستگاه می‌تواند تحت‌تأثیر پیکربندی‌های دیگر سرویس time_detector قرار گیرد، مانند ثابت‌ها و پرچم‌هایی که تعیین می‌کنند پیشنهاد زمان چقدر باید با زمان فعلی ساعت سیستم تفاوت داشته باشد تا ساعت تنظیم شود (ServiceConfigAccessorImpl.java).

تولیدکنندگان دستگاه می‌توانند بااستفاده از گزینه‌ها و ثابت‌های پیکربندی قبلی، دقت را اصلاح کنند. اما مهم است که از محدودیت‌های پیاده‌سازی SNTP پلاتفرم و تأثیر احتمالی آن بر مصرف برق به‌دلیل عملیات مکرر شبکه، تأثیر بر برنامه‌های درحال اجرا در دستگاه به‌دلیل تنظیمات مکرر اما کوچک‌تر ساعت، و تأثیر بر بار سرور آگاه باشید.

استفاده‌های دیگر از زمان شبکه

اگر تشخیص خودکار زمان بااستفاده از مبدأ network پیکربندی نشده باشد یا اگر کاربر تشخیص خودکار زمان را غیرفعال کرده باشد، زمان به‌دست‌آمده از سرویس network_time_update_service همچنان توسط اجزای زیر استفاده می‌شود:

  • روش SystemClock.currentNetworkTimeClock().
  • توابع پلاتفرم داخلی. برای مثال، A-GPS می‌تواند موقعیت GNSS (مکان) را وقتی اطلاعات زمان شبکه را دارد سریع‌تر پیدا کند.

عیب‌یابی و آزمایش

بخش زیر فرمان‌های پوسته را برای اشکال‌زدایی و آزمایش ویژگی تشخیص زمان شبکه شرح می‌دهد.

تعامل با سرویس network_time_update_service

برای تخلیه وضعیت فعلی network_time_update_service، از این دستور استفاده کنید:

adb shell cmd network_time_update_service dump

برای دیدن مجموعه‌ای از گزینه‌های خط فرمان که می‌توانند به آزمایش کمک کنند، از این دستور استفاده کنید:

adb shell cmd network_time_update_service help