NTP (Network Time Protocol) คือโปรโตคอลการซิงโครไนซ์เวลาเครือข่ายที่ให้ความแม่นยำระดับมิลลิวินาทีในเครือข่ายท้องถิ่นและระดับสิบมิลลิวินาทีในเครือข่ายทั่วโลก พัฒนาโดย David Mills ในปี 1985 โปรโตคอลนี้ถูกใช้ในระบบปฏิบัติการสมัยใหม่ทั้งหมด อุปกรณ์เคลื่อนที่ และอุปกรณ์เครือข่ายเพื่อซิงโครไนซ์นาฬิกาภายในกับเวลา UTC อ้างอิง ตามโครงการ NTP Pool Project (2026) มีอุปกรณ์มากกว่า 4 พันล้านเครื่องทำการร้องขอ NTP ทุกวันเพื่อการซิงโครไนซ์
ประเด็นสำคัญ
NTP (Network Time Protocol) คือโปรโตคอลเครือข่ายที่ออกแบบมาเพื่อซิงโครไนซ์นาฬิกาภายในของคอมพิวเตอร์กับแหล่งเวลาอ้างอิงผ่านเครือข่ายแบบสวิตช์แพ็กเก็ตอย่างแม่นยำ อธิบายไว้ใน RFC 5905 (NTPv4) โปรโตคอลใช้ระบบลำดับชั้นของเซิร์ฟเวอร์ โดยแต่ละระดับเรียกว่าสตราตัม ไคลเอนต์ NTP ส่งคำขอไปยังเซิร์ฟเวอร์ วัดเวลาเดินทางไป-กลับของแพ็กเก็ต (RTT) และคำนวณค่าชดเชยของนาฬิกาของตนเองเทียบกับเวลาอ้างอิง อัลกอริทึมการแก้ไขไม่เพียงพิจารณาค่าชดเชยครั้งเดียว แต่ยังพิจารณาการดริฟต์ของตัวกำเนิดนาฬิกา ทำให้สามารถรักษาความแม่นยำเป็นเวลานานโดยไม่ต้องร้องขอซ้ำ
โปรโตคอลนี้พัฒนาโดย David Mills ในปี 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 โดยใช้การประทับเวลาทั้งสี่ค่า ไคลเอนต์คำนวณค่าชดเชย = ((T2 - T1) + (T3 - T4)) / 2 และความล่าช้า = (T4 - T1) - (T3 - T2) หากความล่าช้าเกิน 1 วินาที ผลลัพธ์จะถือว่าไม่น่าเชื่อถือ — ซึ่งป้องกันช่องสัญญาณที่โอเวอร์โหลดหรือไม่เสถียร
การตั้งเวลาที่แม่นยำเพียงอย่างเดียวไม่เพียงพอ — ออสซิลเลเตอร์ควอทซ์บนอุปกรณ์ดริฟต์อย่างต่อเนื่อง (เดินเร็วหรือช้า) เนื่องจากอุณหภูมิ การเสื่อมสภาพ และแรงดันไฟฟ้า NTP แก้ปัญหานี้ด้วยอัลกอริทึม PLL (Phase-Locked Loop): มันไม่ได้ตั้งเวลาแบบบังคับ แต่ปรับความเร็วนาฬิกา หากอุปกรณ์เดินเร็ว 0.1 วินาทีต่อชั่วโมง NTP จะทำให้นาฬิการะบบช้าลงจนกว่าการดริฟต์จะได้รับการชดเชย วิธีการนี้ช่วยให้ซิงโครไนซ์ทุกสองสามชั่วโมงบนเครือข่ายที่เสถียร แทนที่จะทุก 30 วินาที
// Simplified NTP algorithm schema
struct NTPPacket {
uint8_t flags; // LI, VN, Mode
uint8_t stratum; // server stratum level
uint32_t refTimestamp; // reference timestamp
uint32_t originTimestamp; // T1
uint32_t recvTimestamp; // T2
uint32_t xmitTimestamp; // T3
};
// Calculate offset and delay
double offset = ((t2 - t1) + (t3 - t4)) / 2.0;
double delay = (t4 - t1) - (t3 - t2);
ทั้งระบบ NTP ถูกจัดระเบียบเป็นลำดับชั้น โดยแต่ละระดับเรียกว่าสตราตัม สตราตัม 0 คือนาฬิกาอ้างอิง: นาฬิกาอะตอม เครื่องรับ GPS หรือสัญญาณวิทยุ WWVB อุปกรณ์เหล่านี้ไม่ได้เชื่อมต่อกับเครือข่ายโดยตรง สตราตัม 1 — เซิร์ฟเวอร์ที่เชื่อมต่อโดยตรงกับนาฬิกาอ้างอิง สตราตัม 2 รับเวลาจากสตราตัม 1 สตราตัม 3 จากสตราตัม 2 และต่อไปจนถึงสตราตัม 15 ยิ่งหมายเลขสตราตัมสูง ความแม่นยำก็ยิ่งลดลง — แต่ละระดับเพิ่มความล่าช้าและข้อผิดพลาดเล็กน้อย สตราตัม 16 หมายถึงเวลาไม่พร้อมใช้งาน (ไม่ได้ซิงโครไนซ์)
| สตราตัม | คำอธิบาย | ความแม่นยำ |
|---|---|---|
| Stratum 0 | นาฬิกาอะตอม, GPS, สัญญาณวิทยุ | นาโนวินาที |
| Stratum 1 | เซิร์ฟเวอร์ที่เชื่อมต่อกับอ้างอิง | ไมโครวินาที |
| Stratum 2 | เซิร์ฟเวอร์ NTP สาธารณะ | 1–10 ms |
| Stratum 3 | เซิร์ฟเวอร์ท้องถิ่นขององค์กร | 10–50 ms |
| Stratum 4+ | อุปกรณ์ไคลเอนต์ | สูงสุด 100 ms |
สำหรับอุปกรณ์เคลื่อนที่ เซิร์ฟเวอร์ สตราตัม 2 เหมาะสมที่สุด — มีจำนวนเพียงพอและให้สมดุลที่ดีระหว่างความแม่นยำและการพร้อมใช้งาน ตัวอย่างเช่น pool.ntp.org คือกลุ่มเซิร์ฟเวอร์หลายพันเครื่องทั่วโลกที่กระจายโหลดโดยอัตโนมัติ สำหรับแอปพลิเคชัน Android ไม่แนะนำให้ใช้สตราตัม 1 โดยตรง: ประการแรก สร้างโหลดที่มากเกินไปบนเซิร์ฟเวอร์หลัก และประการที่สอง อุปกรณ์เคลื่อนที่ต้องการความแม่นยำเพียง 10–50 ms ซึ่งสตราตัม 2 มีให้ ในเครือข่ายองค์กร จะตั้งค่าเซิร์ฟเวอร์ท้องถิ่นสตราตัม 3-4 ที่ซิงโครไนซ์กับสตราตัม 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 ที่ส่งคืนการประทับเวลาเซิร์ฟเวอร์ในเนื้อหาการตอบสนอง
การใช้งาน SNTP พื้นฐานบน Android ประกอบด้วยการส่งแพ็กเก็ต UDP ไปยังเซิร์ฟเวอร์ NTP (เช่น pool.ntp.org) การแยกวิเคราะห์การตอบสนอง และการดึงการประทับเวลาส่ง (T3) โค้ดต้องจัดการกับไทม์เอาต์เครือข่ายและข้อผิดพลาดในการแยกวิเคราะห์ — ในแอปพลิเคชันจริง การดำเนินการนี้จะทำบนเธรดพื้นหลัง และผลลัพธ์จะถูกแคชจนกว่าจะซิงโครไนซ์ครั้งถัดไป ไลบรารี Apache Commons Net มีคลาส NTPUDPClient พร้อมใช้ที่สามารถใช้งานใน Android ได้ด้วยการแก้ไขน้อยที่สุด โดยเพิ่มการพึ่งพาใน build.gradle
// Get NTP time via 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 ใช้ระดับ — สตราตา: สตราตัม 0 (นาฬิกาอะตอมและ GPS) สตราตัม 1 (เซิร์ฟเวอร์ที่เชื่อมต่อกับอ้างอิง) สตราตัม 2 (เซิร์ฟเวอร์ NTP สาธารณะ) สตราตัม 3–4 (เซิร์ฟเวอร์ท้องถิ่น) สตราตัม 5–15 (ไคลเอนต์) ยิ่งสตราตัมสูง ข้อผิดพลาดที่อาจเกิดขึ้นก็ยิ่งมากขึ้น สตราตัม 16 หมายถึงเวลาไม่ได้ซิงโครไนซ์
SNTP เป็นเวอร์ชันที่เรียบง่ายของ NTP สำหรับอุปกรณ์ที่มีทรัพยากรจำกัด ไม่กรองเซิร์ฟเวอร์ ไม่วิเคราะห์การดริฟต์ของนาฬิกา และไม่ใช้ PLL SNTP เหมาะสำหรับแอปพลิเคชันเคลื่อนที่ซึ่งความแม่นยำ 10–100 ms เพียงพอ NTP เต็มรูปแบบจำเป็นสำหรับเซิร์ฟเวอร์ อุปกรณ์โทรคมนาคม และระบบฟินเทค
ใช้ไลบรารี Apache Commons Net กับคลาส NTPUDPClient ส่งคำขอไปที่ pool.ntp.org รับการตอบสนองและดึงการประทับเวลาส่ง หรือใช้ REST API ของเซิร์ฟเวอร์ของคุณ ซึ่งส่งคืนเวลาเซิร์ฟเวอร์ในส่วนหัว Date หรือในเนื้อหาการตอบสนองในรูปแบบ Unix Timestamp
หากไม่มีการซิงโครไนซ์ NTP เวลาในระบบบนอุปกรณ์อาจแตกต่างกันเป็นนาทีหรือชั่วโมง สิ่งนี้รบกวนการแจ้งเตือนแบบพุช การตรวจสอบใบรับรอง SSL บันทึก ตัวกำหนดเวลางาน และโปรโตคอลการเข้ารหัส ในแอปพลิเคชันทางการเงิน ความแตกต่างมากกว่า 5 วินาทีถือเป็นภัยคุกคามความปลอดภัย
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม