SNTP(Simple Network Time Protocal簡單網絡時間協議),用於跨廣域網或局域網同步時間的協議,具有較高的精確度(幾十毫秒)。SNTP是NTP協議的簡化版,兩者分別在RFC1305和RFC2030介紹。
SNTP工作方式
SNTP采用客戶端/服務器的工作方式,可以采用單播或者廣播的模式。
單播即客戶端定期直接與SNTP服務器交互獲取時間差進行校時。
廣播則是SNTP服務器定期向指定的多播地址發送時間信息,SNTP客戶端通過監聽這些多播地址來獲取時間信息進行同步。UNIX網絡編程中有SNTP廣播方式的部分實現代碼。
SNTP校時原理
SNTP協議主要是通過記錄客戶端向服務器發送數據包時的時間戳t1,服務器端接收到該數據包時的時間戳t2,服務器向客戶端回應時的時間戳t3和最后客戶端接收到服務器回應時的時間戳t4來計算客戶端時間和服務器端時間的偏差,從而進行校時操作,如下圖所示。
則t1與t2之間的時間差為((T2-T1)+ (T3-T4))/2
數據包在網絡上的傳播時間是 (T2-T1) + (T4-T3)
知識點
1、NTP時間戳從1900年開始記秒數,而UNIX時間戳從1970年開始記秒數,即記錄到NTP結構體中的時間要加上JAN_1970(1900到1970共70年的秒數),而從起獲取出來需減掉JAN_1970
2、
- /* Offset between struct timeval.tv_sec anda tai64_t */
- #define NTPLEAPS_OFFSET (4611686018427387914ULL)
- /* Hide this ugly value from programmes */
- #define SEC_TO_TAI64(s) (NTPLEAPS_OFFSET + (u_int64_t)(s))
- #define TAI64_TO_SEC(t) ((t) - NTPLEAPS_OFFSET)
對於這部分我還沒搞清楚,如有明白的麻煩跟我講解下,如NTPLEAPS_OFFSET是怎么來的?
為啥要做這樣的轉換?
校時操作
獲取時間差后就是進行本地校時操作。Linux系統分系統時間和RTC時間,如果只修改了系統時間,那么設備重啟后並不時校時后正常運行的時間。如果修改了RTC時間,則重啟后是校時后正常運行的時間。這兩者的區別如下所述。
RTC(Real Time Clock)時間有一套獨立的計時系統,是設備上由電池供電的硬件時鍾。和設備狀態無關,即使設備關機,RTC時間仍然在運行,是設備的標准時間,無夏令時和冬令時的區分,只有設置時間的時候才能修改,為UTC時間。
系統時間(System Clock),即設備當前時間,使用操作系統自帶的晶振進行計時,在設備關機的時候將會清空,設備重啟時會獲取設備RTC時間來重新設置系統時間,之后獨立於RTC時間運行。有夏令時,在沒有開啟夏令時的情況下,和設備RTC時間基本同步。
設備存在系統時間和RTC時間好處如只想臨時修改下當前時間,則只需要修改下系統時間即可,過后想修改回原有時間,則只需同步下RTC時間便可。