目前在做一些车载多传感器时间同步方面的工作,以此记录总结一下学习过程中碰到的一些概念和问题。文中大部分知识源于网络,且均标明了文章来源,如有侵权,请联系我删除,谢谢。

内容来源

  1. linux时钟概述:https://blog.csdn.net/yuki5233/article/details/82220078
  2. suse(Linux发行版之一,类似Ubuntu或Centos)操作系统中关于PTP简介及操作*:https://documentation.suse.com/zh-cn/sled/15-SP2/html/SLED-all/cha-tuning-ptp.html#id-1.8.9.2.8.6
  3. Red Hat手册中关于PTP的简介及操作:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s1-starting_ptp4l
  4. IEEE1588标准:https://standards.ieee.org/standard/1588-2019.html
  5. PTP服务器产品手册中关于PTP的介绍:http://www.h3c.com/cn/d_201008/686476_30003_0.htm
  6. NTP与PTP的比较*:https://www.redhat.com/en/blog/combining-ptp-ntp-get-best-both-worlds
  7. PTP一些补充知识*:https://www.techplayon.com/ieee-1588-precision-time-protocol-ptp-for-telecom-networks/
  8. PTP延迟测量原理:https://www.perle.com/supportfiles/precision-time-protocol.shtml

标*的是我认为需要仔细阅读的文章。

一、主机上的时间

以Linux(Ubuntu)操作系统为例,主要包含两个时钟:系统时钟和硬件时钟。硬件时钟,即BIOS时间;系统时钟,即linux系统Kernel(内核)时间。每次Linux启动时,系统Kernel(内核)会先去读取硬件时钟的设置(但是此时的硬件时间不一定是准确的),然后系统时钟就会独立于硬件继续运作。在linux系统上程序运行时读取的时间都是系统Kernel(内核)时间。

综上所述,想要永久修改linux时间并使得时间准确,就需要永久修改硬件时间,并实现系统时间对硬件时间的同步。不然要么每次重新启动linux时,系统时间又变回之前错误的硬件时间,要么硬件时间同步完成,但系统时间未同步到硬件时间,导致程序获取到的时间(系统时间)仍是错误的。但这里我还有个问题,在我使用PTP的过程中,发现部分网络接口控制器 (NIC) 自身带有时钟,那么这个时钟与主机自身的硬件时钟又有什么关系呢?

二、同步的概念

时钟同步包含三个概念:

        频率同步(Frequency Sync):指单位时间内产生时钟脉冲的次数保持一致,与具体的时间值无关。

        相位同步(Phase Sync):除包含频率同步外,还指产生的时钟脉冲边界保持一致,即在同一时刻触发时钟脉冲的上升沿或下降沿,与具体时间值无关。

        时间同步(Time of Day Sync):除包含相位同步外,还要求具体时间一致。这也是PTP同步的要求。

三、PTP中的概念

PTP
Precision Time Protocol,共有三版,分别为IEEE1588-2002,IEEE1588-2008,IEEE1588-2019,具体可参考参考4。目前市面上大多数的PTP设备应该都支持到了第二版即IEEE1588-2008。冷知识:该标准的pdf售价为280美元。

Linuxptp
PTP协议在Linux系统上的实现,具体包含ptp4l和phc2sys两个软件,具体使用可参看我另一篇文章链接

PTP中的设备类型
PTP作用的对象是时钟,主要分为全局主时钟(GrandMaster),主时钟(MasterClock),透明时钟(TransparentClock),边界时钟(BoundaryClock)和普通时钟(OrdinaryClock)。
全局主时钟GM),全局唯一,为PTP域中的所有设备提供时间基准。
主时钟MC),OC和BC的基准时钟称为主时钟。
边界时钟 (BC) , 指在两个或多个通信路径中具有端口的设备(即它可以是从设备,也可以同时是其他从设备的主设备)。
普通时钟OC),指只有一个端口的时钟(即只能作为从设备进行时间同步)。
透明时钟TC),指不与其它时钟节点保持时间同步的时钟,如交换机。
在这里插入图片描述
在这里插入图片描述

PTP中的端口类型
时钟通过端口进行通信,这些端口按类型可分为主端口(Master Port),从端口(Slave Port),被动端口(Passive Port)。
主端口Master Port)指发布同步时间的端口。
从端口Slave Port)指接收同步时间的端口。
被动端口Passive Port)指既不接收同步时间、也不对外发布同步时间的端口。

PTP中的角色
Master 提供同步时间。
Slave 以Master时间为基准进行同步。

PTP中的同步
PTP 中Master定期发送同步消息,由Slave接收。这给了Slave两个时间戳,Master发送消息时的远程时间t1和Slave接收消息时的本地时间t2。t2与t1的关系可表示为
                                                                        t2 = t1 + offset + RTT/2,
因此只有t1和t2两个时间戳不足以计算时钟偏移offset。必须首先测量Master和Slave之间的网络延迟RTT。测试网络延迟的方法有两种:延迟请求/响应的端到端方法(E2E) 和对等延迟请求/响应的点对点方法 (P2P),原理详见参考5参考8。简单来说就是前者(E2E)使用了上述的两个时间戳来计算往返时延RTT,后者(P2P)不使用t1和t2,而是重新获得四个时间戳来计算往返时延RTT。总而言之,二者都以某种方式获得了往返时延RTT,之后利用往返时延RTT结合t1和t2即可得到时钟偏移offset,从而实现时钟同步。

其它
PTP消息类型,PTP时钟等级规格可参考参考7
PTP的配置文件及方式可参考参考2参考7
PTP与NTP的关系详见参考6,这是很棒的一篇文章。

四、PTP的优势

PTP本身用于设备之间的高精度时间同步,但也可用于频率同步。相比现有的各种时间同步机制,PTP具备以下优势:

        相比NTP(Network Time Protocol,网络时间协议),PTP能够满足更高精度的时间同步要求:NTP一般只能达到亚秒级的时间同步精度,而PTP则可达到亚微秒级。关于NTP和PTP的详细讨论,参见文章*Combining PTP with NTP to Get the Best of Both Worlds*

        相比GPS(Global Positioning System,全球定位系统),PTP具备更低的建设和维护成本,并且由于可以摆脱对GPS的依赖,在国家安全方面也具备特殊的意义。

五、PTP精度误差及故障来源

网络延迟不对称
PTP测量误差的假设前提就是报文在Master和Slave之间的传输延迟是相同的。由于该因素导致的误差上限值为±RTT(往返时延),此时报文往返的一端时延为0,另一端时延为RTT,进一步的讨论见参考6

时间戳错误
在 Linux 机器上,基本上可以在三个不同的地方生成时间戳:
        在用户空间(即 NTP/PTP 守护进程)中,通常在进行 send()系统调用之前和 select() 或 poll() 系统调用之后。
        在内核中,在将数据包复制到网卡环形缓冲区之前以及网卡在收到数据包后发出中断时。这称为软件时间戳。
        在网络接口控制器 NIC 本身中,当数据包进入和离开链路或物理层时。这称为硬件时间戳。
软件时间戳比用户空间时间戳更准确,因为它不包括上下文切换、内核中数据包的处理和网络堆栈中的等待。硬件时间戳比软件时间戳更准确,因为它不包括在 NIC 中等待。但是,硬件和软件时间戳存在一些问题,使它们比用户空间时间戳更难使用。进一步的讨论见参考6

闰秒
PTP 按国际原子时 (TAI) 运行,而系统时钟使用的是协调世界时 (UTC),来源于参考2
按照百度百科的说法,闰秒是指为保持协调世界时(UTC)接近于世界时(TAI)时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时(UTC)增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的)使世界时(UTC)和原子时(TAI)之间相差超过到±0.9秒时,就把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒); 闰秒一般加在公历年末或公历六月末。截至2017年1月2日,全球已经进行了27次闰秒,均为正闰秒。最近一次闰秒在北京时间2017年1月1日7时59分59秒(时钟显示07:59:60)出现。这也是本世纪的第五次闰秒。至于是否会出现该问题取决于PPT服务器中的GPS接收机。

GPS周翻转
全球导航定位系统GPS的时间是通过“周数”+“周内秒”的方式编码的。而GPS系统设计之初分配给“周数”的字长为10比特位,即GPS系统只能表示0~1023周,GPS系统运行时间超出1023周后,“周数”会发生溢出翻转,即从0开始计数,从而导致接收机直接解算出来的时间会回退到1024周之前。第一个GPS系统时间起点为1980年1月6日00:00:00,结束时间为1999年的8月21日23:59:47。第二次GPS系统时间于2019年4月6日23:59:41结束。在这一天,GPS周翻转可能会造成一些GPS接收机的数据和时间功能发生故障,无法正常运转。这一问题是由GPS系统本身的设计决定的,在GPS系统整体升级之前,每经过19.7年便会发生一次周翻转事件,无法避免。北斗卫星系统采用13比特的周数信息,157年内不会出现这一问题,无需担心。至于是否会出现该问题取决于PPT服务器中的GPS接收机。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐