Draft Standard for  a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems

Abstract
------------

This standard specifies a protocol enabling precise synchronization of clocks in measurement and control systems implemented with technologies such as network communication, local computing and distributed objects. The protocol is applicable to systems communicating via packet networks. The protocol enables heterogeneous systems that include clocks of various inherent precision, resolution and stability to synchronize. The protocol supports system-wide synchronization accuracy and precision in the sub-microsecond range with minimal network and local clock computing resources. The default behavior of the protocol allows simple systems to be installed and operated without requiring the management attention of users.

Keywords
--------------

clock, distributed system, master clock, measurement and control system, real time clock, synchronized clock, boundary clock, transparent clock

 5. 数据类型和PTP系统中on-the-wire格式
=================================

5.2 Primitive 数据类型
------------------------------
Boolean TRUE or FALSE.
Enumeration4 4-bit enumerated value
Enumeration8 8-bit enumerated value
Enumeration16 16-bit enumerated value
UInteger4 4-bit unsigned integer
Integer8 8-bit signed integer
UInteger8 8-bit unsigned integer
Integer16 16-bit signed integer
UInteger16 16-bit unsigned integer
Integer32 32-bit signed integer
UInteger32 32-bit unsigned integer
UInteger48 48-bit unsigned integer
Integer64 64-bit signed integer
Nibble 4-bit field not interpreted as a number
Octet 8-bit field not interpreted as a number

5.3 Derived数据类型
--------------------------
struct

struct TimeInterval
{
 Integer64 scaledNanoseconds;
};
单位为纳秒,要乘以2的16次方。2.5ns = 0000 0000 0002 8000 (16进制)

struct Timestamp
{
 UInteger48 secondsField;
 UInteger32 nanosecondsField;
};

typedef Octet[8] ClockIdentity;

struct PortIdentity
{
 ClockIdentity clockIdentity;
 UInteger16 portNumber
};

struct PortAddress
{
 Enumeration16 networkProtocol;
 UInteger16 addressLength;
 Octet[addressLength] addressField;
};

struct ClockQuality
{
 UInteger8 clockClass;
 Enumeration8 clockAccuracy;
 UInteger16 offsetScaledLogVariance;
};


6. 时钟同步模型
=============

6.4 PTP消息类型
-------------------------

事件消息:需要打上精确时间戳
Sync
Delay_Req
Pdelay_Req
Pdelay_Resp

通用消息
Announce
Follow_Up
Delay_Resp
Pdelay_Resp_Follow_Up
Management
Signaling

Sync, Delay_Req, Follow_Up和Delay_Resp消息用于产生和通信用于同步普通时钟和边界时钟的时间信息。
Pdelay_Req, Pdelay_Resp和Pdelay_Resp_Follow_Up用于测量两个时钟port之间的链接延时。链接延时被用来更正在Sync和Follow_Up消息中的时间信息。
Annouce消息用于建立同步分层结构。
Management消息用于查询和更新时钟所维护的PTP数据集。
Signaling消息用于其他的目的,例如在主从之间协调单播消息的发送频率。


6.5 PTP设备类型
-----------------------

五种基本类型:
普通时钟(Ordinary clock)
边界时钟(Boundary clock)
端到端透明时钟(End-to-end transparent clock)
点对点透明时钟(Peer-to-peer transparent clock)
管理节点(Management node)

PTP中有两种机制用于测量PTP端口之间的延时
1)延时请求-响应机制,用到Sync, Delay_Req, Delay_Resp(Follow_Up可选)消息。
2)peer延时机制,用到Pdelay_Req, Pdelay_Resp(Pdelay_Resp_Follow_Up可选)消息。

普通和边界时钟的端口可以利用其中的任一种机制。端对端的端口透明时钟独立于这两种机制。点对点的端口使用peer延时机制。

普通时钟
------------

一个普通时钟通过基于一个物理端口上的两个逻辑接口在网络上通信。事件接口用于发送和接收事件消息,通用接口用于发送和接受通用消息。
一个普通时钟维护两种类型的数据集:时钟数据集和端口数据集。
协议引擎负责:发送和接受PTP消息,维护数据集,执行与端口关联的状态机,根据接收到的PTP时间消息和产生的时间戳计算主机时间(如果端口处于从状态)。

边界时钟
------------

边界时钟通常会有多个物理端口,每个物理端口有两个逻辑接口:时间和通用。边界时钟的每个端口与普通时钟基本一致,除了:边界时钟所有的端口的时钟数据集是公用的,公用一个本地时间。每个协议引擎会有额外的功能来解析所有端口的状态,从而决定哪个端口用来提供时间信号来同步本地时钟。

端到端透明时钟
---------------------

端对端透明时钟象一个普通的桥、路由器或中继器那样转发所有的消息。但对于PTP事件消息,resident time bridge会测量PTP事件消息的residence时间(消息穿越透明时钟所需要的时间)。这个时间会写入到这个PTP事件消息或者其后续follow up消息(Follow_Up或者Pdelay_Resp_Follow_Up)的特定字段中(correctionField)。这个更正值是基于事件消息进入和离开透明时钟时的时间戳的差值。

点对点透明时钟
----------------------

点对点透明时钟与端对端透明时钟主要区别在于它更正和处理PTP时间消息的方式,除此以外,两者是一样的。

点对点透明时钟对于每一个端口有一个额外的模块,这个模块用来计算每个端口和与它分享这条链接的另一端(也要支持点对点透明时钟)的链路延时。这个链路的延时计算是基于与其链路端交换Pdelay_Req,Pdelay_Resp和可选的Pdelay_Resp_Follow_Up消息过程的。端对端透明时钟是更正所有的PTP Event 时间消息,而点对点只更正Sync和Follow_Up消息,因为延时已经确定了。这些消息中的correctionField字段会被Sync消息的Residence时间和链路延时时间更新。由于链路之间的延时已经包含在correctionField中,所以点对点透明时钟中的Master时钟不用对每个slave时钟的Delay_Req作出回应。


管理节点
------------
有一条或者多条物理链接到网络上;
作为一个通向PTP管理消息的人机或编程接口;
可以与任何时钟类型组合。

6.6 同步概况
------------------

协议的正常运行有两个阶段:
建立主从层次和同步时钟


建立主从层次
------------------
在一个域中,普通时钟和边界时钟的每个端口都有一个独立的协议状态机,每个端口检查其接受到的所有的Annouce消息,利用最佳主时钟算法(Best Master Clock,BMC),决定时钟端口的状态:Master,Slave还是Passive。
最佳主时钟算法通过比较描述两个时钟的数据来决定哪个数据描述了更好的时钟。这个算法有两个分离的算法组成:数据集比较算法和状态决定算法。

数据集比较算法是基于相关属性的逐队比较的,这些属性包括有:priority1, clockClass, clockAccurary, offsetScaledLogVariance, priority2, clockIdentity.

状态决定算法依据数据集比较算法的结果决定该端口的下一个状态。


同步普通时钟和边界时钟
-----------------------------------

消息交换过程:
1. Master发送Sync消息,记下该消息的本地发送时间t1。
2. Slave接收到Sync消息,并记下其接收到该消息的本地时间t2。
3. Master有两种方式告诉Slave该Sync消息的发送时间t1。
  1) 将t1时间嵌入到Sync消息中,这需要某种硬件处理以获得高精度。
  2)在后续的Follow_Up消息中发送
4. Slave发送Delay_Req消息往Master,并记下发送时间t3。
5. Master接收到Delay_Req,并记下该消息到达时间t4。
6. Master发送Delay_Resp消息告知Slave t4。
利用这四个时间可以算出Master和Slave之间的时钟差值,前提是链路是对称的,即发送和接收延时一样。计算公式为:
offset = ((t2 - t1) - (t4 - t3))/2
one_way_delay = ((t2 - t1) + (t4 - t3))/2


在支持peer-to-peer路径更正的时钟中测量链路传输延迟
-------------------------------------------------------------------------------

这里没有主从之分
Port-1:
发送一个Pdelay_Req消息,并记下该时间t1。
Port-2:
接收到Pdelay_Req消息,记下接收时间t2,然后返回一个Pdelay_Resp消息,记下该消息的发送时间t3。(收到消息到发送消息的时间间隔要尽可能的短以减小由于两个端口之间的频率偏移引起的误差。)
然后Port-2可以:
1. 在Pdelay_Resp中返回t2和t3的差值。
2. 在Pdelay_Resp_Follow_Up消息中返回t2和t3的差值。
3. 在Pdelay_Resp和Pdelay_Resp_Follow_Up消息中分别返回t2和t3。

Port-1:
接收到Pdelay_Resp后,记下时间t4。利用这四个时间可以计算平均链路延时。

如果链路传输不对称会引起链路传输延时误差。


消息时间戳的产生
------------------------
可选择在PHY, MAC, OS, Application layer来采集,越靠近物理层精度越高。


6.7 PTP通信拓扑
-------------------------

分层结构:
树形结构,边界时钟组成树的分支点,普通时钟作为叶子。这种结构的好处是在一个普通时钟和Grandmaster时钟之间往往只有少数的几个边界时钟。

线性结构:
长链结构,需要端对端透明时钟来去除延时的累积。如果还要去除master要回应所有的Delay_Req消息,可进一步利用点对点透明时钟或者边界时钟。

不同网络协议的桥接
-----------------------------

边界时钟可以用来桥接不同的网络传输技术,例如UDP/IP和DeviceNet。


系统启动
------------

为了在一个时钟上线时提供更有序的行为,普通时钟或者边界时钟会再一个可配置的时间间隔中侦听Announce消息,如果没有收到,则这个时钟会认为它就是master,直到当有更好的时钟出现。

另外为了支持在增加,删除或者改变时钟的时候系统能有序的重构,增加了一个PRE_MASTER状态。在这个状态下,时钟端口的行为与MASTER状态一样,唯一不同的是它不会在通信路径上发送消息,直到重构完成。

 

7. PTP实体属性
=============

7.1 域
---------
由domainNumber (0 ~ 255)表示。0是缺省的域。

7.2 PTP timescale
--------------------------

Epoch
------

PTP epoch是1 January 1970 00:00:00 TAI, 也就是 31 December 1969 23:59:51.999918 UTC.

在一个域中,时间测量的是从epoch以来流逝的时间。


7.3 PTP通信
----------------

PTP消息具备以下属性:
1. 消息类
2. 消息sourcePortIdentity
3. 消息类型
4. 消息sequenceId
5. 标志定义选项


事件消息时间戳的产生
------------------------------

除非特别说明,事件消息的时间戳采集点应该是在帧起始(SOF)界定符后的第一个符号处。

<egressTimestamp> = <egressMeasuredTimestamp> + egressLatency
<ingressTimestamp> = <ingressMeasuredTimestamp> ─ ingressLatency

消息sourcePortIdentity
------------------------------
每一条PTP消息都包含有一个标识出口的sourcePortIdentity字段。

消息sequenceId
----------------------
处特别说明外,每个PTP普通,边界或透明时钟的端口都要为每一种类型的消息维护一个独立的sequenceId池。

7.4 PTP通信媒介
-----------------------

reserved 0000
UDP/IPv4 0001
UDP/IPv6 0002
IEEE802.3 0003
DeviceNet 0004
ControlNet 0005
ProfiNet 0006

通信路径非对称性
---------------------------
<meanPathDelay>,delayAsymmetry

<meanPathDelay> = (tms + tsm)/2

tms = <meanPathDelay> + delayAsymmetry,
tsm = <meanPathDelay> ─ delayAsymmetry.

delayAsymmetry的测量不在这个标准范围内。


7.5 PTP端口
------------------

一个PTP端口是由portIdentity标识的。这个值是在portDS数据集中维护的。一个portIdentity有两个属性:
portIdentity.clockIdentity和portIdentity.portNumber。

clockIdentity
-------------
是一个8字节的数组。
1. 使用IEEE EUI-64
最高的三个字节为OUI(分配给使用PTP的组织),后五个字节为Extension identifier(由各组织自己保证其唯一性)。
或者可以使用EUI-48来生成clockIdentity,这时候EUI-48应该是一个该组织所拥有的Ethernet MAC地址。
2. 使用非IEEE EUI-64
最高的字节必须是FF。

portNumber
----------
两个字节。支持单个PTP端口的portNumber值应该为1。对于多口的PTP节点,依次为1, 2, ..., N。

clockIdentity和portIdentity值的比较
------------------------------------
clockIdentity: 如果X中的每个字节等于Y中的每个字节,则X=Y。
否则比较不一致的最高位,小的则clockIdentity小。
portIdentity: 如果A.clockIdentity < B.clockIdentity,则A<B,反之A>B。


7.6 PTP设备属性
============
五种类型的PTP设备。所有设备通过clockIdentity属性标识。除此之外:
普通和边界时钟有属性:priority1, priority2, clockClass, clockAccuracy, timeSouce, offsetScaledLogVariance, numberPorts。
(或者有observedParentOffsetScaledLogVariance,observedParentClockPhaseChangeRate)

priority1(0~255)用于执行最佳主时钟算法,值越小,等级越高。
priority2在1不成功的时候继续判断最佳主时钟。
clockClass: 0 ~ 255
clockAccurary: 00 ~ FF

PTP variance
-------------

variance算法
variance标识

父级时钟统计
-------------


7.7 PTP时间特征
============

消息传输间隔
------------------
portDS.logAccounceInterval
portDS.logSyncInterval
portDS.logMinDelayReqInterval
portDS.logMinPdelayReqInterval

PTP超时
-------------
portDS.announceReceiptTimeout

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lybra/archive/2008/03/06/2153995.aspx