नेटवर्क के समय का पता लगाना

Android डिवाइस, नेटवर्क सोर्स से अपने-आप सही यूएनआईएक्स टाइम पाने की कोशिश करते हैं. समय की जानकारी पाने के लिए, Android एसएनटीपी प्रोटोकॉल का इस्तेमाल करता है. यह प्रोटोकॉल, यूडीपी प्रोटोकॉल का इस्तेमाल करता है.

इस पेज पर बताए गए कॉम्पोनेंट, समय का पता अपने-आप लगाने वाले सिस्टम का हिस्सा हैं. इसे नेटवर्क टाइम ऑरिजिन कहा जाता है. नेटवर्क टाइम सर्वर से मिले टाइम सिग्नल का इस्तेमाल, Android डिवाइस की सिस्टम घड़ी को सेट करने के लिए किया जा सकता है. ऐसा तब किया जा सकता है, जब डिवाइस पर समय का अपने-आप पता चलने की सुविधा काम करती हो और time_detector सेवा को इसका इस्तेमाल करने के लिए कॉन्फ़िगर किया गया हो.

डिफ़ॉल्ट रूप से, Android नेटवर्क टाइम ऑरिजिन का इस्तेमाल, समय का अपने-आप पता लगाने वाले मुख्य ऑरिजिन के तौर पर करता है.

नेटवर्क टाइम डिटेक्शन सिस्टम

Android सिस्टम सर्वर में चलने वाली network_time_update_service सेवा, नेटवर्क टाइम डिटेक्शन सिस्टम को लागू करती है. यह सेवा, समय-समय पर किसी सर्वर से समय का सिग्नल पाने के लिए, एसएनटीपी का इस्तेमाल करती है. यह सेवा, इंटरनेट कनेक्शन की निगरानी भी करती है. साथ ही, जब लंबे समय तक इंटरनेट कनेक्शन खराब रहता है और समय का कोई नया सिग्नल उपलब्ध नहीं होता, तो समय को रीफ़्रेश करने की सुविधा चालू करती है.

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 का बुनियादी कॉन्फ़िगरेशन, frameworks/base/core/res/res/values/config.xml पर मौजूद है:

कॉन्फ़िगरेशन कुंजी AOSP वैल्यू ब्यौरा
config_ntpRetry 3 रीफ़्रेश न हो पाने के बाद, सिस्टम कम NTP पोलिंग इंटरवल (config_ntpPollingIntervalShorter) के साथ नेटवर्क टाइम पोलिंग की कोशिश करता है. इसके बाद, वह सामान्य पोलिंग इंटरवल (config_ntpPollingInterval) का इस्तेमाल करता है. 0 से कम वैल्यू का मतलब है कि सिस्टम कम NTP पोलिंग इंटरवल पर पोलिंग की कोशिश तब तक करता है, जब तक वह रीफ़्रेश नहीं हो जाता.
config_ntpPollingInterval 64800000 (18 घंटे) नेटवर्क टाइम को मिलीसेकंड में पोल करने का सामान्य इंटरवल.
config_ntpPollingIntervalShorter 60000 (एक मिनट) मिलीसेकंड में, नेटवर्क टाइम को फिर से पॉलिंग करने के लिए इंटरवल. इसका इस्तेमाल तब किया जाता है, जब समय रीफ़्रेश नहीं हो पाता.
config_ntpServers एक एंट्री: ntp://time.android.com सटीक समय पाने के लिए इस्तेमाल किए जाने वाले NTP सर्वर. आइटम इस फ़ॉर्मैट में होने चाहिए: ntp://<host>[:port].
यह रजिस्टर की गई IANA यूआरआई स्कीम नहीं है.
config_ntpTimeout 5000 टाइम आउट से पहले, NTP सर्वर के जवाब का इंतज़ार करने के लिए, मिलीसेकंड में तय किया गया समय.

सर्वर

डिफ़ॉल्ट रूप से, AOSP time.android.com पर टाइम सर्वर का इस्तेमाल करता है. यह Google Public NTP का दूसरा नाम है. इस सेवा के लिए कोई एसएलए नहीं है. ज़्यादा जानकारी के लिए, Google के सार्वजनिक एनटीपी के बारे में अक्सर पूछे जाने वाले सवाल देखें.

एक से ज़्यादा सर्वर के साथ काम करने की सुविधा

Android 14 और इसके बाद के वर्शन के लिए, फ़्रेमवर्क कई NTP सर्वर के साथ काम करता है. यह उन स्थितियों में काम करता है जहां डिवाइसों को दुनिया भर में एक ही कॉन्फ़िगरेशन के साथ डिस्ट्रिब्यूट किया जाता है, लेकिन time.android.com जैसे सर्वर का ऐक्सेस कुछ जगहों पर प्रतिबंधित होता है.

एल्गोरिदम, config_ntpServers कॉन्फ़िगरेशन कुंजी में बताए गए हर सर्वर को आज़माता है. जब उसे कोई सर्वर मिल जाता है, तो सिस्टम उस सर्वर का इस्तेमाल तब तक करता है, जब तक वह रीफ़्रेश नहीं हो जाता या डिवाइस रीबूट नहीं हो जाता.

 सटीक होना

Android का डिफ़ॉल्ट नेटवर्क टाइम सिंक, SNTP का इस्तेमाल करता है. यह दिन में करीब एक बार, टाइम क्वेरी के साथ सिंक होता है. इससे यह पक्का करने की कोशिश की जाती है कि डिवाइस पर हमेशा अप-टू-डेट टाइम सिग्नल हो.

Android के SNTP लागू करने के साथ, समय में गड़बड़ी होने की सबसे बड़ी वजह नेटवर्क के इंतज़ार का समय है. SNTP, नेटवर्क में होने वाली देरी को एक जैसा मानता है. इसका मतलब है कि अनुरोध के लिए नेटवर्क में होने वाली देरी, जवाब के लिए नेटवर्क में होने वाली देरी के बराबर होती है. साथ ही, सही समय, नेटवर्क के राउंड ट्रिप के बीच में होता है. अक्सर, नेटवर्क का राउंड ट्रिप समय कुछ सौ मिलीसेकंड के क्रम में होता है. साथ ही, वायर्ड नेटवर्क पर इंतज़ार का समय करीब-करीब एक जैसा होता है. इस वजह से, गड़बड़ी का स्तर इतना कम होता है कि उपयोगकर्ताओं को इसका पता नहीं चलता. हालांकि, मोबाइल या रेडियो टेलीफ़ोनी में कई ऐसे चरण होते हैं जहां नेटवर्क लेन-देन में अपेक्षाकृत लंबी और असमान देरी हो सकती है. इससे ज़्यादा गड़बड़ी हो सकती है.

अगर config_ntpTimeout के लिए AOSP की डिफ़ॉल्ट सेटिंग को 5000 मिलीसेकंड पर सेट किया गया है और नेटवर्क में लगने वाला सारा समय सिर्फ़ इनबाउंड या आउटबाउंड लेग पर है, तो सैद्धांतिक तौर पर गड़बड़ी की ज़्यादा से ज़्यादा अवधि करीब 2.5 सेकंड होगी.

सिस्टम की घड़ी के सटीक होने पर, 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, जीएनएसएस (जगह की जानकारी) के पहले फ़िक्स को तेज़ी से ढूंढ सकता है. ऐसा तब होता है, जब उसके पास नेटवर्क के समय की जानकारी होती है.

डीबग करना और जांच करना

नीचे दिए गए सेक्शन में, नेटवर्क के समय का पता लगाने की सुविधा को डीबग करने और उसकी जांच करने के लिए, शेल कमांड के बारे में बताया गया है.

network_time_update_service सेवा के साथ इंटरैक्ट करना

network_time_update_service की मौजूदा स्थिति को डंप करने के लिए, इनका इस्तेमाल करें:

adb shell cmd network_time_update_service dump

टेस्टिंग में मदद करने वाले कमांड लाइन विकल्पों का सेट देखने के लिए, इनका इस्तेमाल करें:

adb shell cmd network_time_update_service help