资源预览内容
第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
第9页 / 共16页
第10页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
精选优质文档-倾情为你奉上第5章 客户端时钟同步软件设计与实现5.1 概述在NTP网络授时系统中,各子网中的路由器可从NTP服务器获取标准时间,并为其它终端用户提供授时服务。同时,其它终端用户也可以直接从NTP服务器获取标准时间。NTP网络授时系统的时钟同步软件,即部署在需通过网络获取精确时间的各windows终端上。时钟同步软件共包括三个功能模块:系统管理、定时器和时钟获取与校正。系统管理模块,用于设置作为时钟参照的NTP服务器的地址、每次对时发送NTP报文的次数、对时间隔等参数。定时器模块,用于定时或手工发起时钟同步请求。在通常状况下,系统按用户设置的对时间隔,自动与NTP服务器进行时间同步。在需要的时候,也可以由用户进行手工同步时间获取与校正模块:用于根据系统指定的参数,构造NTP消息报文,从NTP服务器获取精确的标准时间。系统根据时钟同步的方式(手工或定时)本地时间,使系统内部各个节点的时钟保持一致。任意一个时钟同步客户端发起时钟同步消息,授时服务器返回系统时钟信息,客户端根据时钟信息调整本地时间。5.2 时钟同步软件静态结构图5.2.1 时钟同步软件整体结构时钟同步软件中,定时同步与手工同步的流程基本相同,系统的整体结构如下图所示:图5-1 时间同步的整体模型结构图5.2.2 时钟同步软件的类图分析时钟同步软件的结构,进一步细化系统中各种对象,以完成对系统中的类进行定义。图5-2 时钟同步模块的类图5.2.3 系统主要类设计系统主要类的设计说明如下:1. SYSTEMTIME类表5-1 SYSTEMTIME类设计类表示系统时间的类属性访问权限描述wYearpublic年wMonthpulic月wDayOfWeekpulic一周第几天wDaypublic日wHourpublic小时wMinutepulic分wSecondpulic秒wMillisecondpublic毫秒操作参数描述SYSTEMTIME构造函数2. SynClient类表5-2 SynClient类设计类时钟同步客户端类属性访问权限描述offsetprivate时钟偏差maxoffsetprivate最大时钟偏差ServerTimepublic标准时间BackTimeprivate报文回收时间操作参数描述getoffsetlong value获取时钟偏差getmaxoffset获取最大时钟偏差setmaxoffsetlong value设置最大时钟偏差getBackTime获取报文回收时间setBackTimeSYSTEMTIME systemtime设置报文回收时间3. ConstructPacket类表5-3 ConstructPacket类设计类构建NTP同步报文属性访问权限描述LIpublicLI标志VNpublicVN标志Modepublic模式Stratumpublic层级Pollpublic轮询间隔Precisionpublic精度RootDelaypublic根延时RefTimepublic服务器对时时间OriTimeprivate报文发送时间RecTimeprivate报文接收时间TransTimeprivate报文回复时间操作参数描述ConstructPacket构造函数getOriTime获取OriTime时间戳setOriTimelong time设置OriTime时间戳getRecTime获取RecTime时间戳setRecTimelong time设置RecTime时间戳getTransTime获取TransTime时间戳setTransTimelong time设置TransTime时间戳4. SynTask类表5-4 SynTask类设计类时间同步任务类属性访问权限描述Addressprivate服务器地址Intervalprivate同步间隔操作参数描述SynTask构造函数getAddress获取服务器地址setAddressIPAddress ip设置服务器地址getInterval获取同步间隔setIntervallong para设置同步间隔Check时钟检查Run发起时钟同步请求5. SynServer类表5-5 SynServer类设计类同步通信接口类属性访问权限描述skpublicsocket接口packetprivate同步报文操作参数描述SynServer构造函数getpacket获取报文setpacketConstructPacket pk设置报文sendpacketConstructPacket pk, socket sk发送报文recvpacketConstructPacket pk, socket sk接收报文5.3 时间获取与校正模块动态结构图5.3.1 时钟同步算法时钟同步最主要的问题是解决同步消息传输延迟的计算问题。由于本系统采用单服务器的方式,解决这一问题的办法,是通过时钟同步的客户端向授时服务器多次发送带有时间戳的同步消息报文,并接收授时服务器返回的时钟同步消息报文,计算并记录每次的时间延迟,并选取值最小的一次记录,用此次的标准时间来校正本地时钟28。整个过程如下图所示:图5-3 时钟同步的活动图5.3.2 定时同步定时同步,是指客户端按系统设置的同步时间间隔,定时向授时服务器发送时钟同步请求,保证本地时钟与标准时间保持一致,过程如下:1. 定时时间到,定时器触发发送时钟同步请求;2. 时钟同步客户端SynClient向指定的授时服务器发送时钟同步消息报文;3. 授时服务器接收时钟同步消息报文,将接收时间和响应时间封装在报文中,发回客户端;4. 客户端接收返回报文,计算出本地时钟与标准时间的偏差,校正本地时钟。一次定时同步的时序图与协作图如下:图5-4 定时同步时序图图5-5 定时同步的协作图5.3.3 手工同步手工同步,是指由用户人工触发时钟同步事件,其过程与定时同步基本相同,事件流描述如下:1. 用户发送时钟同步请求;2. 时钟同步的客户端向授时服务器发送时钟同步消息报文;3. 授时服务器接收时钟同步消息报文,将接收时间和响应时间封装在报文中,发回客户端;4. 客户端接收返回报文,计算出本地时钟与标准时间的偏差,校正本地时钟。5. 向用户反馈同步信息。手工同步的时序图与协作图如下:图5-6 手工同步时序图图5-7 手工同步的协作图5.4 时间获取与校正模块的实现5.4.1 总体实现时间获取与校正模块是时钟同步软件的核心,其主要任务是向网络中的NTP服务器发送时钟同步请求并接收服务器返回的带有时间戳的NTP报文,计算网络延时和时间偏差,修正本地主机的系统时间。时间获取与校正的主要流程如下所示。图5-8 时间获取与校正流程图5.4.2 时钟获取与校正的关键技术点时钟同步模块与授时模块的运行环境不同,部署在windows操作系统上,在此用C#编程实现。其实现的要点有:1. NTP报文的封装根据NTP报文的格式,客户端首选构建一个NTP报文,其主要字段的设置如下:表5-1 客户端NTP报文时间戳设置字段名称值LI00VN3Mode3Stratum2Poll忽略Precision忽略Root Delay忽略表5-1 客户端NTP报文时间戳设置(续表)字段名称值Root Dispersion忽略Reference Identifier忽略Reference Timestamp忽略Originate Timestamp忽略Receive Timestamp忽略Transmit Timestamp取报文发送时间Authenticator可选其中,传送时间戳Transmit Timestamp的获取代码段如下:DateTime t1900 = Convert.ToDateTime(1900-01-01 00:00:00);long tick1900 = t1900.Ticks;long tick = DateTime.Now.Ticks;long s1900 = (tick - tick1900)-*8)/;long s1900s = (tick - tick1900) - * 8) % ;byte temp = BitConverter.GetBytes(s1900);for (int j = 0; j 4; j+)Packet40 + j = temp3-j ;temp = BitConverter.GetBytes(s1900s);for (int k = 4; k 8; k+) Packet40 + k = temp7 - k;因为UTC时间表示为当前与1900年1月1日0时相关的秒数,而在C#中,时间的Ticks属性获取的是与公元元年1月1日0时的时间差,计数单位是毫微秒,故先取得1900年第一天的Ticks值,再获取当前时间的Ticks值,两者相减,并除以一个系数,其值与余数就分别为UTC时间的整数和小数部分。Transmit Timestamp时间戳用8个字节64位表示,其中前32位表示秒数的整数部分,后32位表示秒数的小数部分。2. 与服务器间的socket通讯网络编程要用到的两个命名空间29是System.Net和System.Net.Sockets。System.Net命名空间通常与较高层的操作有关,例如 download或upload,试用HTTP和其他协议进行Web请求等等,而System.Net.Sockets命名空间所包含的类通常与较低层的操作有关。如果要直接使用Sockets或者TCP/IP之类的协议,这个命名空间的类是非常有用的。在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上。在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据。针对Socket编程,.NET 框架的Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本30。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号