NTP

NTP (Network Time Protocol - Giao thức đồng bộ thời gian mạng) là một giao thức để đồng bộ đồng hồ của các hệ thống máy tính thông qua mạng dữ liệu chuyển mạch gói với độ trễ biến đổi. Giao thức này được thiết kế để tránh ảnh hưởng của độ trễ biến đổi bằng cách sử dụng bộ đệm jitter. NTP cũng là tên gọi của phần mềm được triển khai trong dự án Dịch vụ NTP Công cộng (NTP Public Services Project).

NTP là một trong những giao thức Internet lâu đời nhất vẫn còn được sử dụng (từ trước năm 1985). NTP được thiết kế đầu tiên bởi Dave Mills tại trường đại học Delaware, hiện ông vẫn còn quản lý nó cùng với một nhóm người tình nguyện.

NTP không có liên quan đến các giao thức đơn giản hơn là DAYTIME (RFC 867) và TIME (RFC 868).

Tổng quan 
NTP sử dụng thuật toán Marzullo, và nó cũng hỗ trợ các tính năng như giây nhuận. NTPv4 thông thường có thể đảm bảo độ chính xác trong khoảng 10 mili giây (1/100 s) trên mạng Internet công cộng, và có thể đạt đến độ chính xác 200 micro giây (1/5000 s) hay hơn nữa trong điều kiện lý tưởng của môi trường mạng cục bộ.

Trên mạng Internet, NTP đồng bộ đồng hồ của các hệ thống máy tính theo UTC; trong môi trường LAN độc lập, NTP cũng thường được sử dụng để đồng bộ với UTC, nhưng về nguyên tắc nó có thể được sử dụng để đồng bộ với một mốc thời gian khác, ví dụ như múi giờ tại chỗ.

Chi tiết hoạt động của NTP được quy định trong các RFC 778, RFC 891, RFC 956, FRC 958 (thay thế bởi 1305), và RFC 1305. Chuẩn đang được triển khai là phiên bản 4 (NTPv4); tuy nhiên, vào năm 2005, chỉ có phiên bản 3 và các phiên bản cũ hơn được quy định trong các RFCs. Tổ chức IETF NTP Working Group đã chuẩn hóa hoạt động của cộng đồng NTP từ khi có RFC 1305.

Một phiên bản đơn giản hơn của NTP không cần yêu cầu lưu trữ thông tin trao đổi cũ được gọi là Giao thức Đồng bộ Thời gian mạng Đơn giản - Simple Network Time Protocol hay SNTP. Giao thức này được sử dụng cho các thiết bị nhúng và trong các ứng dụng không cần độ chính xác cao về thời gian. Xem các RFC 1369, RFC 1769, RFC 2030 và RFC 4330.

Chú ý rằng NTP chỉ cung cấp thời gian UTC, và không có thông tin về múi giờ hay giờ tiết kiệm ánh sáng ngày (Daylight saving time). Thông tin vày nằm ngoài hoạt động của NTP và được xác định bằng cách khác (hầu hết các hệ thống đều cho phép chỉnh các thông số này).

Triển khai phần mềm NTP

Unix 
Đối với các hệ thống UNIX hiện đại, NTP Client được triển khai dưới dạng một tiến trình daemon chạy liên tục trong user space. Vì tính nhạy cảm với đồng bộ thời gian, cần phải có một đồng hồ NTP chuẩn phase-locked loop triển khai trong kernel space. Tất cả các phiên bản gần đây của Linux, BSD, và Solaris đều áp dụng cách này.

Microsoft Windows 
Tất cả các phiên bản Microsoft Windows từ phiên bản 2000 đều có Dịch vụ Đồng bộ Windows (Windows Time Service), có chức năng đồng bộ đồng hồ của máy tính với một NTP server. Tuy nhiên, phiên bản Windows 2000 được triển khai Simple NTP, và nó không tương thích với chuẩn NTP phiên bản 3. Từ phiên bản Windows Server 2003, Microsoft đã áp dụng phiên bản đầy đủ NTPv3 theo RFC1305 cho Windows Time Service.

Tuy nhiên, Windows Time Service không thể đảm bảo độ chính xác hơn 1-2 giây. Microsoft không đảm bảo và không hỗ trợ sự chính xác của dịch vụ W32Time giữa các nút mạng. Dịch vụ W32Time không hỗ trợ đầy đủ các tính năng mà các ứng dụng nhạy cảm với thời gian cần.

Đồng hồ tham chiếu NTP có thể được cài đặt trên một hệ thống Microsoft Windows. Thông thường nó là một phần mềm miễn phí của nhà sản xuất đồng hồ tham chiếu từ GPS được cài đặt thông qua Microsoft Installer.

Clock strata 

NTP sử dụng kiến trúc phân cấp, phân lớp cho các cấp nguồn đồng bộ, mỗi một cấp trong phân cấp này được gọi là một "statum' và được gán một số của cấp bắt đầu từ 0 là cấp cao nhất. Cấp stratum chỉ ra nó đã qua bao nhiêu trung gian để đến được cấp tham chiếu và cấp stratum cũng giúp tránh tham chiếu vòng trong phân cấp. Chú ý rằng cấp stratum không có ý nghĩa chỉ chất lượng hay độ ổn định, dễ dàng tim thấy một nguồn đồng bộ "stratum 3" có chất lượng tốt hơn một nguồn "stratum 2" khác. Định nghĩa về statum này cũng khác với stratum dùng trong đồng bộ viễn thông.

 Stratum 0
 Bao gồm những thiết bị như đồng hồ nguyên tử (atomic clock), đồng hồ GPS hay các đồng hồ vo tuyến khác. Thiết bị Stratum-0 thường không được kết nối trực tiếp vào mạng mà được kết nối với máy tính (ví dụ thông qua cổng RS-232 sử dụng tín hiệu xung).
 Stratum 1
 Đây là các máy tính kết nối với thiết bị Stratum 0. Đây là nguồn đồng hồ tham chiếu cho các server Stratum 2. Các máy tính này còn được gọi là time server. Các server Stratum 1 (với NTPv3 hay trước đó) có thể không hoạt động với độ chính xác của cấp Stratum 1.
 Stratum 2
 Là các máy tính gửi các yêu cầu NTP đến cho server Stratum 1. Thông thường máy tính Stratum 2 sẽ tham chiếu từ nhiều server Stratum 1 và sử dụng thuật toán NTP để thu thập thông tin chính xác nhất, và bỏ tham chiếu đến các server Stratum 1 hoạt động không chính xác. Các máy tính Stratum 2 sẽ liên lạc với các máy tính Stratum 2 khác để có được thời gian chính xác và ổn định hơn trong nhóm. Máy tính Stratum 2 theo phân cấp lại là nguồn tham chiếu cho các yêu cầu từ Stratum 3.
 Stratum 3
 Các máy tính này cũng thực hiện các chức năng như Stratum 2, và tương tự cũng là nguồn tham chiếu cho các cấp thấp hơn, có thể có tối đa 16 cấp. Tùy vào phiên bản, NTP có thể hỗ trợ đến 256 Stratum.

Trong phiên bản NTP 5 đang được phát triển, dự kiến chỉ có 8 stratum được cho phép. Hầu hết các NTP clients sẽ tham chiếu đến Stratum 2 server, nên sẽ không bị ảnh hưởng khi có ít cấp hơn.

NTP timestamp 
Nhãn thời gian (timestamp) 64 bit của NTP bao gồm 32 bit chỉ giây và 32 bit chỉ phần chi tiết trong 1 giây, NTP timestamp có thể mô tả được một thời gian trong khoảng 232 giây (136 năm) và độ chi tiết đến 2−32 (233 pico giây).

NTP timestamp sẽ lặp lại mỗi 232 giây (136 năm). NTP lấy mốc thời gian vào tháng 1, năm 1900, vì thế nó sẽ lặp lại vào năm 2036, trước sự cố UNIX năm 2038.

Vì NTP hoạt động dựa trên chênh lệch giữa các time stamp và không bao giờ dựa trên giá trị tuyệt đối, việc lặp lại nhãn sẽ không có ảnh hưởng nếu giữa các nhãn sai lệnh không quá 68 năm. Điều này cũng có nghĩa việc lặp lại vào năm 2036 sẽ không ảnh hưởng đến các hệ thống đang hoạt động vì thông thường chênh lệch thời gian là rất nhỏ. Tuy nhiên, khi hệ thống vừa khởi động, cần xác định ngày chính xác trong 68 năm.

Tuy nhiên, các phiên bản tiếp theo của NTP sẽ sử dụng timestamp 128 bit.64 bits sử dụng cho giây và 64 bits sử dụng cho phần thập phân của giây. Trên thực tế 64 bits cho phần thập phân đủ dùng để thể hiện khoảng thời gian một photon bay từ thời điểm hình thành đến thời điểm (photon) vượt khỏi vành đai điện tử (xung quanh nguyên tử) với tốc độ ánh sáng. Còn 64 bits sử dụng cho giây đủ để diễn tả thời gian cho đến lúc vũ trụ tàn lụi (2^64 giây tương đương 585 tỷ năm).

Even so, future versions of NTP may extend the time representation to 128 bits: 64 bits for the second and 64 bits for the fractional-second.

According to Mills, "The 64 bit value for the fraction is enough to resolve the amount of time it takes a photon to pass an electron at the speed of light. The 64 bit second value is enough to provide unambiguous time representation until the universe goes dim." Indeed, 2−64 seconds is about 54 zeptoseconds, and 264 seconds is about 585 billion years.

Các vấn đề về bảo mật 
Thật thú vị khi biết rằng trong lịch sử 25 năm của NTP rất ít vấn đề về bảo mật được phát hiện, tuy nhiên cũng có vài vấn đề bảo mật được chỉ ra.

Giao thức NTP trải qua nhiều hiệu chỉnh và đánh giá trong toàn bộ lịch sử phát triển của nó, không có nguy cơ bảo mật nào liên quan đến chuẩn của giao thức NTP.

Mã nguồn chuẩn cho NTP đang được sử dụng đã trải qua nhiều đánh giá bảo mật từ nhiều nguồn khác nhau trong nhiều năm, và không có lỗ hổng nguy hiểm nào được phát hiện.

Tham khảo

Xem thêm

Liên kết ngoài 

 NTP version 4 Release Notes
 David Mills' NTP project page
 Time and NTP paper
 NTP Survey 2005 
 NTP Server Online Tester
 Pool of public NTP Time Servers, Vietnam servers
 Official Website, Support, Servers, More Links

Giao thức Internet
Tiêu chuẩn Internet
Tầng ứng dụng (Bộ giao thức Internet)