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