为什么时间同步很重要?
出于诸多原因,精确的时间对于网络至关重要,比如:
网络管理:从不同网络设备采集来的日志信息进行分析时,需要以时间作为参照依据。如果不同设备上的系统时间不一致,会因先后顺序等问题给故障定位带来障碍。
计费系统:计费业务对于时间尤其敏感,要求所有设备的时间保持一致,否则会引起计费不准确,导致用户质疑、投诉等。
协同处理:多个系统协同处理同一个复杂事件,为保证正确的执行顺序,多个系统必须参考同一时钟。
系统时间:某些应用或服务需要准确的时间来标记用户登录、交易等操作信息,确保可追溯记录。
因此有一个统一的标准时间对于网络而言意义重大。
时钟同步协议
NTP:
网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。
通过软件实现,只需要一次握手(一次往返就可以计算出offset)
主时钟系统通过网络途径为从时钟提供时间。以前的主从时钟系统使用脉冲发生器来同步从时钟。后来,引入了串行网络,例如 IRIG-B,我们技术俗称的B码,通过一根电缆将时间传输到许多从时钟。大多数现代时钟系统依靠以太网链路来传输同步时间信号。
PTP:
通过软件和硬件实现,需要两次握手
IEEE 1588-2008 被称为PTPV2
IEEE 1588-2019 被称为PTPV2.1
这是近些年开发出来的时间传输协议,精确时间协议。PTP是指在实现客户端的亚微秒级同步或者说纳秒、皮秒级别时间同步,使其成为科学、测量和控制系统的得力助手。但是,大多数计时应用程序都可以使用更简单的网络时间协议 (NTP) 来实现。因为精确时间协议 (PTP, IEEE1588)基本都是用在商业科技方面的产品,我们平时生活中使用不到纳秒级别精度的时间同步。
gPTP:
IEEE802.1AS, 广义精确时钟协议(Generalized Precision Time Protocol, gPTP),确保收发的终端之间严格时间同步的标准。
gPTP主要是IEEE TSN(时间敏感网络)工作组定义的规范族中的一个组成部分;
TSN工作组是原先的AVB(Audio-Video Bridging)工作组;
由于PTPv2定义了太多的特性选项,那么多个设备之间的互操作性变的较差;gPTP对PTPv2进行了简化,固定了特性选项的选择,相当于PTPv2的一个特定profile。
gPTP 消息不再支持在UDPoverIPv4/IPV6的等L3/L4的承载,只支持在Mac层的承载。
gPTP还可以用于无线网络
NTP
历史
NTP是由美国Delaware大学David L .Mills教授设计的,是最早用于网络中时钟同步的标准之一。NTP是从时间协议和ICMP时间戳报文演变而来,NTP的版本演进如下所示。
NTP时钟层级
NTP允许客户端从服务器请求和接收时间,而服务器又从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC。
NTP以层级来组织模型结构,层级中的每层被称为Stratum。通常将从权威时钟获得时钟同步的NTP服务器的层数设置为Stratum 1,并将其作为主时间服务器,为网络中其他的设备提供时钟同步。而Stratum 2则从Stratum 1获取时间,Stratum 3从Stratum 2获取时间,以此类推。时钟层数的取值范围为1~16,取值越小,时钟准确度越高。层数为1~15的时钟处于同步状态;层数为16的时钟被认为是未同步的,不能使用的。
NTP同步原理
NTP最典型的授时方式是Client/Server方式,如下图所示。
- 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;
- NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2。当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开NTP服务器时的时间戳t3;
- 客户端在接收到响应报文时,记录报文返回的时间戳t4。
客户端用上述4个时间戳参数就能够计算出2个关键参数:
NTP报文从客户端到服务器的往返延迟delay。
客户端与服务端之间的时间差offset。
根据方程组:
可以解得时间差为:
NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。
PTP
在通信网络中,许多业务的正常运行都要求网络时钟同步,即整个网络各设备之间的时间或频率差保持在合理的误差水平内。网络时钟同步包括以下两个概念:
时间同步:也叫相位同步(Phase synchronization),是指信号之间的频率和相位都保持一致,即信号之间的相位差恒为零。
频率同步(Frequency synchronization):也叫时钟同步,是指信号之间在频率或相位上保持某种严格的特定关系,信号在其对应的有效瞬间以同一平均速率出现,以保证通信网络中的所有设备都以相同的速率运行,即信号之间保持恒定的相位差。
PTP遵循IEEE1588协议,通过Best Master Clock算法确认最精确时钟。PTP采用硬件时间戳,可完成秒脉冲同步。
图 1 时间同步和频率同步示意图
如图1所示,有两个表Watch A与Watch B,如果这两个表的时间每时每刻都保持一致,这个状态就是时间同步;如果这两个表的时间不一致,但保持一个恒定的差值(如图中的Watch B总比Watch A晚6个小时),这个状态就是频率同步。
PTP(Precision Time Protocol,精确时间协议)是一种时间同步的协议,其本身只是用于设备之间的高精度时间同步,但也可被借用于设备之间的频率同步。相比现有的各种时间同步机制,PTP具备以下优势:
相比NTP(Network Time Protocol,网络时间协议),PTP能够满足更高精度的时间同步要求:NTP一般只能达到亚秒级的时间同步精度,而PTP则可达到亚微秒级。
相比GPS(Global Positioning System,全球定位系统),PTP具备更低的建设和维护成本,并且由于可以摆脱对GPS的依赖,在国家安全方面也具备特殊的意义。
PTP基本概念
1. PTP域
我们将应用了PTP协议的网络称为PTP域。PTP域内有且只有一个同步时钟,域内的所有设备都与该时钟保持同步。
2. PTP端口
我们将设备上运行了PTP协议的端口称为PTP端口。如图 2 所示,PTP端口的角色可分为以下三种:
主端口(Master Port):发布同步时间的端口,可存在于BC或OC上。
从端口(Slave Port):接收同步时间的端口,可存在于BC或OC上。
被动端口(Passive Port):既不接收同步时间、也不对外发布同步时间的端口,只存在于BC上。
3. 时钟节点
PTP域中的节点称为时钟节点,PTP协议定义了以下三种类型的基本时钟节点:
(1) OC(Ordinary Clock,普通时钟):该时钟节点在同一个PTP域内只有一个PTP端口参与时间同步,并通过该端口从上游时钟节点同步时间。此外,当时钟节点作为时钟源时,可以只通过一个PTP端口向下游时钟节点发布时间,我们也称其为OC。
(2) BC(Boundary Clock,边界时钟):该时钟节点在同一个PTP域内拥有多个PTP端口参与时间同步。它通过其中一个端口从上游时钟节点同步时间,并通过其余端口向下游时钟节点发布时间。此外,当时钟节点作为时钟源时,可以通过多个PTP端口向下游时钟节点发布时间的,我们也称其为BC,如图 2 中的BC 1。
(3) TC(Transparent clock,透明时钟):与BC/OC相比,BC/OC需要与其它时钟节点保持时间同步,而TC则不与其它时钟节点保持时间同步。TC有多个PTP端口,但它只在这些端口间转发PTP协议报文并对其进行转发延时校正,而不会通过任何一个端口同步时间。TC包括以下两种类型:
E2ETC(End-to-End Transparent Clock,端到端透明时钟):直接转发网络中非P2P(Peer-to-Peer,点到点)类型的协议报文,并参与计算整条链路的延时。
P2PTC(Peer-to-Peer Transparent Clock,点到点透明时钟):只直接转发Sync报文、Follow_Up报文和Announce报文,而终结其它PTP协议报文,并参与计算整条链路上每一段链路的延时。
如图 2 所示,是上述三种基本时钟节点在PTP域中的位置。
图 2 基本时钟节点示意图
除了上述三种基本时钟节点以外,还有一些混合时钟节点,譬如融合了TC和OC各自特点的TC+OC:它在同一个PTP域内拥有多个PTP端口,其中一个端口为OC类型,其它端口则为TC类型。一方面,它通过TC类型的端口转发PTP协议报文并对其进行转发延时校正;另一方面,它通过OC类型的端口进行时间的同步。与TC的分类类似,TC+OC也包括两种类型:E2ETC+OC和P2PTC+OC。
4. 主从关系
主从关系(Master-Slave)是相对而言的,对于相互同步的一对时钟节点来说,存在如下主从关系:
发布同步时间的节点称为主节点,而接收同步时间的节点则称为从节点。
主节点上的时钟称为主时钟,而从节点上的时钟则称为从时钟。
发布同步时间的端口称为主端口,而接收同步时间的端口则称为从端口。
5. 最优时钟
如图 2 所示,PTP域中所有的时钟节点都按一定层次组织在一起,整个域的参考时间就是最优时钟(Grandmaster Clock,GM),即最高层次的时钟。通过各时钟节点间PTP协议报文的交互,最优时钟的时间最终将被同步到整个PTP域中,因此也称其为时钟源。
最优时钟可以通过手工配置静态指定,也可以通过BMC(Best Master Clock,最佳主时钟)协议动态选举,动态选举的过程如下:
(1) 各时钟节点之间通过交互的Announce报文中所携带的最优时钟优先级、时间等级、时间精度等信息,最终选出一个节点作为PTP域的最优时钟,与此同时,各节点之间的主从关系以及各节点上的主从端口也确定了下来。通过这个过程,整个PTP域中建立起了一棵无环路、全连通,并以最优时钟为根的生成树。
(2) 此后,主节点会定期发送Announce报文给从节点,如果在一段时间内,从节点没有收到主节点发来的Announce报文,便认为该主节点失效,于是重新进行最优时钟的选择。
PTP同步原理
PTP同步的基本原理如下:
主、从时钟之间交互同步报文并记录报文的收发时间,通过计算报文往返的时间差来计算主、从时钟之间的往返总延时,如果网络是对称的(即两个方向的传输延时相同),则往返总延时的一半就是单向延时,这个单向延时便是主、从时钟之间的时钟偏差,从时钟按照该偏差来调整本地时间,就可以实现其与主时钟的同步。
PTP协议定义了两种传播延时测量机制:请求应答(Requset_Response)机制和端延时(Peer Delay)机制,且这两种机制都以网络对称为前提。
1. 请求应答机制
图 3 请求应答机制实现过程
请求应答方式用于端到端的延时测量。如图 3 所示,其实现过程如下:
(1) 主时钟向从时钟发送Sync报文,并记录发送时间t1;从时钟收到该报文后,记录接收时间t2。
(2) 主时钟发送Sync报文之后,紧接着发送一个携带有t1的Follow_Up报文。
(3) 从时钟向主时钟发送Delay_Req报文,用于发起反向传输延时的计算,并记录发送时间t3;主时钟收到该报文后,记录接收时间t4。
(4) 主时钟收到Delay_Req报文之后,回复一个携带有t4的Delay_Resp报文。
此时,从时钟便拥有了t1~t4这四个时间戳,由此可计算出主、从时钟间的往返总延时为 [(t2 – t1) + (t4 – t3)],由于网络是对称的,所以主、从时钟间的单向延时为 [(t2 – t1) + (t4 – t3)] / 2 。因此,从时钟相对于主时钟的时钟偏差为:Offset = (t2 – t1) - [(t2 – t1) + (t4 – t3)] / 2 = [(t2 – t1) - (t4 – t3) ] / 2。
此外,根据是否需要发送Follow_Up报文,请求应答机制又分为单步模式和双步模式两种:
在单步模式下,Sync报文的发送时间戳t1由Sync报文自己携带,不发送Follow_Up报文。
在双步模式下,Sync报文的发送时间戳t1由Follow_Up报文携带。
2. 端延时机制
图 4 端延时机制实现过程
与请求应答机制相比,端延时机制不仅对转发延时进行扣除,还对上游链路的延时进行扣除。如图 4 所示,其实现过程如下:
(1) 主时钟向从时钟发送Sync报文,并记录发送时间t1;从时钟收到该报文后,记录接收时间t2。
(2) 主时钟发送Sync报文之后,紧接着发送一个携带有t1的Follow_Up报文。
(3) 从时钟向主时钟发送Pdelay_Req报文,用于发起反向传输延时的计算,并记录发送时间t3;主时钟收到该报文后,记录接收时间t4。
(4) 主时钟收到Pdelay_Req报文之后,回复一个携带有t4的Pdelay_Resp报文,并记录发送时间t5;从时钟收到该报文后,记录接收时间t6。
(5) 主时钟回复Pdelay_Resp报文之后,紧接着发送一个携带有t5的Pdelay_Resp_Follow_Up报文。
此时,从时钟便拥有了t1~t6这六个时间戳,由此可计算出主、从时钟间的往返总延时为 [(t4 – t3) + (t6 – t5)],由于网络是对称的,所以主、从时钟间的单向延时为 [(t4 – t3) + (t6 – t5)] / 2。因此,从时钟相对于主时钟的时钟偏差为:Offset = (t2 – t1) - [(t4 – t3) + (t6 – t5)] / 2。
此外,根据是否需要发送Follow_Up报文,端延时机制也分为单步模式和双步模式两种:
在单步模式下,Sync报文的发送时间戳t1由Sync报文自己携带,不发送Follow_Up报文;而t5和t4的差值由Pdelay_Resp报文携带,不发送Pdelay_Resp_Follow_Up报文。
在双步模式下,Sync报文的发送时间戳t1由Follow_Up报文携带,而t4和t5则分别由Pdelay_Resp报文和Pdelay_Resp_Follow_Up报文携带。
PTP报文
PTP通过主从节点间交互报文,实现主从关系的建立、时间和频率同步。根据报文是否携带时间戳,可以将PTP报文分为两类,事件报文和通用报文。
事件报文:时间概念报文,进出设备端口时打上精确的时间戳,PTP根据事件报文携带的时间戳,计算链路延迟。事件报文包含以下4种:Sync、Delay_Req、Pdelay_Req和Pdelay_Resp。
通用报文:非时间概念报文,进出设备不会产生时间戳,用于主从关系的建立、时间信息的请求和通告。通用报文包含以下6种:Announce、Follow_Up、Delay_Resp、Pdelay_Resp_Follow_Up、Management和Signaling,目前设备不支持Management、Signaling报文。
封装格式
1588v2报文可以封装在二层和三层报文中进行传输。根据1588v2报文传输所采用的链路类型不同,1588v2报文可分为MAC封装和UDP封装。
MAC封装
1588v2报文在二层链路上传输时,选择此封装模式,对应的以太网类型Ethernet Type为0x88F7。此时可以设置1588v2报文封装时携带的VLAN ID和802.1p优先级。
UDP封装
1588v2报文在三层链路上传输时,选择此封装模式,对应的目的UDP端口号为319(非Announce报文)或者320(Announce报文)。此时可以设置1588v2报文封装时携带的VLAN ID、802.1p优先级和DSCP优先级。
gPTP
gPTP是general precise time protocol的简称,是PTP协议的派生。
gPTP的目的是确保所有局域网里的节点的时间完全一致(ns级别的误差)
如何达到ns级的误差?
gPTP协议基于L2层传输
在OSI网络模型里,L2是MAC层,L3是IP层,我们通常见到的如交换机是L2层的转发,路由器是L3层的转发。gPTP协议是基于L2层的传播,那么就决定了一个特性,只能在局域网里传播,不能通过路由器往WAN网传输。为了达到ns级别的延时,这个也是必须做的。
MAC上的硬件支持
为了测量更精准的时间,我们必须精准的知道一个MAC帧出去的时间,和收到一个MAC帧的时间,这个地方不能通过软件来获得,因为如果通过软件来获取时间,进出终端,任务抢占的时间是不确定的,不可测的。
测量网线上的延时
为了到达ns级别的延时,网线上的传输时间自然不能忽略,如何测量网线上的传输延时呢?专业名称叫 peer to peer delay
我们假设A想知道自己传输到B的延时有多少,怎么办的。
A会发出一个信息(PdelayReq,这个信息的内容是什么不重要),由MAC记录下离开MAC发送到网线上的真正时间t1,B收到这一帧,由MAC记录下收到这一帧的时间t2,然后B会发送一个信息(PdelayResp, 这个信息的内容是什么不重要),同样的B记录下t3,A会记录下t4,最后B会把(t2,t3 装再Pdelay_Resp_Follow_UP)这个帧里面发到A,这时候A会有4个时间数据,t1,t2,t3,t4。
我们假设A,B 时间相差offset,线上传输延时为delay.
t1+delay=t2+offset
t3+delay=t4-offset
delay=(t2-t1+t4-t3)/2
这个时候我们就可以测到线上的延时是多少了。
在汽车以太网中,这个测量过程A和B都会互相发起,测量。但是不用太频繁,因为这个值主要受线的长度影响,一旦固定下来,就不会有大的变化了。
时间同步
gPTP规定一个局域网里只能有一个master,其他全部是slave,同时只有endpoint能参与作为时钟节点,bridge不能作为时钟节点,只能作为透明时钟。
在汽车以太网中,不需要动态协商谁是master节点,通常是预先设定好的。
只有master节点能发送,sync 和 follow_up这两个帧,其实这个的作用就是告诉所有slave节点,我的时间是多少,你应该和我设置为一样的。
在上图中,master发出sync的时间为 te11,slave收到的时间为tb11,同时master发送follow-up携带te11,告诉slave,这个时候slave就有了两个时间,tb11,te11。
这个时候slave自然就知道自己和master的时间差是多少了,这个地方还有一个重要的一点,slave端还要加上Pdelay这个时间,要把在网线上传输的时间加上。这个时间我们master和slave的时间就一样了。
SLAVE有了这个时间该如何处理?
我们再来看MAC的timer计数器,这个计数器的时钟通常来在晶振然后PLL作为输入,既然是晶振,那么master和slave的晶振就必然会有误差,随着时间的积累会越来越大。
所有SLAVE需要做的就是利用master发来的sync,follow-up帧和测量的pDelay来纠正这个timer计数器里的值。
有了gPTP的协议支持,这个时候不管是master的代码去读timer的值,还是slave的代码去读timer的值,我们理论上认为去到的值都是一样的了。