নেটওয়ার্ক সময় সনাক্তকরণ

অ্যান্ড্রয়েড ডিভাইসগুলো স্বয়ংক্রিয়ভাবে নেটওয়ার্ক উৎস থেকে সঠিক ইউনিক্স ইপক টাইম সংগ্রহ করার চেষ্টা করে। অ্যান্ড্রয়েড সময়ের তথ্য সংগ্রহের জন্য সিম্পল নেটওয়ার্ক টাইম প্রোটোকল (SNTP) ব্যবহার করে, যা আবার ইউজার ডেটাগ্রাম প্রোটোকল (UDP) ব্যবহার করে।

এই পৃষ্ঠায় বর্ণিত উপাদানগুলি নেটওয়ার্ক টাইম অরিজিন নামে পরিচিত স্বয়ংক্রিয় সময় সনাক্তকরণ সিস্টেমের অংশ। যখন ডিভাইসে স্বয়ংক্রিয় সময় সনাক্তকরণ সমর্থিত থাকে এবং time_detector পরিষেবাটি এটি ব্যবহার করার জন্য কনফিগার করা থাকে, তখন একটি নেটওয়ার্ক টাইম সার্ভার থেকে আসা টাইম সিগন্যাল ব্যবহার করে অ্যান্ড্রয়েড ডিভাইসের সিস্টেম ক্লক সেট করা যায়।

ডিফল্টরূপে, অ্যান্ড্রয়েড নেটওয়ার্ক টাইম অরিজিনকে প্রাথমিক স্বয়ংক্রিয় সময় সনাক্তকরণ অরিজিন হিসেবে ব্যবহার করে।

নেটওয়ার্ক সময় সনাক্তকরণ সিস্টেম

অ্যান্ড্রয়েড সিস্টেম সার্ভারে চলমান network_time_update_service সার্ভিসটি নেটওয়ার্ক সময় শনাক্তকরণ সিস্টেমটি বাস্তবায়ন করে। সার্ভিসটি পর্যায়ক্রমে SNTP ব্যবহার করে একটি সার্ভার থেকে সময়ের সংকেত সংগ্রহ করে। সার্ভিসটি নেটওয়ার্ক সংযোগও পর্যবেক্ষণ করে এবং দীর্ঘ সময় ধরে সংযোগ দুর্বল থাকার পর কোনো সাম্প্রতিক সময়ের সংকেত পাওয়া না গেলে সময় রিফ্রেশ করার জন্য সংকেত পাঠায়।

` network_time_update_service সার্ভিসটি বুট হওয়ার পরে এবং নেটওয়ার্ক সংযোগ প্রথমবার স্থাপিত হওয়ার সময় একটি টাইম সিগন্যাল পাওয়ার চেষ্টা করে। এরপর সার্ভিসটি তার কাছে থাকা সর্বশেষ সিগন্যালটিকে সতেজ রাখার চেষ্টা করে। এটি প্রতিটি অ্যান্ড্রয়েড ডিভাইসের স্বতন্ত্র চাহিদার সাথে বিশ্বজুড়ে বহু অ্যান্ড্রয়েড ডিভাইসের সময় রিফ্রেশ করার ফলে সৃষ্ট বিপুল চাপের মধ্যে ভারসাম্য রক্ষা করে।

` network_time_update_service সার্ভিসটি অভ্যন্তরীণ এপিআই ব্যবহার করে time_detector সার্ভিসের কাছে নেটওয়ার্ক সময়ের পরামর্শ জমা দেয়। এরপর অ্যান্ড্রয়েড প্ল্যাটফর্মের অন্যান্য কম্পোনেন্টগুলো এই নেটওয়ার্ক সময়ের পরামর্শগুলো ব্যবহার করে।

নেটওয়ার্ক টাইম অরিজিন থেকে পরামর্শ পাওয়ার পর, time_detector সার্ভিসটি কনফিগার করা অগ্রাধিকার নিয়ম অনুসারে সিস্টেম ক্লক আপডেট করা হবে কিনা তা নির্ধারণ করে।

সিস্টেম ক্লক স্বয়ংক্রিয়ভাবে সেট করার জন্য নেটওয়ার্ক অরিজিন সাজেশন ব্যবহার করতে অটোমেটিক টাইম ডিটেকশন সিস্টেম কনফিগার করতে, core/res/res/values/config.xml সিস্টেম সার্ভার কনফিগারেশন ফাইলটি ব্যবহার করুন। নিশ্চিত করুন যে ` network ভ্যালুটি config_autoTimeSourcesPriority এর মধ্যে কাঙ্ক্ষিত অবস্থানে রয়েছে। আরও তথ্যের জন্য, `Time source priority` দেখুন।

ডিভাইস কনফিগারেশন

এই অংশে বর্ণনা করা হয়েছে কীভাবে ডিভাইস নির্মাতারা নেটওয়ার্ক সময় শনাক্তকরণ সিস্টেমটি কনফিগার করতে পারেন।

AOSP-এর মূল কনফিগারেশনটি config.xml ফাইলে রয়েছে: frameworks/base/core/res/res/values/config.xml :

কনফিগারেশন কী AOSP মান বর্ণনা
config_ntpRetry 3 রিফ্রেশ করতে ব্যর্থ হওয়ার পর, সিস্টেমটি স্বাভাবিক পোলিং ইন্টারভাল ( config_ntpPollingIntervalShorter ) ব্যবহার করার আগে, একটি সংক্ষিপ্ত NTP পোলিং ইন্টারভাল ( config_ntpPollingInterval ) ব্যবহার করে নেটওয়ার্ক টাইম পোলিং করার জন্য এই সংখ্যক বার চেষ্টা করে। 0 এর কম মানের অর্থ হলো, সিস্টেমটি সফলভাবে রিফ্রেশ করতে সক্ষম না হওয়া পর্যন্ত সংক্ষিপ্ত NTP পোলিং ইন্টারভালে পুনরায় চেষ্টা করতে থাকে।
config_ntpPollingInterval 64800000 (১৮ ঘন্টা) মিলিসেকেন্ডে স্বাভাবিক নেটওয়ার্ক টাইম পোলিং ব্যবধান।
config_ntpPollingIntervalShorter 60000 (১ মিনিট) পুনরায় চেষ্টা করার নেটওয়ার্ক টাইম পোলিং ব্যবধান (মিলিসেকেন্ডে)। যখন কোনো টাইম রিফ্রেশ ব্যর্থ হয় তখন এটি ব্যবহৃত হয়।
config_ntpServers একটিমাত্র এন্ট্রি: ntp://time.android.com সঠিক সময় পাওয়ার জন্য ব্যবহৃত NTP সার্ভারসমূহ। আইটেমগুলো অবশ্যই ntp://<host>[:port] ফর্ম্যাটে থাকতে হবে।
এটি কোনো নিবন্ধিত IANA URI স্কিম নয়।
config_ntpTimeout ৫০০০ টাইমআউট হওয়ার আগে এনটিপি সার্ভারের প্রতিক্রিয়ার জন্য মিলিসেকেন্ডে অপেক্ষা করার সময়।

সার্ভার

ডিফল্টরূপে, AOSP time.android.com এ অবস্থিত টাইম সার্ভার ব্যবহার করে, যা Google Public NTP- এর একটি উপনাম। এই পরিষেবার কোনো SLA নেই। আরও তথ্যের জন্য, Google Public NTP FAQ দেখুন।

একাধিক সার্ভার সমর্থন

অ্যান্ড্রয়েড ১৪ এবং এর পরবর্তী সংস্করণগুলোর জন্য, ফ্রেমওয়ার্কটি একাধিক এনটিপি সার্ভার সমর্থন করে। এটি এমন পরিস্থিতিগুলোতে সহায়তা করে যেখানে ডিভাইসগুলো একটিমাত্র কনফিগারেশনসহ বিশ্বব্যাপী ছড়িয়ে থাকে, কিন্তু time.android.com এর মতো সার্ভারগুলোতে প্রবেশাধিকার নির্দিষ্ট কিছু জায়গায় সীমাবদ্ধ থাকে।

অ্যালগরিদমটি config_ntpServers কনফিগারেশন কী-তে উল্লেখিত প্রতিটি সার্ভারে চেষ্টা করে। যখন অ্যালগরিদমটি সাড়া দেয় এমন একটি সার্ভার খুঁজে পায়, তখন সিস্টেমটি সেই সার্ভারটি ব্যবহার করতে থাকে যতক্ষণ না সেটি রিফ্রেশ হতে ব্যর্থ হয় বা ডিভাইসটি রিবুট হয়।

নির্ভুলতা

অ্যান্ড্রয়েডের ডিফল্ট নেটওয়ার্ক টাইম সিঙ্ক দিনে প্রায় একবার SNTP ব্যবহার করে সময়ের তথ্য খোঁজে, যাতে এতে সর্বদা একটি সাম্প্রতিক সময়ের সংকেত থাকে।

অ্যান্ড্রয়েডের SNTP বাস্তবায়নে সময়ের নির্ভুলতার অভাবের একটি উল্লেখযোগ্য কারণ হলো নেটওয়ার্ক লেটেন্সির প্রভাব। SNTP প্রতিসম নেটওয়ার্ক বিলম্ব ধরে নেয়, অর্থাৎ, অনুরোধের জন্য নেটওয়ার্ক লেটেন্সি এবং প্রতিক্রিয়ার জন্য নেটওয়ার্ক লেটেন্সি একই থাকে এবং সঠিক সময়টি সেই নেটওয়ার্ক রাউন্ড ট্রিপের ঠিক মাঝখানে থাকে। প্রায়শই, নেটওয়ার্ক রাউন্ড ট্রিপের সময় কয়েকশ মিলিসেকেন্ডের মতো হয় এবং তারযুক্ত নেটওয়ার্কে লেটেন্সি প্রায় প্রতিসম থাকে, যার ফলে এমন মাত্রার নির্ভুলতাহীনতা তৈরি হয় যা ব্যবহারকারীদের কাছে প্রায় অলক্ষ্যনীয়। তবে, মোবাইল বা রেডিও টেলিফোনির ক্ষেত্রে এমন বেশ কয়েকটি পর্যায় থাকে যেখানে একটি নেটওয়ার্ক লেনদেনের মধ্যে তুলনামূলকভাবে দীর্ঘ, অপ্রতিসম বিলম্ব যুক্ত হতে পারে, যা আরও বেশি নির্ভুলতাহীনতার কারণ হয়।

AOSP-এর ডিফল্ট সেটিং অনুযায়ী config_ntpTimeout মান 5000 মিলিসেকেন্ড হলে এবং সমস্ত নেটওয়ার্ক ল্যাটেন্সি শুধুমাত্র ইনবাউন্ড বা আউটবাউন্ড লেগে কেন্দ্রীভূত থাকলে, সর্বোচ্চ তাত্ত্বিক ত্রুটির পরিমাণ প্রায় ২.৫ সেকেন্ড।

একটি টাইম সিগন্যাল পাওয়ার পর অ্যান্ড্রয়েড ডিভাইসটি অতিবাহিত সময় সঠিকভাবে ট্র্যাক করতে পারে কিনা, তার উপরও সামগ্রিক সিস্টেম ক্লকের নির্ভুলতা নির্ভর করে। এটি শুধু নেটওয়ার্ক টাইম ডিটেকশনের ক্ষেত্রেই নয়, অ্যান্ড্রয়েডের সমস্ত সময় গণনার ক্ষেত্রেই একটি উদ্বেগের বিষয়, আর একারণেই 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() মেথড।
  • প্ল্যাটফর্মের অভ্যন্তরীণ কার্যাবলী। উদাহরণস্বরূপ, নেটওয়ার্ক সময়ের তথ্য থাকলে এ-জিপিএস একটি জিএনএসএস (অবস্থান)-এর প্রথম সংকেত আরও দ্রুত শনাক্ত করতে পারে।

ডিবাগিং এবং টেস্টিং

নিম্নলিখিত অংশে নেটওয়ার্ক সময় সনাক্তকরণ বৈশিষ্ট্যটি ডিবাগ এবং পরীক্ষা করার জন্য শেল কমান্ডগুলি বর্ণনা করা হয়েছে।

network_time_update_service পরিষেবাটির সাথে ইন্টারঅ্যাক্ট করুন

network_time_update_service এর বর্তমান অবস্থা ডাম্প করতে, ব্যবহার করুন:

adb shell cmd network_time_update_service dump

টেস্টিং-এ সহায়ক কিছু কমান্ড লাইন অপশন দেখতে, ব্যবহার করুন:

adb shell cmd network_time_update_service help