APP下载

OpenNTPD局域网应用中的时间同步问题及代码改进

2013-11-12尤良芳

天水师范学院学报 2013年5期
关键词:段长度服务器端字段

尤良芳,董 忠

(天水师范学院 物理与信息科学学院,甘肃 天水 741001)

引言

随着网络的发展,局域网、物联网广泛应用于各行各业,使用的服务器、工作站及各类智能终端都有自己的时钟,且都可以调节,但无法保证网络中所有设备与主机时间的同步。经过长期运行,时间差会越来越大,但在网络环境下的应用中可能会引发意想不到的问题。如在分布式计算环境中,由于每个主机时间不一致,会造成同一操作在不同主机的记录时间不一致,将导致服务无法正常地进行。保证网内服务器和工作站或其它嵌入式设备之间时间的同步已成为非常重要的问题。[1]

开源软件OpenNTPD 采用SNTP/NTP 网络时间协议,用于把本地时钟与一个或多个远程NTP服务器进行时间同步,既可以作为客户端使用,也可以设置成为NTP服务器为其他机器提供时间服务;作为OpenBSD操作系统的一个子项目,OpenNTPD设计目标是:用一个简单、安全、方便管理的方式精确计算机的时钟;它是OpenBSD 操作系统缺省的时间同步管理软件。

OpenNTPD 代码结构清晰、简单小巧,占用内存少;和其他时间服务器软件相比,如ntp.org 提供的网络时间协议(RFC1305,RFC2030)应用程序ntp-4.2.6p5.tar.gz 大小为4M,而openNTPD-3.9p1.tar.gz仅为150k。[2-3]

OpenNTPD 虽然广泛应用于互联网,但在自成体系、封闭(无外联)的局域网络环境中,作为网络时间服务器应用时,却无法为网内其它设备提供时间服务。如图1,NTP 服务器ip 地址为192.168.56.101,安装OpenNTPD3.9p1 为网内客户机提供时间服务。客户机使用ntpd与NTP服务器同步时,出现以下两类错误提示:如图2 和图3,本文旨在从SNTPv4 协议和目前最新的OpenNTPD3.9p1 源代码入手分析该问题存在的原因,并提出对其源代码的改进。

图1 OpenNTPD时间服务器局域网应用示意图

图2 局域网应用时错误提示1

图3 局域网应用时错误提示2

1 SNTP/NTP协议及协议包格式分析

1.1 SNTP/NTP协议简介

NTP协议(the Network Time Protocol version 3,由RFC 1305 描述)是网络时间协议的简称,广泛用于互联网上进行计算机时钟同步,通过该协议与国际标准时间同步。NTP根据上级同步源和网络路径的不同,能够提供1-50ms的时间精确度。

NTP协议精度高,算法复杂。在实际很多应用中,秒级的精确度就足够了,SNTP 协议(Simple Network Time Protocol version 4,由RFC 2030 描述)通过简化NTP 访问协议,在保证秒级时间精确度的前提下,使得对网络时间同步的开发和应用变得容易。SNTP协议目前的版本号是SNTP V4,主要对NTP 协议涉及有关访问安全、服务器自动迁移部分进行了缩减。SNTP采用与NTP 格式一样的数据包,计算客户时间、时间偏差以及包往返时延的算法也是一样的,所以SNTP 与NTP 协议具有互操作性,即SNTP 客户可以与NTP 服务器协同工作,同样NTP 客户也可以接收SNTP 服务器发出的授时信息。[4]

1.2 协议包格式

SNTP 消息一般封装在UDP 协议包中,它利用UDP的123端口提供服务。SNTP信息帧格式如图4描述:

协议中主要的数据项说明如下。

LI:当前时间闰秒标志。字段长度为2bit,只在服务器端有效。其值定义为:

0:无警告;1:最后一分钟是61秒;2:最后一分钟是59 秒;3:警告(时钟没有同步);服务器在开始时,LI设置为3,一旦与主机时钟取得同步后就设置成其它值。

VN:协议版本号。字段长度为3bit,当前协议版本号为4。

Mode:指示协议模式。字段长度为3bit,其值定义为:

0:保留;1:对称主动;2:对称被动;3:客户;4:服务器;5:广播;6:保留为NTP 控制信息;7:保留为用户定义;

在单播和多播模式,客户在请求时把这个字段设置为3,服务器在响应时把这个字段设置为4。在广播模式下,服务器把这个字段设置为5。

Stratum:指示服务器工作的级别;

该字段只在服务器端有效,字段长度为8bit。其值定义为:

0:故障信息(kiss-o'-death message);1:一级服务器;2-15:二级服务器;16-255:保留;

图4 SNTPv4协议格式

NTP服务器与上级时间源取得同步后,才能为客户机提供准确的时间服务。NTP协议按照离外部NTP 源的远近将所有服务器归入不同的Stratum(层)中。Stratum-1 为顶层,Stratum-15 为最低层,Stratum层的总数限制在15以内。

Precision:系统时钟的精确性,字段长度为8bit 符号整数,以秒为单位,作为2 的指数方的指数部分,取值范围从-6到-20。该字段只在服务器端有效。

Root Delay:指示与主时钟参考源的往返延迟,字段长度为32bit,以秒为单位,该字段只在服务器端有效。

Root Dispersion:与主时钟参考源的误差,字段长度为32bit,以秒为单位,该字段只在服务器端有效。

Reference Identifier:时钟参考源的标记。对于一级服务器,字段长度为4 字节ASCII 字符串,左对齐不足添零。对于二级服务器,在IPV4 环境下,取值为一级服务器的IP 地址。该字段只在服务器端有效

Reference Timestamp:系统时钟最后一次校准的时间,64bit 时间戳格式表示。该字段只在服务器端有效,

Originate Timestamp:客户向服务器发起请求的时间,以前面所述64bit时间戳格式表示。

Transmit Timestamp:服务器向客户发时间戳的时间,以前面所述64bit时间戳格式表示。[5]

2 OpenNTPD 时间服务器的基本工作过程分析

以SNTPv4 工作模式中最常用的单播模式,来说明服务器的工作过程:

openNTPD 服务器在初始化时,主函数ntp_main()调用函数setup_listeners()在123 端口建立UDP 服务;函数server_dispatch()将数据包结构体ntp_msg 成员status中LI字段设置为3(表示未与上级服务器同步);VN 字段设置为4,表示SNTPv4;Mode 字段设置为4(服务器模式);成员stratum和ppoll 设置为0;成员precision 设置为0xFA(十进制为-6)。

SNTP 服务器在工作过程中,如果与外部时钟源失去同步,Stratum字段设置为0,此时客户收到这个信息时,会丢弃服务器发给它的时间戳信息。

一旦服务器与外部时钟源取得同步后,进入工作状态,在日志中会记录“clock is now synced”。LI字段设置为0,stratum字段设置为外部时钟源服务器的stratum+1;Reference Identifier 字段设置为时钟源的ip 地址,如十六进制C0 A8 FE 01 表示192.168.254.1,Precision 字段和前边设置相同,即为0xFA(十进制为-6);VN 字段设置为客户端请求信息包的VN 字段值,Root Delay 和Root Dispersion 字段设置为0,Reference Timestamp 字段设置为从外部时钟源最新取得的时间,Originate Timestamp 字段设置为客户请求包的Transmit Timestamp 字段值,Transmit Timestamp 字段设置为服务器发出时间戳给客户的时间。

3 OpenNTPD 代码结构及局域网应用代码改进

3.1 主要文件及其功能

ntpd.c 处理命令行参数及相关函数的调用;

ntp.c 包含处理进程之间通讯相关函数;

client.c包含NTP协议及算法相关的函数,作为客户机与上级NTP服务器保持时间同步;

server.c 为客户机提供NTP时间服务;

ntp_msg.c 协议包发送和接收;

ntp_dns.c 域名解析;

log.c 日志记录;

3.2 从client.c源码分析错误提示出现的原因

在文件ntp.h中SNTPv4(RFC2030)协议包定义如下:

函数client_dispatch()首先调用ntp_getmsg()从上一级NTP 时间服务器获得协议数据包,将其存于struct ntp_msg 结构变量msg中,并与268行开始对结构成员status和stratum判断,其关键代码如下:

282 行函数log_info()日志记录时间未同步的原因,字符串s 为错误提示信息,273 行和276 行的strlcpy()函数分别给出了图2 和图3 的错误提示信息;由相对应的if 语句可知,图2 中错误原因是客户端接收的协议包中成员status 中LI 字段为0,即服务器未与其上级时间服务器同步;图3错误原因是客户端接收的协议包中成员stratum为0,即服务器失去与其上级时间服务器同步。在局域网(未外联)中该时间服务器由于没有上级时间服务器,所以出现图2 和图3 中的错误提示,并停止服务,该分析与2.2中SNTPv4协议简介相互印证。

3.3 从server.c源码分析入手提出解决方案

server.c文件中函数server_dispatch()构造发送给客户的协议数据包,其关键代码如下:

其中变量status为ntp_status结构,用于保存服务器的的状态参量,该结构在htpd.h中定义如下:

其中103 行synced成员保存服务器是否已与外接时间同步源同步,成员stratum 保存服务器级别,在封闭的局域网内,其值均为零;应在160行和169行对其代码进行改造,改造后的关键代码如下:

即设服务器已与外接时间服务器同步,其级别为3级。

4 结论

将修改后的代码进行编译运行,客户端不再有错误提示,并能够保持和服务器的时间同步,在实际测试中效果良好。修改后的OpenNTPD代码,既保持了原代码的优良特性,又扩展了其应用的范围。

[1]于承先.集约化水产养殖信息系统的设计与实现[J].农业工程学报,2008,2(24):235-238.

[2]OpenNTPD[EB/OL].http://www.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/ntpd/,2012-04-10.

[3]OpenBSD Manual[EB/OL].http://www.openbsd.org/cgi-bin/man.cgi,2012-04-10.

[4]RFC1305.Network Time Protocol(Version 3)Specification,Implementation and Analysis[EB/OL].http://www.faqs.org/rfcs/rfc1305.html,2012-04-10.

[5]RFC2030.Simple Network Time Protocol (SNTP) Version 4 for IPv4,IPv6 and OSI[EB/OL].Ihttp://www.faqs.org/rfcs/rfc2030.html,2012-04-10.

猜你喜欢

段长度服务器端字段
中俄原油管线冻土融沉对输油管道应变的影响研究
Linux环境下基于Socket的数据传输软件设计
重力热管几何结构优化的数值研究
浅谈台湾原版中文图书的编目经验
过渡段长度对混合梁桥的受力影响
基于Qt的安全即时通讯软件服务器端设计
基于Qt的网络聊天软件服务器端设计
基于C/S架构的嵌入式监控组态外设扩展机制研究与应用
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述