前言:最近在學習時頻產品時鐘對時協議,在學習NTP協議時一直對協議報文中的時間戳轉換存在疑問,通過各種搜集資料、自我理解后終于對NTP時間戳有了一個具體的認識;發現現階段網上的免費資料里對整個轉換沒有寫的很仔細,導致理解比較難,接下來我針對我學習后的理解,詳細地講一下NTP時間戳是如何轉換成UTC時間的,(若有不對的地方,歡迎指出,共同進步)
正文:
首先簡單講一下NTP協議,相信搜到這篇文章的對NTP是有一定了解的,想進一步對NTP中某些欄位定義學習深入一點,NTP(Network Time Protocol)網路時間協議基于UDP,用于網路時間同步的協議,使網路中的計算機時鐘同步到UTC,再配合各個時區的偏移調整就能實作精準同步對時功能,
在理解轉換之前先講一個NTP時間戳和UTC時間的定義(注意兩種時間戳的起始時間不同,相差70年):
①NTP時間戳用一個64bit無符號定點數表示,它表示自從1990年1月1日00:00:00到現在過了多少秒,64bit分為兩部分,高32bit(MSW)表示整數部分,單位是秒;低32bit(LSW)表示小數部分,單位是232皮秒,
②UTC時間,格林威治時間1970年1月1日00:00:00(北京時間1970年1月1日08:00:00)起至現在的總秒數,表示為1970-01-01 00:00:00 UTC,程式里習慣叫做UTC時間戳,
NTP協議中有四個時間戳,本文不討論這四個時間戳的區別,只簡單的拿其中一個NTP時間戳報文分析如何轉換成UTC時間,例如一段時間戳報文為“D9 FD 84 95 94 F8 59 7C”,下面我們一起學習該NTP時間戳是如何轉換成UTC時間的,
先處理MSW高位32bit“D9 FD 84 95”,將其轉換為10進制3657270421,由于NTP時間和UTC時間起始不同,需要將該時間減少70年(1900年到1970年)2208988800(0x83AA7E80),則為1448281621,使用UTC轉換器為2015-11-23 12:27:01 UTC(格林威治時間),2015-11-23 20:27:01 UTC+8(北京時間 UTC+8)
然后再處理LSW低位32bit“94 F8 59 7C”,在處理LSW之前先要了解1LSW=232ps是怎么來的,1 second =1,000,000,000,000 picoseconds,這個值很大,而2^32=4294967296,很明顯用32bit無法精確到1 picoseconds,那就盡力而為,于是自然就把1,000,000,000,000 picoseconds劈成2^32份:
1,000,000,000,000/(2^32) = 232.83064365386962890625 即1LSW=232ps
故先將LSW乘以232轉為ps,然后ps除以10^6就得到us了,于是有:usec=lsw*232/1000000
再看看秒的一些時間單位轉換:
毫秒ms是10^-3秒;微妙us是10^-6秒;納秒ns是10^-9秒;皮秒ps是10^-12秒
于是低位32bit“94 F8 59 7C”,將其轉換為10進制2499303804,則:
usec=lsw*232/1000000=579838us=0.579838s
綜上所述,故NTP時間戳“D9 FD 84 95 94 F8 59 7C”轉換成UTC時間為2015-11-23 20:27:01.579838 UTC+8(北京時間)
寫在最后的話:整理不易,若對你有幫助望支持點贊一下,謝謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297915.html
標籤:其他
上一篇:LoRa模塊獲取光照值
下一篇:基于GSM遠程短信防盜報警系統
