NTP (Network Time Protocol) là giao thức đồng bộ hóa thời gian mạng, cung cấp độ chính xác đến mili giây trên mạng cục bộ và hàng chục mili giây trên mạng toàn cầu. Được phát triển bởi David Mills vào năm 1985, giao thức này được sử dụng trong tất cả các hệ điều hành hiện đại, thiết bị di động và thiết bị mạng để đồng bộ hóa đồng hồ nội bộ với thời gian tham chiếu UTC. Theo NTP Pool Project (2026), hơn 4 tỷ thiết bị thực hiện yêu cầu NTP hàng ngày để đồng bộ hóa.
Những điểm chính
NTP (Network Time Protocol) là một giao thức mạng được thiết kế để đồng bộ hóa chính xác đồng hồ nội bộ của máy tính với nguồn thời gian tham chiếu qua mạng chuyển mạch gói. Được mô tả trong RFC 5905 (NTPv4), giao thức sử dụng hệ thống máy chủ phân cấp, trong đó mỗi cấp được gọi là stratum. Máy khách NTP gửi yêu cầu đến máy chủ, đo thời gian khứ hồi của gói (RTT) và tính toán độ lệch của đồng hồ riêng so với thời gian tham chiếu. Thuật toán hiệu chỉnh không chỉ tính đến độ lệch đơn lẻ mà còn tính đến độ trôi của bộ tạo đồng hồ, cho phép duy trì độ chính xác trong thời gian dài mà không cần yêu cầu lặp lại.
Giao thức được phát triển bởi David Mills vào năm 1985 cho mạng ARPANET. Đặc tả đầu tiên (RFC 958) mô tả một thuật toán đồng bộ hóa đơn giản với độ chính xác lên đến 100 ms. NTPv3 (RFC 1305, 1992) đã thêm thuật toán lọc và xử lý độ trễ được cải thiện. NTPv4 (RFC 5905, 2010) — phiên bản hiện tại — bao gồm hỗ trợ IPv6, cấu hình máy chủ tự động và bảo vệ chống lại các cuộc tấn công qua Network Time Security (NTS). Trong 40 năm, giao thức đã phát triển từ một dự án nghiên cứu thành một tiêu chuẩn cơ sở hạ tầng mà nếu không có nó thì các giao dịch tài chính, viễn thông và mạng di động sẽ không thể thực hiện được.
Nguyên lý hoạt động của NTP dựa trên việc đo thời gian di chuyển của gói tin trên mạng. Máy khách gửi yêu cầu với dấu thời gian T1 (thời gian gửi cục bộ). Máy chủ nhận yêu cầu tại thời điểm T2 (thời gian máy chủ), tạo phản hồi với dấu thời gian T3 và gửi đi. Máy khách nhận phản hồi tại thời điểm T4. Sử dụng cả bốn dấu thời gian, máy khách tính toán độ lệch = ((T2 - T1) + (T3 - T4)) / 2 và độ trễ = (T4 - T1) - (T3 - T2). Nếu độ trễ vượt quá 1 giây, kết quả được coi là không đáng tin cậy — điều này bảo vệ khỏi các kênh bị quá tải hoặc không ổn định.
Chỉ đặt thời gian chính xác là không đủ — bộ dao động thạch anh trên thiết bị liên tục trôi (nhanh hoặc chậm) do nhiệt độ, lão hóa và điện áp. NTP giải quyết vấn đề này bằng thuật toán PLL (Phase-Locked Loop): nó không đặt thời gian một cách cưỡng bức mà điều chỉnh tốc độ đồng hồ. Nếu thiết bị nhanh hơn 0,1 giây mỗi giờ, NTP sẽ làm chậm đồng hồ hệ thống cho đến khi độ trôi được bù đắp. Cách tiếp cận này cho phép đồng bộ hóa vài giờ một lần trên các mạng ổn định, thay vì mỗi 30 giây.
// 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);
Toàn bộ hệ thống NTP được tổ chức theo hệ thống phân cấp, trong đó mỗi cấp được gọi là stratum. Stratum 0 là đồng hồ tham chiếu: đồng hồ nguyên tử, bộ thu GPS hoặc tín hiệu vô tuyến WWVB. Các thiết bị này không được kết nối trực tiếp với mạng. Stratum 1 — máy chủ được kết nối trực tiếp với đồng hồ tham chiếu. Stratum 2 nhận thời gian từ stratum 1, stratum 3 từ stratum 2, và cứ tiếp tục như vậy đến stratum 15. Số stratum càng cao, độ chính xác càng thấp — mỗi cấp thêm một độ trễ và sai số nhỏ. Stratum 16 có nghĩa là thời gian không khả dụng (không được đồng bộ hóa).
| Stratum | Mô tả | Độ chính xác |
|---|---|---|
| Stratum 0 | Đồng hồ nguyên tử, GPS, tín hiệu vô tuyến | Nano giây |
| Stratum 1 | Máy chủ kết nối với tham chiếu | Micro giây |
| Stratum 2 | Máy chủ NTP công cộng | 1–10 ms |
| Stratum 3 | Máy chủ cục bộ của tổ chức | 10–50 ms |
| Stratum 4+ | Thiết bị khách | lên đến 100 ms |
Đối với thiết bị di động, máy chủ stratum 2 là tối ưu — có đủ số lượng và chúng cung cấp sự cân bằng tốt giữa độ chính xác và khả năng sẵn sàng. Ví dụ, pool.ntp.org là một nhóm hàng nghìn máy chủ trên toàn thế giới tự động phân phối tải. Đối với ứng dụng Android, không nên sử dụng trực tiếp stratum 1: thứ nhất, nó tạo ra tải quá mức lên máy chủ chính, và thứ hai, thiết bị di động chỉ cần độ chính xác 10–50 ms mà stratum 2 cung cấp. Trong mạng doanh nghiệp, một máy chủ cục bộ stratum 3-4 được thiết lập để đồng bộ hóa với stratum 2 bên ngoài.
SNTP (Simple Network Time Protocol, RFC 4330) là một triển khai đơn giản hóa của NTP cho các thiết bị có tài nguyên hạn chế: vi điều khiển, cảm biến IoT và ứng dụng di động không yêu cầu độ chính xác cao. Không giống như NTP đầy đủ, SNTP không thực hiện lọc nhiều máy chủ, không phân tích độ trôi đồng hồ và không sử dụng thuật toán PLL phức tạp. Máy khách SNTP gửi yêu cầu, nhận phản hồi và đặt thời gian một lần. Độ chính xác của SNTP là 10–100 ms tùy thuộc vào mạng — đủ cho đại đa số các kịch bản di động, ngoại trừ giao dịch tài chính.
SNTP phù hợp với các ứng dụng Android chỉ cần lấy thời gian hiện tại từ máy chủ mà không duy trì đồng bộ hóa liên tục. Ví dụ, ứng dụng hiển thị thời gian máy chủ khi đăng nhập hoặc đồng bộ hóa mỗi ngày một lần. NTP đầy đủ được yêu cầu cho hệ thống máy chủ, thiết bị viễn thông, nền tảng tài chính và cơ sở dữ liệu phân tán nơi độ chính xác liên tục và giám sát độ trôi là rất quan trọng. Đối với phát triển di động, SNTP là đủ — dịch vụ thời gian tích hợp của Android sử dụng nó để đồng bộ hóa định kỳ với máy chủ Google.
Trong ứng dụng Android, việc lấy thời gian chính xác qua NTP là cần thiết khi thời gian hệ thống có thể bị thay đổi bởi người dùng hoặc khác với thời gian thực do thiếu mạng. Android không có máy khách NTP công cộng tích hợp — nhà phát triển sử dụng thư viện Apache Commons Net SntpClient hoặc giải pháp của bên thứ ba. Năm 2022, Google đã thêm một lớp SntpClient nội bộ vào API Android (qua Google Play Services), nhưng nó yêu cầu cấu hình và không được ghi chép cho sử dụng chung. Một cách tiếp cận khác là yêu cầu thời gian qua API REST trả về dấu thời gian máy chủ trong nội dung phản hồi.
Triển khai SNTP cơ bản trên Android bao gồm gửi gói UDP đến máy chủ NTP (ví dụ: pool.ntp.org), phân tích phản hồi và trích xuất dấu thời gian truyền (T3). Mã phải xử lý thời gian chờ mạng và lỗi phân tích — trong ứng dụng thực tế, thao tác này được thực hiện trên luồng nền và kết quả được lưu vào bộ nhớ đệm cho đến lần đồng bộ hóa tiếp theo. Thư viện Apache Commons Net cung cấp lớp NTPUDPClient có sẵn có thể được sử dụng trong Android với các sửa đổi tối thiểu bằng cách thêm phụ thuộc vào 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
}
}
Độ chính xác của NTP phụ thuộc vào một số yếu tố: độ trễ mạng (RTT), độ ổn định kênh, tải máy chủ và chất lượng của bộ tạo đồng hồ cục bộ. Trên mạng cục bộ với độ trễ dưới 1 ms, NTP đạt độ chính xác 0,1–1 ms. Qua internet với độ trễ 10–50 ms, độ chính xác giảm xuống 10–50 ms. Quan trọng hơn độ chính xác đơn lẻ là độ ổn định: nếu độ trễ thay đổi (jitter), NTP cần nhiều thời gian hơn để tính toán độ lệch đáng tin cậy. Đối với thiết bị di động, yếu tố bất ổn định chính là chuyển đổi giữa Wi-Fi và mạng di động, nơi độ trễ có thể thay đổi theo cấp số nhân.
Đối với ứng dụng Android nhạy cảm với thời gian chính xác, khuyến nghị: sử dụng nhiều máy chủ NTP và chọn máy chủ có độ trễ thấp nhất; tránh đồng bộ hóa trong khi chuyển đổi mạng; lưu vào bộ nhớ đệm thời gian nhận được cuối cùng và điều chỉnh nó qua System.currentTimeMillis. Đối với trò chơi và ứng dụng thời gian thực (NTP không phù hợp ở đây do độ trễ mạng) — sử dụng thời gian máy chủ được truyền trong mỗi yêu cầu. Trong ứng dụng tài chính, luôn kiểm tra sự khác biệt với máy chủ — nếu chênh lệch vượt quá 5 giây, hãy chặn thao tác vì có khả năng không an toàn.
Câu hỏi thường gặp
NTP (Network Time Protocol) là giao thức đồng bộ hóa đồng hồ qua internet. Nó cần thiết để căn chỉnh thời gian trên các thiết bị với tham chiếu UTC. Nếu không có NTP, đồng hồ máy tính sẽ lệch hàng giây mỗi ngày do độ trôi của bộ dao động thạch anh, điều này rất quan trọng đối với giao dịch tài chính, ghi nhật ký và bảo mật.
Hệ thống NTP sử dụng các cấp — stratum: stratum 0 (đồng hồ nguyên tử và GPS), stratum 1 (máy chủ kết nối với tham chiếu), stratum 2 (máy chủ NTP công cộng), stratum 3–4 (máy chủ cục bộ), stratum 5–15 (máy khách). Stratum càng cao, sai số tiềm năng càng lớn. Stratum 16 có nghĩa là thời gian không được đồng bộ hóa.
SNTP là phiên bản đơn giản hóa của NTP cho thiết bị có tài nguyên hạn chế. Nó không lọc máy chủ, không phân tích độ trôi đồng hồ và không sử dụng PLL. SNTP phù hợp với ứng dụng di động nơi độ chính xác 10–100 ms là đủ. NTP đầy đủ cần thiết cho máy chủ, thiết bị viễn thông và hệ thống fintech.
Sử dụng thư viện Apache Commons Net với lớp NTPUDPClient. Gửi yêu cầu đến pool.ntp.org, nhận phản hồi và trích xuất dấu thời gian truyền. Thay vào đó, hãy sử dụng API REST của máy chủ, trả về thời gian máy chủ trong tiêu đề Date hoặc trong nội dung phản hồi dưới định dạng Unix Timestamp.
Nếu không có đồng bộ hóa NTP, thời gian hệ thống trên thiết bị có thể chênh lệch hàng phút hoặc hàng giờ. Điều này làm gián đoạn thông báo đẩy, xác thực chứng chỉ SSL, nhật ký, bộ lập lịch tác vụ và giao thức mật mã. Trong ứng dụng tài chính, chênh lệch hơn 5 giây được coi là mối đe dọa bảo mật.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm