王圣東,方建勇,劉新友
(中國船舶重工集團(tuán)公司江蘇自動化研究所,江蘇 連云港 222006)
在作戰(zhàn)指揮系統(tǒng)中,時間同步一直是一個熱點(diǎn)和難點(diǎn),特別對于大型系統(tǒng),具有臺位多、集成關(guān)系復(fù)雜等特點(diǎn),不便給所有臺位安裝時鐘硬件或與精確時間源互通,因此在軟件層面上提高時間同步的校時精度顯得尤為重要。一般系統(tǒng)中大都配備少數(shù)時鐘硬件,通過其給系統(tǒng)中某幾個時間服務(wù)器校時,再利用該服務(wù)器給系統(tǒng)內(nèi)其它主機(jī)校時。NTP協(xié)議是目前可用于系統(tǒng)內(nèi)校時的一種較好選擇,在局域網(wǎng)中能達(dá)到1ms左右的精度,能滿足系統(tǒng)的性能要求。
網(wǎng)絡(luò)時間協(xié)議[1](NTP,Network Time Protocol)是用于互聯(lián)網(wǎng)中時間同步的標(biāo)準(zhǔn)互聯(lián)網(wǎng)協(xié)議,NTP提供的機(jī)制嚴(yán)格、實用、有效,其產(chǎn)生的網(wǎng)絡(luò)開銷甚少,并具有保證網(wǎng)絡(luò)安全的應(yīng)對措施。這些措施的采用使NTP可以在互聯(lián)網(wǎng)上獲取可靠和精確的時間同步。
本文提出一種在局域網(wǎng)上利用NTP校時的具體實現(xiàn)和相關(guān)算法,在Windows操作系統(tǒng)下亦能達(dá)到1~2ms左右的精度。
NTP是一個跨越廣域網(wǎng)或局域網(wǎng)的復(fù)雜的同步時間協(xié)議,它除了可以估算數(shù)據(jù)包在網(wǎng)絡(luò)上的往返延遲外,還可獨(dú)立地估算計算機(jī)時鐘的偏差,從而實現(xiàn)在網(wǎng)絡(luò)上的高精準(zhǔn)度計算機(jī)校時,該協(xié)議的組成如圖1所示[2]。
圖1 NTP協(xié)議的字段組成
協(xié)議中描述的字段分別為閏秒標(biāo)識器、版本號、模式、層、測試間隔、精度、根時延、根離散、參考時鐘標(biāo)識符、參考時間戳、原始時間戳、接收時間戳、傳送時間戳、傳送時間戳和認(rèn)證符。
圖2描述了一種經(jīng)典的NTP對時架構(gòu),包括四個層次的時鐘,頂層為精確時間源;第二層為一級時間服務(wù)器,對第三層的服務(wù)器和NTP客戶端進(jìn)行校時;第三層既包括時間服務(wù)器和NTP客戶機(jī),第四層全為NTP客戶機(jī),處于下一層的NTP客戶機(jī)可以通過NTP數(shù)據(jù)包交換選擇上一層的時間服務(wù)器,下一層的時間服務(wù)器對下層提供時間服務(wù),同時選擇上一層服務(wù)器作為自己的時間服務(wù)器。
在傳統(tǒng)的NTP處理流程中,客戶端在進(jìn)行一次本地時鐘校正過程中對所有認(rèn)識的服務(wù)器進(jìn)行交互和數(shù)據(jù)過濾,以判斷出當(dāng)前信任的最佳時間服務(wù)器,而在實際的處理過程中,一次選定的時間服務(wù)器是有代表性的,在較長的時間范圍內(nèi)都是值得信任的(硬件決定),不需要在每次本地校正時都對所有時間服務(wù)器進(jìn)行數(shù)據(jù)處理和選主,只有在判斷本服務(wù)器的有效時間發(fā)生跳變時,才重新執(zhí)行選主過程,改進(jìn)后的NTP處理流程如圖3所示。
圖2 NTP對時基本架構(gòu)
圖3 改進(jìn)的NTP處理流程
在NTP的對時架構(gòu)中,服務(wù)器和客戶端都需要不斷獲取本主機(jī)的系統(tǒng)時間,NTP協(xié)議中的幾個關(guān)鍵時間戳是客戶端計算網(wǎng)絡(luò)傳輸時延和與服務(wù)器時間偏差的關(guān)鍵參數(shù),時間戳本身的精度對提升客戶端的校時精度具有至關(guān)重要的意義。目前某些大型電子信息系統(tǒng)采用的操作系統(tǒng)為Windows、Solaris和VxWorks,系統(tǒng)本身提供的獲取時間函數(shù)精度一般為 10ms左右(視硬件時鐘頻率)且在 ms級時間不連續(xù),這對計算傳輸時間和時間偏差來說是一個較大的數(shù)值。我們可以通過結(jié)合硬件計數(shù)的方式將系統(tǒng)時間的獲取精度精確到1ms及以下。
以Windows操作系統(tǒng)為例,獲取系統(tǒng)時間最高精度的函數(shù)為 GetSystemTime,獲取的精度雖然能達(dá)到ms級,但實際上受限于實際時鐘更新頻率,精度大概為 16ms左右(與硬件有關(guān))。我們可以采用系統(tǒng)函數(shù)
QueryPerformanceFrequency、QueryPerformanceCounter、GetSystemTimeAsFileTime和FileTimeToSystemTime結(jié)合的方式,構(gòu)造一個精度在1ms左右的時間供應(yīng)器,持續(xù)提供當(dāng)前系統(tǒng)時間,圖4描述了一個框架性的時間供應(yīng)器流程,具體同步和時間片控制等細(xì)節(jié)問題不再贅述。
圖4 高精度時間供應(yīng)器實現(xiàn)的基本流程
通過在Windows上的測試,上述時間供應(yīng)器提供的時間為1ms及以下[3],可滿足高精度校時的要求。
根據(jù)上述對時架構(gòu),信息系統(tǒng)進(jìn)行校時的前提是外界有穩(wěn)定精確的時間源,并且與系統(tǒng)中一臺或多臺性能穩(wěn)定的主機(jī)互通。這些主機(jī)可以用來構(gòu)建NTP服務(wù)器,這不需要軟件實現(xiàn),只需要硬件集成時,根據(jù)需要選擇一臺還是多臺主機(jī),一般選擇性能較高的服務(wù)器。
NTP服務(wù)器接收外部時間源的精確時間,并根據(jù)需要對本主機(jī)進(jìn)行校時,保證自己為一臺合格的時間服務(wù)器(在本文中不作詳述)。這一般為獨(dú)立的進(jìn)程或線程處理。另一方面,NTP服務(wù)器需要部署 NTP服務(wù)進(jìn)程與系統(tǒng)中的所有客戶機(jī)進(jìn)行交互,應(yīng)答NTP客戶端的時間戳和各種參數(shù)請求。
NTP服務(wù)器在與客戶機(jī)進(jìn)行交互的過程中,以守護(hù)進(jìn)程的形式等待NTP客戶端的發(fā)送請求,收到請求后將NTP服務(wù)器的地址和NTP工作的相關(guān)參數(shù)發(fā)送到客戶機(jī),客戶機(jī)收到地址應(yīng)答后將其作為服務(wù)器之一(學(xué)習(xí)的過程)并開始和其實時交互。NTP服務(wù)器在實現(xiàn)過程中,主要根據(jù)客戶端發(fā)送的NTP包填充接收時間和再發(fā)送時間及更改的參數(shù),并將NTP包返回到客戶端。
NTP客戶端需要實時發(fā)送NTP數(shù)據(jù)包到NTP服務(wù)器,并接收NTP服務(wù)器返回的NTP數(shù)據(jù)包,要提高客戶端的校時精度,必須處理好對時間精度消耗的各種因素,其中因素之一就是進(jìn)程/線程時間片切換的時間和線程的權(quán)限控制,為保證客戶端在同一個進(jìn)程(未開線程)實現(xiàn)實時的發(fā)送和接收處理,需要將進(jìn)程的優(yōu)先級設(shè)為最高,一般為REALTIME_PRIORITY_CLASS權(quán)限,同時使用select函數(shù)和時鐘中斷處理的方式實現(xiàn) NTP客戶端的數(shù)據(jù)異步傳輸,其基本的流程實現(xiàn)如圖5所示:
圖5 NTP客戶端數(shù)據(jù)傳輸實現(xiàn)流程
NTP數(shù)據(jù)報文交互過程可以采用三種模式[4~5]:多播模式、客戶機(jī)/服務(wù)器模式以及對稱模式。本實現(xiàn)采用客戶機(jī)/服務(wù)器模式進(jìn)行 NTP數(shù)據(jù)包交互:客戶機(jī)每發(fā)送一個查詢數(shù)據(jù)包,服務(wù)器接收后回送一個應(yīng)答數(shù)據(jù)包。數(shù)據(jù)包交互時序圖如圖63所示。
圖6 NTP數(shù)據(jù)包交互時序圖
我們用δ表示傳輸遲延,則δ1=T2?T1,δ2=T4?T3,我們用θ代表客戶端與服務(wù)器之間的時間偏差,通過計算可得出:θ=T3+δ?T4=[(T2?T1) +(T3?T4)]/2
定義離差ε為描述客戶端和服務(wù)器至最近一次傳輸由于測量引起的錯誤累積,該參數(shù)在時間過濾處理時實時更新,并作為時鐘選擇算法的一個衡量因子。離差ε在NTP包交互時計算如下:
ε=(1<<sys.precision)+?(T4-T1)
其中,?表示任何原因下的最大時間偏差率,由于ε是作為時鐘選擇算法的一個衡量因子,因此在只有單個時間源服務(wù)器時,不需要進(jìn)行計算和處理。
時間過濾處理完成一次校時周期內(nèi)對某個固定時間服務(wù)器的時間樣本獲取和最佳樣本計算,在接收到NTP數(shù)據(jù)包時進(jìn)行處理??蛻舳讼蚍?wù)器發(fā)送一份查詢報文Pi,在收到服務(wù)器的應(yīng)答報文之后,客戶端利用該報文計算出傳輸時延、時間偏差及離差三元組(δi,θi,εi),存儲在描述服務(wù)器的寄存器中,下標(biāo)從 0開始,用以時間數(shù)據(jù)過濾處理,初始化為(0,0,NTP.MAXDISPERSE),寄存器中最多存放八(NTP.SHIFT)個三元組,下一個三元組計算出時將所有三元組的存儲位置從左端往右移動一位,最新的三元組存放到0位置,丟棄生存時間最長的一個三元組(δNTP.SHIFT?1,θNTP.SHIFT?1,εNTP.SHIFT?1)。εi在處理中根據(jù)誤差積累進(jìn)行更新,對每個εi增加?*τ(τ=sys.clock-peer.update,τ描述了服務(wù)器自上一次更新的時間間隔),定義λ為同步間隔,以λi=εi+|δi|/2構(gòu)造一個濾波權(quán)值臨時列表[λ,index],index為描述λi對應(yīng)位置的索引列表,長度亦為NTP.SHIFT,對該臨時列表進(jìn)行升序排列,用以最終確定權(quán)值最小的參數(shù)的位置。
NTP選主處理(時鐘選擇算法)在多個時鐘源的情況下(時間服務(wù)器),在對所有的時鐘源完成一次時間過濾處理得到有效的結(jié)果后,對所有的時鐘源進(jìn)行處理得到最佳的時鐘源。
時鐘選擇算法由兩個算法組成:交集算法和聚類算法,交集算法構(gòu)造一個符合條件的候選時鐘源列表,用以時間同步。聚類算法根據(jù)時鐘源所在的層和同步間隔對候選時鐘源進(jìn)行排序,并根據(jù)時鐘選擇離差重復(fù)剔除最大偏離的時鐘源,直至剩余最后一個或幾個最精確、準(zhǔn)確和穩(wěn)定的時鐘源。
在上述各算法中,得到了本地時鐘與標(biāo)準(zhǔn)時間的時間偏差θ(時鐘選擇計算的結(jié)果θadj,包括正值、0和負(fù)值),下一步根據(jù)時間差對本地時鐘進(jìn)行調(diào)整即可完成一個周期內(nèi)的本地時鐘校正。在本地時鐘進(jìn)行調(diào)整的過程中,一般有兩種方式:一是將本地時鐘數(shù)值+θ直接設(shè)置為當(dāng)前時鐘,即時間信號的相位同步;還有一種是采用調(diào)整時鐘頻率的方式來逐步調(diào)整本地時鐘,即時間信號的頻率同步。
Unix、Windows和VxWorks等操作系統(tǒng)一般都提供上述兩種調(diào)時方式的系統(tǒng)調(diào)用,如Unix的settimeofday和 adjtime系統(tǒng)函數(shù);Windows的 SetSystemTime和SetSystemTimeAdjustment系統(tǒng)函數(shù)等。
由于settimeofday和SetSystemTime等函數(shù)對本地時鐘進(jìn)行及時相位調(diào)整,如果θ數(shù)值較大,則對應(yīng)用軟件將產(chǎn)生較大的影響。因為時間發(fā)生了跳變;而采用adjtime和SetSystemTimeAdjustment等函數(shù)時采用調(diào)整頻率以達(dá)調(diào)相目的時,會持續(xù)相當(dāng)長的時間,如在Linux上調(diào)整一分鐘需要數(shù)小時之多(根據(jù)θ、時鐘固有頻率和每秒最大調(diào)整量計算)。因此在具體實施時需將兩種方式結(jié)合使用。
以下給出一種使用建議(其中m、n和r的數(shù)值根據(jù)需要自定義):
1)|θ| > m*100s:判定有效服務(wù)器發(fā)生了時間跳變,重新執(zhí)行時鐘選主處理;
2)m*100s≥|θ|≥ n*100ms:采用跳變方式調(diào)整本地時鐘,本機(jī)時間設(shè)置為有效服務(wù)器時間;
3)n*100ms≥|θ|≥ r*10ms,采用調(diào)頻方式調(diào)整本地時鐘,本機(jī)時間逐步逼近有效服務(wù)器時間;
4)r*10ms > |θ|,如果六次時間過濾處理結(jié)果都為同一符號,則采用調(diào)頻調(diào)整本地時鐘,使本機(jī)時間逐步逼近有效時間服務(wù)器;否則,不調(diào)整本地時鐘。
本文介紹了一種NTP協(xié)議和運(yùn)行機(jī)制以及算法,并對某些具體問題給出實現(xiàn)或改進(jìn),在大型電子信息系統(tǒng)環(huán)境中,系統(tǒng)的校時精度能夠達(dá)到 ms級,可滿足系統(tǒng)的校時性能指標(biāo)。在實際運(yùn)用中受外界干擾、溫度變化以及晶體振蕩器老化等因素引起頻率漂移,精度在長時間片內(nèi)可能在幾 ms內(nèi)進(jìn)行抖動,在后期研究中,需對高穩(wěn)定性和更高精度作進(jìn)一步研究,也可根據(jù)時間運(yùn)用環(huán)境,對上述流程和算法進(jìn)行簡化。
[1]Mills D.L.Network Time Protocol(Version 3)Specification,Implementation and Analysis.DARPA Network Working Group Report RFC-1305[S].University of Delaware,March,1992:112-113.
[2]Mills D.L.Simple Network Time Protocol Specification,RFC-1769[S].University of Delaware,March,1992:79-81.
[3]黎文偉,張大方,謝高崗,等.基于通用 PC 架構(gòu)的高精度網(wǎng)絡(luò)時延測量方法[J].Journal of Software,2006(2).
[4]盧光輝,等.基于組播的網(wǎng)絡(luò)延遲測試[J].軟件學(xué)報,2001,12(11).
[5]王俊峰,等.單向延遲測量中的時鐘動態(tài)性檢測算法.[J]軟件學(xué)報,2004,15(4).