摘 要: Windows操作系統(tǒng)內(nèi)置的NTP授時(shí)精度不高,,分辨率最高只有10 ms。給出一個(gè)基于Windows操作系統(tǒng)的計(jì)算機(jī)網(wǎng)絡(luò)同步時(shí)鐘實(shí)現(xiàn)方案,,該方案可以有效提高計(jì)算機(jī)時(shí)鐘同步精度,,在LAN中時(shí)鐘同步精度達(dá)250 μs。同時(shí)采用了校正時(shí)鐘頻率誤差算法,,校正后的時(shí)鐘長(zhǎng)期計(jì)時(shí)誤差能達(dá)到10天少于1 s,。
關(guān)鍵詞: NTP 局域網(wǎng); 時(shí)鐘頻率偏差,; 高精度授時(shí)
一般的計(jì)算機(jī)和嵌入式設(shè)備在時(shí)鐘度方面沒有明確的指標(biāo)要求, 時(shí)鐘精度只有10-4~10-5,,每天可能誤差達(dá)十幾秒或更多,如果不及時(shí)校正,,其累積時(shí)間誤差不可忽視,。許多工業(yè)控制過程需要高準(zhǔn)確度時(shí)間,如:電力系統(tǒng)內(nèi)眾多的計(jì)算機(jī)監(jiān)控系統(tǒng),、保護(hù)裝置,、故障錄波器等時(shí)間同步要在ms級(jí)以內(nèi),。
聯(lián)網(wǎng)計(jì)算機(jī)同步時(shí)鐘最簡(jiǎn)便的方法是網(wǎng)絡(luò)授時(shí)。網(wǎng)絡(luò)授時(shí)分為廣域網(wǎng)授時(shí)和局域網(wǎng)授時(shí),。廣域網(wǎng)授時(shí)精度通常能達(dá)50 ms級(jí),,但有時(shí)超過500 ms,這是因?yàn)槊看谓?jīng)過的路由器路徑可能不相同?,F(xiàn)在還沒有更好的辦法將這種不同路徑延遲的時(shí)間誤差完全消除,。局域網(wǎng)授時(shí)不存在路由器路徑延遲問題,因而授時(shí)精度理論上可以提到亞毫秒級(jí),。Windows內(nèi)置NTP服務(wù),,在局域網(wǎng)內(nèi)其最高授時(shí)精度也只能達(dá)10 ms級(jí)。因此,,提高局域網(wǎng)NTP授時(shí)精度成為一個(gè)迫切需要解決的問題,。
1 網(wǎng)絡(luò)時(shí)間協(xié)議簡(jiǎn)介
網(wǎng)絡(luò)時(shí)間協(xié)議NTP(Network Time Protocol)的主要開發(fā)者是美國(guó)特拉華大學(xué)的MILLS David L.[1]教授設(shè)計(jì)實(shí)現(xiàn)的,由時(shí)間協(xié)議,、ICMP時(shí)間戳消息及IP時(shí)間戳選項(xiàng)發(fā)展而來,。NTP用于將計(jì)算機(jī)客戶或服務(wù)器的時(shí)間與另一服務(wù)器同步,使用層次式時(shí)間分布模型,。在配置時(shí),,NTP可以利用冗余服務(wù)器和多條網(wǎng)絡(luò)路徑來獲得時(shí)間的高準(zhǔn)確性和高可靠性。即使客戶機(jī)在長(zhǎng)時(shí)間無法與某一時(shí)間服務(wù)器相聯(lián)系的情況下,仍可提供高準(zhǔn)確度時(shí)間,。
實(shí)際應(yīng)用中,,還有確保秒級(jí)精度的簡(jiǎn)單的網(wǎng)絡(luò)時(shí)間協(xié)議SNTP(Simple Network Time Protocol)。SNTP是NTP的一個(gè)子集,主要用于那些不需要NTP的精度以較高實(shí)現(xiàn)復(fù)雜性的網(wǎng)絡(luò)時(shí)間同步客戶機(jī),。SNTP協(xié)議已減少了網(wǎng)絡(luò)延時(shí)對(duì)校對(duì)準(zhǔn)確的影響,,但沒有冗余服務(wù)器和校正時(shí)鐘頻率誤差功能。
除了認(rèn)證符字段在SNTP中一般被忽略外,,SNTP的報(bào)文格式與RFC-1305中所描述的NTP格式是一致的,。NTP/SNTP服務(wù)端使用固定的UDP端口號(hào)是123。表1是NTP/SNTP報(bào)文格式的描述,。
2 NTP授時(shí)原理
NTP最典型的授時(shí)方式是Client/Server方式,。如圖1所示,客戶機(jī)首先向服務(wù)器發(fā)送一個(gè)NTP 包,,其中包含了該包離開客戶機(jī)的時(shí)間戳T1,,當(dāng)服務(wù)器接收到該包時(shí),依次填入包到達(dá)的時(shí)間戳T2,、包離開的時(shí)間戳T3,,然后立即把包返回給客戶機(jī)??蛻魴C(jī)在接收到響應(yīng)包時(shí),,記錄包返回的時(shí)間戳T4,。客戶機(jī)用上述4個(gè)時(shí)間參數(shù)就能夠計(jì)算出2個(gè)關(guān)鍵參數(shù):NTP包的往返延遲d和客戶機(jī)與服務(wù)器之間的時(shí)鐘偏差t,??蛻魴C(jī)使用時(shí)鐘偏差來調(diào)整本地時(shí)鐘,,以使其時(shí)間與服務(wù)器時(shí)間一致[1],。圖1中:
T1為客戶發(fā)送NTP請(qǐng)求時(shí)間戳(以客戶時(shí)間為參照);T2為服務(wù)器收到NTP請(qǐng)求時(shí)間戳(以服務(wù)器時(shí)間為參照),;T3為服務(wù)器回復(fù)NTP請(qǐng)求時(shí)間戳(以服務(wù)器時(shí)間為參照),;T4為客戶收到NTP回復(fù)包時(shí)間戳(以客戶時(shí)間為參照);d1為NTP請(qǐng)求包傳送延時(shí),,d2為NTP回復(fù)包傳送延時(shí),;t為服務(wù)器和客戶端之間的時(shí)間偏差,d為NTP包的往返時(shí)間,。
3 NTP授時(shí)精度分析
NTP授時(shí)精度與NTP服務(wù)器與用戶間的網(wǎng)絡(luò)狀況有關(guān),,主要取決于NTP包往返路由的延時(shí)對(duì)稱程度,往返路由的延時(shí)不對(duì)稱值最大不超過網(wǎng)絡(luò)延時(shí),。式(2)是在假設(shè)NTP請(qǐng)求和回復(fù)包在網(wǎng)上傳送延時(shí)相等,,即d1=d2=d/2的情況下得出的,而d1,、d2的取值范圍在(0...d)間,,由式(3)可以得出最大授時(shí)誤差是±d/2。一般廣域網(wǎng)的網(wǎng)絡(luò)延時(shí)在10 ms~500 ms之間,;局域網(wǎng)的網(wǎng)絡(luò)延時(shí)在計(jì)時(shí)操作系統(tǒng)內(nèi)核處理延遲的情況下通常小于1 ms,。
假定局域網(wǎng)內(nèi)NTP延時(shí)小于1 ms,理論上授時(shí)誤差小于0.5 ms,,但對(duì)于Windows操作系統(tǒng)內(nèi)置的NTP客戶和NTP服務(wù),,并不能達(dá)到此精度。Windows NTP時(shí)鐘分辨率因操作系統(tǒng)和硬件不同而有所不同,,時(shí)鐘分辨率通常為10 ms或15 ms,。基于Windows操作系統(tǒng)內(nèi)置的NTP授時(shí)精度最高不超過10 ms,。
4 基于NTP減少計(jì)算機(jī)時(shí)鐘偏差
4.1 計(jì)算機(jī)時(shí)鐘偏差分析
通用PC機(jī)自帶兩類時(shí)鐘源:硬件時(shí)鐘和軟件時(shí)鐘(或稱為系統(tǒng)時(shí)鐘),。不論是硬件時(shí)鐘還是軟件時(shí)鐘,都是由石英晶體振蕩器驅(qū)動(dòng)的,,通過累計(jì)石英晶體振蕩器輸出脈沖數(shù),,換算出時(shí)間。所以計(jì)算機(jī)時(shí)鐘的準(zhǔn)確度取決于晶振頻率準(zhǔn)確度,。受溫度變化,、電壓,、芯片老化等因素影響,晶振頻率會(huì)發(fā)生小幅度波動(dòng),,其中溫度對(duì)晶振頻影響最大,。
由于工藝和材料的原因,同一生產(chǎn)線上標(biāo)稱頻率相同的石英晶體,,其實(shí)際頻率是不同的,,實(shí)際頻率與標(biāo)稱頻率偏差率從10-4量級(jí)到10-9量級(jí)不等。以10-4量級(jí)為例,,時(shí)鐘每天至少誤差8.64 s,。
4.2 基于NTP減少計(jì)算機(jī)時(shí)鐘頻率偏差
時(shí)鐘頻率偏差是時(shí)鐘長(zhǎng)期計(jì)時(shí)累積誤差的主要原因,要提高時(shí)鐘長(zhǎng)期計(jì)時(shí)精度,,必須補(bǔ)償時(shí)鐘頻率偏差,。聯(lián)網(wǎng)的計(jì)算機(jī)可采用NTP方式,可非常方便地校準(zhǔn)時(shí)鐘頻率偏差[2],其原理如圖2所示。以NTP服務(wù)器時(shí)鐘為標(biāo)準(zhǔn)時(shí)間,,在某一時(shí)刻設(shè)置NTP客戶機(jī)時(shí)間為NTP服務(wù)器當(dāng)前時(shí)間T0,,經(jīng)過一段時(shí)間后,NTP服務(wù)器時(shí)間為T0+tsn,,NTP客戶端時(shí)間為T0+tcn,。因?yàn)榇嬖跁r(shí)鐘頻率偏差,tsn與tcn并不相等,。NTP客戶端時(shí)間tcn需乘以時(shí)鐘頻率偏差系數(shù)k才等于tsn,,即tsn=k×tcn,所以k=tsn/tcn,。
任何晶振實(shí)際工作頻率都是不穩(wěn)定的,,只是程度不同而已。即使溫度補(bǔ)償?shù)木д?,在常溫范圍?nèi)(攝氏10℃~35℃)也有大約5×10-7~2×10-6的誤差,。晶振實(shí)際頻率是受外界多種因素(溫度、電壓,、老化等)影響而改變的,。因此,時(shí)鐘頻率偏差系數(shù)k并非恒定不變的,。每隔一定時(shí)間,,NTP客戶機(jī)要對(duì)時(shí)鐘頻率偏差系數(shù)k進(jìn)行校正,才能保證計(jì)時(shí)精度,。
5 采用高分辨率時(shí)鐘提高授時(shí)精度
局域網(wǎng)內(nèi)100 B以太網(wǎng)幀在百兆網(wǎng)絡(luò)物理層單向延時(shí)理論值約8 μs,,要精確測(cè)量NTP包網(wǎng)絡(luò)延時(shí),提高授時(shí)精度,時(shí)間分辨率必須達(dá)到或高于μs級(jí),。Windows系統(tǒng)常用的多個(gè)與時(shí)間有關(guān)的API,,其時(shí)間分辨率最高精度只能達(dá)到ms級(jí)。其中,time,、gmtime,、localtime的時(shí)間值精確到s級(jí);函數(shù)GetTickCount返回值時(shí)間精確到10 ms或15 ms,。
Windows計(jì)算機(jī)系統(tǒng)內(nèi)部有一個(gè)高精度性能定時(shí)器,。函數(shù)QueryPerformanceFrequency可得到這個(gè)定時(shí)器的頻率。函數(shù)QueryPerformanceCounter可得到定時(shí)器的當(dāng)前值,。利用2次獲得的計(jì)數(shù)之差及時(shí)鐘頻率,,就可以計(jì)算出事件經(jīng)歷的精確時(shí)間。缺點(diǎn)是:讀取速度相對(duì)慢,,在PⅢ 866 MHz和P4 2.8 GHz計(jì)算機(jī)上執(zhí)行的速度分別約為1.13 μs和1.12 μs,與CPU速度關(guān)系不大,。在使用時(shí)要注意它的實(shí)用分辨率大約只有2 μs,。
Intel Pentium及以上級(jí)別的CPU中,有一個(gè)稱為“時(shí)間戳(Time Stamp)”的部件,,它以64 bit無符號(hào)整型數(shù)的格式,,記錄了自CPU上電以來所經(jīng)過的時(shí)鐘周期數(shù),提供了1條機(jī)器指令RDTSC(Read Time Stamp Counter)來讀取這個(gè)時(shí)間戳。但實(shí)際執(zhí)行約需200個(gè)時(shí)鐘周期,,對(duì)于1 GHz處理器實(shí)用分辨率約0.2 μs,。
采用高精度性能定時(shí)器或RDTSC均可為網(wǎng)絡(luò)延時(shí)測(cè)量提供μs級(jí)計(jì)時(shí),但要根據(jù)系統(tǒng)的具體情況選擇一個(gè)最合適的。
有了μs級(jí)計(jì)時(shí)器,并不表示基于Windows系統(tǒng)的NTP授時(shí)精度實(shí)際達(dá)μs級(jí),。因?yàn)闀r(shí)間戳一般都在應(yīng)用層加蓋,,包含了計(jì)算機(jī)處理和協(xié)議封裝(解封)開銷等不可具體量化的時(shí)延,數(shù)值大多在幾百μs到幾十μs間,,具有隨機(jī)性,,無法準(zhǔn)確預(yù)知,從而造成NTP精度無法進(jìn)一步提高,。百兆交換式局域網(wǎng)實(shí)際授時(shí)精度約±250 μs,。
6 高精度局域網(wǎng)授時(shí)實(shí)現(xiàn)
在Windows計(jì)算機(jī)網(wǎng)絡(luò)中,采用高分辨率定時(shí)器可有效提高局域網(wǎng)NTP授時(shí)精度,減少時(shí)鐘與標(biāo)準(zhǔn)時(shí)間的偏差,。校正時(shí)鐘頻率偏差系數(shù),,可減少長(zhǎng)期計(jì)時(shí)累積誤差及提高時(shí)鐘準(zhǔn)確度。
6.1 計(jì)算機(jī)網(wǎng)絡(luò)組成
為使測(cè)試結(jié)果反映實(shí)際應(yīng)用的環(huán)境,,測(cè)試是在正常運(yùn)行信息業(yè)務(wù)的真實(shí)網(wǎng)絡(luò)環(huán)境下進(jìn)行的,。參加測(cè)試的計(jì)算機(jī)和網(wǎng)絡(luò)設(shè)備正常處理日常業(yè)務(wù)。計(jì)算機(jī)網(wǎng)絡(luò)由100多臺(tái)計(jì)算機(jī)和十幾臺(tái)48/24口、10 M/100 M自適應(yīng)交換機(jī)級(jí)聯(lián)而成,。計(jì)算機(jī)間以100 Mb/s網(wǎng)速通信,。
作為NTP服務(wù)器的是一臺(tái)P4/2.8G/512 MB內(nèi)存,操作系統(tǒng)為Windows XP臺(tái)式計(jì)算機(jī),。NTP客戶端的計(jì)算機(jī)是一些PⅢ/866/256 MB內(nèi)存Windows XP計(jì)算機(jī),。Windows XP默認(rèn)已打開UDP 123端口,為了不與Windows內(nèi)置的NTP服務(wù)發(fā)生沖突,,根據(jù)上述提高NTP授時(shí)高精度算法編寫的客戶端和服務(wù)器端測(cè)試程序,采用其他空閑的UDP端口,,如UDP 1000端口。
6.2 實(shí)驗(yàn)評(píng)估
測(cè)試時(shí)間持續(xù)10天,,客戶機(jī)每分鐘向服務(wù)器發(fā)出1個(gè)NTP請(qǐng)求進(jìn)行測(cè)試:
(1)根據(jù)NTP返回包計(jì)算出時(shí)鐘頻率偏差系數(shù)k和NTP包延時(shí)d,。各NTP客戶機(jī)所得的測(cè)試結(jié)果類似,圖3是其中1臺(tái)NTP,客戶機(jī)每分鐘向服務(wù)器發(fā)出1個(gè)NTP請(qǐng)求包,,計(jì)算出客戶機(jī)時(shí)鐘頻率偏差系數(shù)組成的曲線圖,。時(shí)鐘頻率偏差系數(shù)是某一數(shù)值附近波動(dòng)變化的,主要受溫度的影響,。曲線第42個(gè)點(diǎn)的時(shí)鐘頻率偏差系數(shù)是0.999 951 5,,數(shù)值變化速度開始緩慢。假設(shè)時(shí)鐘頻率偏差系數(shù)是0.999 951 5,,在未校正系數(shù)前,,每天誤差約4.19 s。除去前面41個(gè)變化速度較快的點(diǎn),,10天中時(shí)鐘頻率偏差系數(shù)從0.999 951 5緩慢波動(dòng)變化到0.999 951 2,。對(duì)應(yīng)的時(shí)鐘頻率偏差系數(shù)誤差δ是3×10-7,折算后約38.5天誤差為1 s,。所以校正時(shí)鐘頻率偏差系數(shù)后,,時(shí)鐘長(zhǎng)期計(jì)時(shí)誤差可輕易地達(dá)到10天少于1 s。
圖4所示為測(cè)試過程中每次NTP包在客戶機(jī)和服務(wù)器間往返的延時(shí)情況,,在10天中99 %的NTP包延時(shí)小于500 μs,;延時(shí)在1 ms~2 ms的NTP包24個(gè),占0.17 %;延時(shí)在2 ms~10 ms的NTP包10個(gè),,占0.069 %,;延時(shí)10 ms以上只有2個(gè),占0.013 9 %,。大延時(shí)NTP包在測(cè)試過程中上隨機(jī)出現(xiàn)的情況將僅占1 %,,延時(shí)500 μs及以的NTP包濾除后,局域網(wǎng)NTP授時(shí)最大延時(shí)小于500 μs,,授時(shí)偏差最大不超過±250 μs,。
7 進(jìn)一步提高NTP授時(shí)精度的方法
局域網(wǎng)絡(luò)延相對(duì)較大的原因在于時(shí)間戳一般都是在應(yīng)用層加蓋,。為減少操作系統(tǒng)內(nèi)核處理延時(shí)的影響提高NTP授時(shí)精度,發(fā)/收NTP包時(shí)間戳應(yīng)盡量接近主機(jī)真實(shí)發(fā)/收包時(shí)刻,。在不改變硬件的條件下,,一個(gè)可行的辦法是修改網(wǎng)卡驅(qū)動(dòng)程序,將記錄NTP包發(fā)/收時(shí)間戳從應(yīng)用程序移至網(wǎng)卡驅(qū)動(dòng)程序處,,可消除操作系統(tǒng)內(nèi)核處理延時(shí)不確定而引入的誤差[3],。這種方法在局域網(wǎng)中可大幅提高NTP授時(shí)精度至μs級(jí)。
為了減少溫度引起晶振頻率漂移對(duì)時(shí)鐘準(zhǔn)確度的影響,,可以采用數(shù)字溫漂補(bǔ)償方法,,提高時(shí)鐘長(zhǎng)期計(jì)時(shí)準(zhǔn)確度。先測(cè)出工作溫度范圍內(nèi)溫度對(duì)應(yīng)的溫漂補(bǔ)償系數(shù),,工作時(shí)每隔一定時(shí)間,,根據(jù)實(shí)際溫度查出對(duì)應(yīng)補(bǔ)償系數(shù)動(dòng)態(tài)地修正時(shí)間。
時(shí)鐘頻率偏差和時(shí)鐘分辨率低是局域網(wǎng)NTP授時(shí)精度不高的主要原因,。本文提出了基于通用Windows PC 軟硬件架構(gòu)消除這兩種誤差的低成本且實(shí)施方便的高精度方法,。隨著自動(dòng)化的通信技術(shù)發(fā)展日新月異,以太網(wǎng)技術(shù)不斷滲透到工業(yè)控制現(xiàn)場(chǎng)總線應(yīng)用領(lǐng)域,,許多工業(yè)控制需要精確的時(shí)間,,如變電站順序事件記錄SOE需達(dá)ms級(jí),本文方法可為工業(yè)以太網(wǎng)的高精度同步時(shí)鐘應(yīng)用作參考,。
參考文獻(xiàn)
[1] MILLS D L. Network time protocol(Version 3) specification,Implementation and Analysis-RFC1305,,1992.
[2] 黃沛芳.高準(zhǔn)確度時(shí)鐘程序算法.電子技術(shù)應(yīng)用, 2001,27(8).
[3] 黎文偉,,張大方,謝高崗,等.基于通用PC架構(gòu)的高精度網(wǎng)絡(luò)時(shí)延測(cè)量方法.軟件學(xué)報(bào),,2006,17(2):275-284.