sntp協議簡介

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時間便可。

發佈了47 篇原創文章 · 獲贊 17 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章