原文地址 http://www.dzsc.com/data/html/2011-1-17/88338.html

1 引言

  在分布式系统中, 常常需要一个全局时间, 用来确定系统中各种事件发生的先后、协调各种消息的传输等,以控制和监视系统的状态。这就需要将系统中各个部件的局部时间统一,进行时钟同步。随着分布式仿真系统和试验系统在网络上的广泛应用,如何在网络上提供可靠的时钟服务成为一项重要课题。并且由于系统速度上的要求,同步的精度也成为一项重要指标。

  PTP(Precision Time Protocol)协议是IEEE-1588中定义的一种精密时钟同步协议,PTP 协议主要针对于相对本地化、网络化的系统, 子网较好, 内部组件相对稳定的环境设计的。由于PTP 协议实现简单,占用的网络和计算资源少等优点使其广泛应用于分布式系统中。

  PTP 协议可以采用硬件实现,也可以采用软件实现。当采用硬件实现时可以达到ns 级的精度,采用软件实现时通常可以达到ms 级的精度。当在网络中采用软件实现亚毫秒的精度时,存在多种因素的影响造成了时间同步的不可靠。包括网络的不平稳性、网卡对信息包的缓存效应以及操作系统进程调度的影响,这些因素通常不可预测并且无法控制, 造成时钟同步最终的失效。

  本文中结合计算机自身的特点和PTP 协议时钟同步机制,提出了一种纯软件实现的局域网内高精度时钟同步方法, 通过构造高精度时钟, 采取握手机制以及对测量结果进行处理,实现了局域网内亚毫秒精度的时间同步, 有效解决了各种因素对时钟同步的影响。

  2 PTP 协议时钟同步原埋与分析

  一个简单的基于PTP 协议时钟同步机:制的系统包含一个主时钟和多个从时钟,时间同步主要通过分别在发送方和接收方对包含时间的信息打时戳, 并在接收方根据时戳计算出主从时钟的时间偏差和时间信息在网络中传输的延时来实现。为了管理这些时间信息,PTP 协议定义了四种信息类型,包括Sync(同步信息)、FollowUp(Sync 之后的跟随信息)、DelayReq(延时校正申请信息)和DelayResp(对延时校正申请信息的响应)。

  主从时钟的差异主要由时钟偏差和信息包在网络传输中的延迟构成,PTP 协议时钟同步机制中, 主从时钟的同步主要分为两个阶段, 偏移校正和延时校正阶段。具体流程如图1 所示。

图1 PTP 协议时钟同步原理

  在偏移校正阶段, 即图中的A 阶段, 首先由主时钟在1 TM 时刻发出Sync 信息到从时钟,在Sync 信息中包含了一个时间戳, 描述了数据发出的预计时间。由于信息包含的是预计的发出时间而不是真实的发出时间, 所以Sync 信息真实的发出时间被测量后在随后的FollowUp信息中发出。在从时钟一方,记录下Sync 信息真实的接收时间TS1 , 由TM1 和TS1 可以计算出从时钟相对于主时钟的时间偏差offset :

  可由该时间偏差来校正从时钟。但由此计算出来的结果仍然包含有时间信息在网络中传输造成的延时,因此还需要进行延时校正。

  在延时校正阶段, 即图中的B 阶段, 首先由从时钟发出Del ayReq 信息到主时钟,从时钟记录下发送的准确时间TS2 ,主时钟记录下接收的准确时间2 TM ,并将该时间通过DelayResp 返回到从时钟。从时钟通过这两个时间计算出网络延时delay :

  从时钟利用该值来进行校正。此时经过偏移校正和延时校正, 主从时钟达到同步。

  但在实际应用中, 尤其是在网络中采用纯软件实现时,简单采用上述流程进行时钟同步并不能达到亚毫秒的同步精度。这主要是由于网卡的缓存效应、网络的不平稳性以及操作系统进程调度等多方面的影响。

  网络中在进行信息传输时,信息首先送到本地网卡的缓冲区,并在网络空闲时发送到接收方网卡的缓冲区。这样在发送方连续发送多个信息到接收方时,信息首先在缓冲区缓存,包括发送方网卡的缓存和接收方网卡的缓存,在接收方接收信息时可能会同时收到所有的信息。这直接导致了信息接收时间测量不准确,造成时间同步的失效。

表1 时钟偏差测量( 单位: u s 间隔: 1 s )

  相对于网卡的缓存效应,网络的不平稳性和操作系统的进程调度则更复杂一些,因为这两个因素具有不确定性,而且是无法控制的。网络的不平稳性导致了信息包在网络中传输的延迟不可预测, 影响了同步的精度。

  而操作系统采用时间片轮转机制对进程进行调度,使得无法控制时间同步进程何时被调度, 何时停止, 造成了软件延时的不可预测。例如, 表1 中的数据是在局域网中测得的几组数据, 表示的是主时钟和从时钟的偏差,单位为us。在测试过程中主时钟每隔1s 向从时钟连续发送10 个偏移校正时间信息,为了保证网络处于一定的活跃状态,网络中的一些计算机开启FTP 下载。从表1中的数据可以看出, 每组中连续发送的数据相对稳定,相对偏差约几十u s , 但会出现一些差异较大的特殊值,而组与组之间的数据则差异较大,从几ms 到几百ms 不等, 这样无法断定哪些数据对于时钟同步是可靠的。

  经过以上分析可知, 必须对上述因素进行相应处理, 否则无法达到高精度的时钟同步。

  3 基于 PTP 协议的高精度时钟同步方法

  高精度时钟是实现高精度时钟同步的基础, 因此本方法首先构造高精度时钟。在此基础上,通过对PTP 协议的分析,为了解决网卡的缓存效应、网络的不平稳性和操作系统进程调度对时钟同步精度造成的影响, 在PTP 协议基础上引入握手机制, 同时, 采用过滤和直线拟合的方法, 实现亚毫秒精度的时钟同步。

  3.1 高精度时钟的构造

  对于一个系统来说, 时钟可分为两种, 物理时钟和逻辑时钟。物理时钟又称为绝对时钟或者墙上时钟,对应于现实世界中的时间。通常通过计算机内置的时钟芯片可以获得ms 级别的物理时钟。相对时钟是指系统独有的时钟,独立于物理时钟,但和物理时钟有一定的换算关系。

  当系统与外界无相互作用时, 系统内的时钟可以采用逻辑时钟来实现。逻辑时钟实现简单,方法多样,并且可以满足大多数场合的要求,许多系统中都采用了逻辑时钟。

  为了实现高精度的定时,例如微秒级别的定时,一般采用高频率的晶振实现。其实计算机CPU 本身就带有一个高精度的时钟,对于一个2GHz 的CPU 来说,这个时钟的定时精度可达0.5ns。并且Windows 系统提供了一些接口来获取CPU 的震荡频率和计算机开机以后定时器的计数值,因此可以通过这些API 接口来构造一个高精度的逻辑时钟, 并且可向物理时间单位进行转换。

  在这里使用t0 表示CPU 定时器的计数值, △t 表示逻辑时间相对于CPU 计数的偏差,当前逻辑时间t 可由下式构造:

  并且当前逻辑时间t 的修改可通过修改Dt 来实现。

  当需要使用物理时间单位来度量逻辑时间时, 可进行相应的转换。转换公式如下:

  其中t’为以us 为单位的逻辑时间, f 为CPU 时钟震荡频率,该值可由windows 提供的API 来获得。

  虽然CPU 的时钟频率很高,但由于获取CPU 的计数值也需要消耗时间, 所以并不能达到CPU 时钟级别的精度。经实验表明,由该方法构造的逻辑时钟可以达到1us 的精度。这可以满足大多数场合的需要。

  3.2 握手机制

  对于网卡的缓存效应,通过增大两次传输之间的时间间隔并不能有效解决。间隔小起不到隔离两次传输的作用,间隔大,时钟同步又将受到网络的不平稳性和操作系统进程调度的较大影响。而采用握手机制和阻塞的SOCKET套接字可有效解决这个问题。即在接收方收到信息后返回一个确认信息,而发送方只有在收到接收方的确认信息以后才发送下一条信息。这样将两次信息传输进行了隔离,使得接收方不会一下收到发送方的所有信息。

  3.3 时钟同步的时间要求

  网络的不平稳性和操作系统进程调度的影响可能会造成时钟同步的失效。但通过分析发现, 尽管存在这些因素, 实现高精度的时钟同步是可能的。在下面表2 中列出了5 组数据(共测试了10 组,从中随机选择了5 组数据), 测试环境与表1 中数据测试环境是相同的, 同样都采用了握手机制以避免网卡的缓存效应, 只是在测试过程中主时钟向从时钟发送两组数据的间隔为10ms

  从表中的数据可看出,除去一些差异较大的奇异值,测得的主从时钟偏差是稳定的, 大约几十us 左右,这表明在这一段时间内完成0.1ms 精度时钟同步是可以实现的。

表2 时钟偏差测量( 单位: u s 间隔: 1 0ms )

  通过以上分析可知, 为了在网络和操作系统相对平稳的情况下完成时钟同步操作,需要同步消耗的时间尽可能的短, 但是为了得到稳定可靠的数据, 又需要有足够的数据以供分析处理。

  3.4 数据处理算法

  为了从测量的数据中获取有效的数据, 需要对数据进行处理。首先, 数据中存在一些差异较大的值, 这需要查找到这部分数据并予以过滤以消除影响。另外, 为了使剩余有效数据的方差最小, 还需要对这些数据进行拟合。

  假设Data [1 : N ]为测量的N 个数据, Data '[1 : M ]为过滤后的数据, 过滤处理过程可按下式进行。其中M = N - m - n。

  fm,n首先对数据进行排序, 这样差异较大的值就排在了数组的两边, 剔除m 个小值和n 个大值, 即可实现对数据的过滤处理。m 和n 为可变参数,根据数据量的大小和数据的稳定程度确定。

  由于数据Data '[1 : M ]趋向于一条水平直线,可利用直线y = C 对数据进行最小二乘直线拟合。在这里即是对这些数据进行均值处理。拟合可按下式进行。

  这样从N 数据中获得最佳拟合值C 。

  3.5 时钟同步完整步骤

  根据以上的结论, 并结合PTP 协议时钟同步机制,可设计出一种性能可靠的时钟同步方案,具体流程如下图所示。

  (1) 主时钟在TM1[1]发送Sync 信息到从时钟,并记录下发送的准确时刻TM1[1],随后在Fol lowUp 信息中将Sync信息发送的时刻TM1[1]发送到从时钟。从时钟接收到Syn c 信息后记录下准确的接收时刻TS1[1],并返回确认信息OK。

  (2) 重复上述过程 N 次,这样从时钟得到N 个时钟信息的发送和接收时刻TM1[1 : N]和 TS1[1 :N ],将TM1[1 : N]和 TS1[1 :N ]做差,得到主从时钟的N 个偏移值Offset [1 : N ]。

  (3) 对Offset [1 : N ]进行过滤处理和直线拟合,得到一个对所有数据的最佳拟合值offset ,并利用该值对从时钟进行偏移校正, 即图中的A 阶段。

  (4) 由从时钟发送 DelayReq 信息到主时钟,并记录下准确的发送时刻TS2[1],主时钟收到DelayReq 信息后记录下准确的接收时刻TM2[1],并在随后的DelayResp中将TM2[1]返回给从时钟。

  (5) 重复第4 步中的过程M 次,从时钟得到2M个时钟信息, TM2[1 :N ]和TS2[1 : N],对两个数组做差得到M 个主从时钟的延时信息Delay [1 : M ] 。

  (6) 对延时信息 Delay [1 : M ] 进行过滤处理和直线拟合, 得到一个对延时信息的最佳拟合值delay , 并利用该值对从时钟进行延时校正,即图中的B 阶段。

图2 时钟同步完整步骤。

  在网络相对平稳, 计算机负载不大的情况下取M = N = 10,m = n = 2 即可满足亚毫秒精度要求。

  经过以上六步, 即完成了一次主从时钟同步, 为了避免时钟累积误差对系统同步精度的影响,可周期进行上述过程, 保持系统同步。

  4 实验结果与分析

  测试中采用了4 台配置相同的计算机, 采用交换机搭建成局域网, 其中1 台作为主时钟,其余作为从时钟。

  逻辑时钟采用了利用上述原理构造的高精度时钟,CPU频率为1.79553GHz,可利用式t,= t * 106 / f 转换成以u s 为单位的逻辑时钟。为了获取一定数量的数据, 取M = N = 10,m = n = 2 。为了保持网络处于一定的活跃状态, 在计算机上开启F T P 下载, 交换机负载在5MB/ s 左右。

  测试与时钟同步过程类似,在主从时钟同步之后,由主时钟发送Sync 信息到从时钟,并在随后的FollowUp信息中将Sync 信息发送的准确时刻TM 发送过来,从时钟记录下Sync 信息准确的接收时间TS 。因为此时时钟已经同步,所以TS - TM 即为时间信息在传输中的延时delay T ,将此值delay T 与延时校正中延时信息的最佳拟合值delay 进行比较, 即可得出主从时钟的同步效果。

  在表3 中列出了随机选取的10 组数据。

表3 测试结果

  从表3 测试结果中可以看出, 最大的绝对误差为-25.3us,平均误差仅为-4.23us。实现了主从时钟0.1ms的同步精度。这表明通过握手机制、对数据进行过滤和直线拟合处理,有效解决了各种因素对时钟同步精度造成的影响。

  5 结束语

  本文通过分析主从时钟之间时间信息传输的特点,在PTP 时钟同步机制的基础之上,设计出了一种可以达到亚毫秒精度的时钟同步方案。并且经过测试,该方案切实可行。

  目前该时钟同步方法已成功在所在研究所的通用试验仿真平台中用于为平台中传输的各种信息打时戳,以及虚拟串行通讯设备中用于协调消息传输。

来源:只是朋友

一种基于PTP 协议的局域网高精度时钟同步方法(转)的更多相关文章

  1. 几种基于HTTP协议的RPC性能比较

    有了整体的了解后,可以发现Hessian的这个远程过程调用,完全使用动态代理来实现的,其实从客户端代码不难看出,HessianProxyFactory的create方法就是创建接口Basic的代理类, ...

  2. TCPIP协议编程:基于UDP协议的局域网聊天工具的研发

    任务目标 聊天器采用客户端/服务器(C/S)模式: 客户端利用UDP与服务器相连,客户端与客户端之间通过UDP相互通信: 服务器端具有服务器端口设置维护客户端个人信息,记录客户端状态,分配账号等: 客 ...

  3. 一种基于http协议的敏感数据传输方案

    最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现.既然不能用https协议,那就退而求其次采用http协议吧! 那么问题来了!在对接的过 ...

  4. Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较(转载)

    Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...

  5. Tomcat的四种基于HTTP协议的Connector性能比较

    Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...

  6. tsunami:一种基于UDP协议的高速传输

    一. 需求 近期在做数据库迁移.常常须要打包实例传输.传统scp感觉非常慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源代码make ...

  7. tsunami:一种基于UDP协议的快速传输

    一. 需求 最近在做数据库迁移,经常需要打包实例传输,传统scp感觉很慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源码make &a ...

  8. 基于HTTP协议的几种实时数据获取技术

    原文链接https://www.cnblogs.com/xrq730/p/9280404.html,作者博客园----五月的仓颉,转载请注明出处,谢谢 HTTP协议 HTTP协议大家都很熟悉了,开始本 ...

  9. 基于 HTTP 协议的几种实时数据获取技术(转)

    HTTP协议 HTTP协议大家都很熟悉了,开始本文之前,首先简单回顾一下HTTP协议. HTTP协议是建立在TCP协议上的应用层协议,协议的本质是请求----应答: 即对于HTTP协议来说,服务端给一 ...

随机推荐

  1. phonegap 使用极光推送实现消息推送

    最近一直在研究各种推送,ios的由于是apns,比较容易实现,但是andriod的就比较麻烦.后来看了很多解决方案,gcm明显是不行的,其他的方案更是一头雾水,而且需要做第二次开发,太麻烦,后来就选择 ...

  2. 读取Assets中的文件数据

    try { // 返回的字节流 InputStream is = getResources().getAssets().open("info.txt"); // 当读取时,属于文本 ...

  3. 我常用的Linux命令

    CD: ..        —-切换到上层目录 ~        —-回到家目录(/home/你的登录名/) LS: -a        —-显示指定目录所有文件,包括文件名以 . 开头的文件 -l  ...

  4. cocos2d-x 全面总结--字体描边和制作阴影

    关于字体描边的实现,不考虑效果和效率的话,是有三种方式: ① 利用CCLabelTTF制作文字描边和阴影效果 ② 利用CCRenderTexture渲染文理的方式生成带有描边效果的文字 ③ 利用sha ...

  5. First step of using junit---------Software Testing Lab 1---2016.03.18

    1. Install junit a)      Download “junit.jar” b)      In eclipse, Windows->Preferences->Java-& ...

  6. Linux-head,tail用法

    linux ---tail命令 linux中tail命令---用于查看文件内容 最基本的是cat.more和less. 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /e ...

  7. 第三百零八至三百二十天 how can I 坚持

    十三天..2月4号至2月16号,好快,假期还没开始就结束了.一一回忆下. 2月4号,腊月二十六,最后一天上班,没多大事,好像是玩了一天,东月回家,貌似路上好折腾,晚上D401,和她聊了一路,也聊了好多 ...

  8. 详解Android定位

    相信很多的朋友都有在APP中实现定位的需求,今天我就再次超炒冷饭,为大家献上国内开发者常用到的三种定位方式.它们分别为GPS,百度和高德,惯例先简单介绍下定位的背景知识. 什么是GPS定位.基站定位和 ...

  9. C++11变长参数模板

    [C++11变长参数模板] C++03只有固定模板参数.C++11 加入新的表示法,允许任意个数.任意类别的模板参数,不必在定义时将参数的个数固定. 实参的个数也可以是 0,所以 tuple<& ...

  10. JavaScript面向对象简介

    JavaScript面向对象简介 @(编程) [TOC] 1. 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是 ...