摘 要:Windows操作系统内置的NTP授时精度不高,分辨率最高只有10 ms。给出一个基于Windows操作系统的计算机网络同步时钟实现方案,该方案可以有效提高计算机时钟同步精度,在LAN中时钟同步精度达250 μs。同时采用了校正时钟频率误差算法,校正后的时钟长期计时误差能达到10天少于1 s。
关键词:NTP 局域网;时钟频率偏差; 高精度授时
一般的计算机和嵌入式设备在时钟度方面没有明确的指标要求, 时钟精度只有10-4~10-5,每天可能误差达十几秒或更多,如果不及时校正,其累积时间误差不可忽视。许多工业控制过程需要高准确度时间,如:电力系统内众多的计算机监控系统、保护装置、故障录波器等时间同步要在ms级以内。
联网计算机同步时钟最简便的方法是网络授时。网络授时分为广域网授时和局域网授时。广域网授时精度通常能达50 ms级,但有时超过500 ms,这是因为每次经过的路由器路径可能不相同。现在还没有更好的办法将这种不同路径延迟的时间误差完全消除。局域网授时不存在路由器路径延迟问题,因而授时精度理论上可以提到亚毫秒级。Windows内置NTP服务,在局域网内其最高授时精度也只能达10 ms级。因此,提高局域网NTP授时精度成为一个迫切需要解决的问题。
1 网络时间协议简介
网络时间协议NTP(Network Time Protocol)的主要开发者是美国特拉华大学的MILLS David L.[1]教授设计实现的,由时间协议、ICMP时间戳消息及IP时间戳选项发展而来。NTP用于将计算机客户或服务器的时间与另一服务器同步,使用层次式时间分布模型。在配置时,NTP可以利用冗余服务器和多条网络路径来获得时间的高准确性和高可靠性。即使客户机在长时间无法与某一时间服务器相联系的情况下,仍可提供高准确度时间。
实际应用中,还有确保秒级精度的简单的网络时间协议SNTP(Simple Network Time Protocol)。SNTP是NTP的一个子集,主要用于那些不需要NTP的精度以较高实现复杂性的网络时间同步客户机。SNTP协议已减少了网络延时对校对准确的影响,但没有冗余服务器和校正时钟频率误差功能。
除了认证符字段在SNTP中一般被忽略外,SNTP的报文格式与RFC-1305中所描述的NTP格式是一致的。NTP/SNTP服务端使用固定的UDP端口号是123。表1是NTP/SNTP报文格式的描述。
2 NTP授时原理
NTP最典型的授时方式是Client/Server方式。如图1所示,客户机首先向服务器发送一个NTP 包,其中包含了该包离开客户机的时间戳T1,当服务器接收到该包时,依次填入包到达的时间戳T2、包离开的时间戳T3,然后立即把包返回给客户机。客户机在接收到响应包时,记录包返回的时间戳T4。客户机用上述4个时间参数就能够计算出2个关键参数:NTP包的往返延迟d和客户机与服务器之间的时钟偏差t。客户机使用时钟偏差来调整本地时钟,以使其时间与服务器时间一致[1]。图1中:
T1为客户发送NTP请求时间戳(以客户时间为参照);T2为服务器收到NTP请求时间戳(以服务器时间为参照);T3为服务器回复NTP请求时间戳(以服务器时间为参照);T4为客户收到NTP回复包时间戳(以客户时间为参照);d1为NTP请求包传送延时,d2为NTP回复包传送延时;t为服务器和客户端之间的时间偏差,d为NTP包的往返时间。
3 NTP授时精度分析
NTP授时精度与NTP服务器与用户间的网络状况有关,主要取决于NTP包往返路由的延时对称程度,往返路由的延时不对称值最大不超过网络延时。式(2)是在假设NTP请求和回复包在网上传送延时相等,即d1=d2=d/2的情况下得出的,而d1、d2的取值范围在(0...d)间,由式(3)可以得出最大授时误差是±d/2。一般广域网的网络延时在10 ms~500 ms之间;局域网的网络延时在计时操作系统内核处理延迟的情况下通常小于1 ms。
假定局域网内NTP延时小于1 ms,理论上授时误差小于0.5 ms,但对于Windows操作系统内置的NTP客户和NTP服务,并不能达到此精度。Windows NTP时钟分辨率因操作系统和硬件不同而有所不同,时钟分辨率通常为10 ms或15 ms。基于Windows操作系统内置的NTP授时精度最高不超过10 ms。
4 基于NTP减少计算机时钟偏差
4.1 计算机时钟偏差分析
通用PC机自带两类时钟源:硬件时钟和软件时钟(或称为系统时钟)。不论是硬件时钟还是软件时钟,都是由石英晶体振荡器驱动的,通过累计石英晶体振荡器输出脉冲数,换算出时间。所以计算机时钟的准确度取决于晶振频率准确度。受温度变化、电压、芯片老化等因素影响,晶振频率会发生小幅度波动,其中温度对晶振频影响最大。
由于工艺和材料的原因,同一生产线上标称频率相同的石英晶体,其实际频率是不同的,实际频率与标称频率偏差率从10-4量级到10-9量级不等。以10-4量级为例,时钟每天至少误差8.64 s。
4.2 基于NTP减少计算机时钟频率偏差
时钟频率偏差是时钟长期计时累积误差的主要原因,要提高时钟长期计时精度,必须补偿时钟频率偏差。联网的计算机可采用NTP方式,可非常方便地校准时钟频率偏差[2],其原理如图2所示。以NTP服务器时钟为标准时间,在某一时刻设置NTP客户机时间为NTP服务器当前时间T0,经过一段时间后,NTP服务器时间为T0+tsn,NTP客户端时间为T0+tcn。因为存在时钟频率偏差,tsn与tcn并不相等。NTP客户端时间tcn需乘以时钟频率偏差系数k才等于tsn,即tsn=k×tcn,所以k=tsn/tcn。
任何晶振实际工作频率都是不稳定的,只是程度不同而已。即使温度补偿的晶振,在常温范围内(摄氏10℃~35℃)也有大约5×10-7~2×10-6的误差。晶振实际频率是受外界多种因素(温度、电压、老化等)影响而改变的。因此,时钟频率偏差系数k并非恒定不变的。每隔一定时间,NTP客户机要对时钟频率偏差系数k进行校正,才能保证计时精度。
5 采用高分辨率时钟提高授时精度
局域网内100 B以太网帧在百兆网络物理层单向延时理论值约8 μs,要精确测量NTP包网络延时,提高授时精度,时间分辨率必须达到或高于μs级。Windows系统常用的多个与时间有关的API,其时间分辨率最高精度只能达到ms级。其中,time、gmtime、localtime的时间值精确到s级;函数GetTickCount返回值时间精确到10 ms或15 ms。
Windows计算机系统内部有一个高精度性能定时器。函数QueryPerformanceFrequency可得到这个定时器的频率。函数QueryPerformanceCounter可得到定时器的当前值。利用2次获得的计数之差及时钟频率,就可以计算出事件经历的精确时间。缺点是:读取速度相对慢,在PⅢ 866 MHz和P4 2.8 GHz计算机上执行的速度分别约为1.13 μs和1.12 μs,与CPU速度关系不大。在使用时要注意它的实用分辨率大约只有2 μs。
Intel Pentium及以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64 bit无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数,提供了1条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳。但实际执行约需200个时钟周期,对于1 GHz处理器实用分辨率约0.2 μs。
采用高精度性能定时器或RDTSC均可为网络延时测量提供μs级计时,但要根据系统的具体情况选择一个最合适的。
有了μs级计时器,并不表示基于Windows系统的NTP授时精度实际达μs级。因为时间戳一般都在应用层加盖,包含了计算机处理和协议封装(解封)开销等不可具体量化的时延,数值大多在几百μs到几十μs间,具有随机性,无法准确预知,从而造成NTP精度无法进一步提高。百兆交换式局域网实际授时精度约±250 μs。
6 高精度局域网授时实现
在Windows计算机网络中,采用高分辨率定时器可有效提高局域网NTP授时精度,减少时钟与标准时间的偏差。校正时钟频率偏差系数,可减少长期计时累积误差及提高时钟准确度。
6.1 计算机网络组成
为使测试结果反映实际应用的环境,测试是在正常运行信息业务的真实网络环境下进行的。参加测试的计算机和网络设备正常处理日常业务。计算机网络由100多台计算机和十几台48/24口、10 M/100 M自适应交换机级联而成。计算机间以100 Mb/s网速通信。
作为NTP服务器的是一台P4/2.8G/512 MB内存,操作系统为Windows XP台式计算机。NTP客户端的计算机是一些PⅢ/866/256 MB内存Windows XP计算机。Windows XP默认已打开UDP 123端口,为了不与Windows内置的NTP服务发生冲突,根据上述提高NTP授时高精度算法编写的客户端和服务器端测试程序,采用其他空闲的UDP端口,如UDP 1000端口。
6.2 实验评估
测试时间持续10天,客户机每分钟向服务器发出1个NTP请求进行测试:
(1)根据NTP返回包计算出时钟频率偏差系数k和NTP包延时d。各NTP客户机所得的测试结果类似,图3是其中1台NTP,客户机每分钟向服务器发出1个NTP请求包,计算出客户机时钟频率偏差系数组成的曲线图。时钟频率偏差系数是某一数值附近波动变化的,主要受温度的影响。曲线第42个点的时钟频率偏差系数是0.999 951 5,数值变化速度开始缓慢。假设时钟频率偏差系数是0.999 951 5,在未校正系数前,每天误差约4.19 s。除去前面41个变化速度较快的点,10天中时钟频率偏差系数从0.999 951 5缓慢波动变化到0.999 951 2。对应的时钟频率偏差系数误差δ是3×10-7,折算后约38.5天误差为1 s。所以校正时钟频率偏差系数后,时钟长期计时误差可轻易地达到10天少于1 s。
图4所示为测试过程中每次NTP包在客户机和服务器间往返的延时情况,在10天中99 %的NTP包延时小于500 μs;延时在1 ms~2 ms的NTP包24个,占0.17 %;延时在2 ms~10 ms的NTP包10个,占0.069 %;延时10 ms以上只有2个,占0.013 9 %。大延时NTP包在测试过程中上随机出现的情况将仅占1 %,延时500 μs及以的NTP包滤除后,局域网NTP授时最大延时小于500 μs,授时偏差最大不超过±250 μs。
7 进一步提高NTP授时精度的方法
局域网络延相对较大的原因在于时间戳一般都是在应用层加盖。为减少操作系统内核处理延时的影响提高NTP授时精度,发/收NTP包时间戳应尽量接近主机真实发/收包时刻。在不改变硬件的条件下,一个可行的办法是修改网卡驱动程序,将记录NTP包发/收时间戳从应用程序移至网卡驱动程序处,可消除操作系统内核处理延时不确定而引入的误差[3]。这种方法在局域网中可大幅提高NTP授时精度至μs级。
为了减少温度引起晶振频率漂移对时钟准确度的影响,可以采用数字温漂补偿方法,提高时钟长期计时准确度。先测出工作温度范围内温度对应的温漂补偿系数,工作时每隔一定时间,根据实际温度查出对应补偿系数动态地修正时间。
时钟频率偏差和时钟分辨率低是局域网NTP授时精度不高的主要原因。本文提出了基于通用Windows PC 软硬件架构消除这两种误差的低成本且实施方便的高精度方法。随着自动化的通信技术发展日新月异,以太网技术不断渗透到工业控制现场总线应用领域,许多工业控制需要精确的时间,如变电站顺序事件记录SOE需达ms级,本文方法可为工业以太网的高精度同步时钟应用作参考。
参考文献
[1] MILLS D L. Network time protocol(Version 3) specification,Implementation and Analysis-RFC1305,1992.
[2] 黄沛芳.高准确度时钟程序算法.电子技术应用, 2001,27(8).
[3] 黎文伟,张大方,谢高岗,等.基于通用PC架构的高精度网络时延测量方法.软件学报,2006,17(2):275-284.