出處:https://blog.csdn.net/dosthing/article/details/81588219?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control
NTP報文格式如圖所示,它的字段含義參考如下:
- LI 閏秒標識器,占用2個bit
- VN 版本號,占用3個bits,表示NTP的版本號,現在為3
- Mode 模式,占用3個bits,表示模式
- stratum(層),占用8個bits
- Poll 測試間隔,占用8個bits,表示連續信息之間的最大間隔
- Precision 精度,占用8個bits,,表示本地時鍾精度
- Root Delay根時延,占用8個bits,表示在主參考源之間往返的總共時延
- Root Dispersion根離散,占用8個bits,表示在主參考源有關的名義錯誤
- Reference Identifier參考時鍾標識符,占用8個bits,用來標識特殊的參考源
- 參考時間戳,64bits時間戳,本地時鍾被修改的最新時間。
- 原始時間戳,客戶端發送的時間,64bits。
- 接受時間戳,服務端接受到的時間,64bits。
- 傳送時間戳,服務端送出應答的時間,64bits。
- 認證符(可選項)
拋開復雜的協議報文,我們來理解一下NTP客戶端與服務器的交互過程,進而理解參考時間戳、原始時間戳、接受時間戳、傳送時間戳的關系。如圖,客戶端和服務端都有一個時間軸,分別代表着各自系統的時間,當客戶端想要同步服務端的時間時,客戶端會構造一個NTP協議包發送到NTP服務端,客戶端會記下此時發送的時間t0,經過一段網絡延時傳輸后,服務器在t1時刻收到數據包,經過一段時間處理后在t2時刻向客戶端返回數據包,再經過一段網絡延時傳輸后客戶端在t3時刻收到NTP服務器數據包。特別聲明,t0和t3是客戶端時間系統的時間、t1和t2是NTP服務端時間系統的時間,它們是有區別的。對於時間要求不那么精准設備,直接使用NTP服務器返回t2時間也沒有太大影響。但是作為一個標准的通信協議,它是精益求精且容不得過多誤差的,於是必須計算上網絡的傳輸延時。客戶端與服務端的時間系統的偏移定義為θ、網絡的往返延遲定義為δ,基於此,可以對t2進行精確的修正,已達到相關精度要求,它們的計算公式如下:
式中:
t0是請求數據包傳輸的客戶端時間戳
t1是請求數據包回復的服務器時間戳
t2是響應數據包傳輸的服務器時間戳
t3是響應數據包回復的客戶端時間戳
對此,我們只需將NTP服務端返回的時間t2加上網絡延時δ的一半就可以了(t2+δ/2)。