深入浅出1588v2(PTP)里的时间同步原理

news/2024/4/25 0:05:33/文章来源:https://blog.csdn.net/qwe5959798/article/details/129216887

1.时间同步

1.1 单步同步(OneStep)

单步同步最为简单,master向slave发送一个sync的同步包,同步包里带有这条信息发送时master的当前时间t1,假如这条信息从master传输到slave需要的传输时间是D,那么slave收到信息时,master的当前时间已经变成了t1+D,如果slave当前时间是t2,那么它们之间的时间差

offset = t2 - (t1+D)

比如上图的例子,假如master在自己时间是15:00的时候发送了一个sync包,包里面带有时间t1即15:00,slave在自己时间是15:40的时候收到了这条信息,接收时间点是t2,slave看到包里面数据显示这条信息发送时间点是master的15:00,假如slave已经知道了它和master之间传递消息需要30分钟,那它可以很简单的算出它现在比master快了10分钟,否则它现在应该是15:30。

1.2两步同步(TwoStep)

两步同步一样简单,在单步同步里,sync包直接携带了这个包的发送时间点,两步同步和它唯一的区别在于这个时间点不再直接放在sync包里了,而是在发送完sync包后,紧接着发送一个follow_up包,把这个时间放在follow_up包内。

对于上图的情况就是master在自己时间为15:00时发送了一个sync包给slave,但是这个包里什么也没有。slave在自己时间是15:40时,收到了这个sync包,此时时间点是t2,到这里为止,除了它并不知道sync包是什么时候发送的(t1),其他都和单步一模一样,所以它会继续等待后续的follow_up包。而master在15:10的时候发送了一个follow_up包,所以slave在15:50才收到了follow_up包,但slave对于follow_up包的发送和接收时间根本不关心,因为现在只差sync包的发送时间了,而sync的发送时间就包含在follow_up包内。

是不是觉得单步同步是两步同步的优化版?明明单步就能实现,为何还要多一个follow_up包去传递sync的发送时间?

很简单,思考一下sync这个15:00的时间点是怎么来的?

假如master和slave是两台电脑,你发送sync时,可以直接把15:00填充到sync包里,然后告诉网卡,你需要在15:00把这条信息发送出去,但是这很难实现,而且很麻烦,还需要网卡支持。简单的方法是你把sync包给网卡,但是里面的时间并不填充,而是让网卡在发送时,把这个时间填写进去,这也需要网卡支持,但是明显更符合实际一点。假如我们使用follow_up时,则最简单,我们只需要记录发送时间即可,而根本不需要在发送时填充。

2. 测量延迟

2.1 E2E

在时间同步里,我们假设了我们已知消息传递时间D,但其实这个时间我们一开始并不知道,所以需要计算。E2E的意思是End to End,从名字就可以看出,它从一个终点到另一个终点。

E2E必须要时间同步包sync(如果是两步则也包括follow_up)同时参与。它的计算也很简单,master在t1时刻发送sync给slave,slave收到的时候是t2,slave知道了t1和t2,则有

t2-t1=D+offset

slave在t3时刻发送Delay_Req给master,master收到的时候是t4,然后master把这个时间t4填充到Delay_Resp里再发回给slave,slave知道了t4和t3,则有

t4-t3=D+(-offset)

所以t4-t3+t2-t1=2D,从而消掉了offset,只需再除以2就可以算出D的时间。

或者由上图看,t-ms是master发送到slave的路径延迟,t-sm是slave发送到master的路径延迟。我们用t4-t1-(t3-t2)可以算出t-ms+t-sm的值,当t-ms=t-sm时,D=t-ms=t-sm,所以只需要把结果再除以2就可以了。这里很关键的前提条件是,从master->slave和slave->master的路径延迟相同!其实正常情况下并不相同,但是这里我们为了计算D,把它们看作是相同的。

2.2 P2P

P2P的意思是Peer to Peer,它意思是端到端。请注意上图,两边的设备不再是master和slave,也就是说对于无论是master还是slave都可以主动发送第一条Pdelay-Req消息,从而开启一次测量流程,这点和E2E不同,E2E里我们知道,最后所有的时间只有slave知道,所以只有slave可以计算出路径延迟D。还有一点不同是,仅仅用P2P计算路径延迟D不需要sync包参与,所以当计算完路径延迟D后,再进行时间同步时还需要发送sync包。

实际的计算过程则大同小异,从上图上看,计算无非是:

D=(t4-t1-(t3-t2))/2

当然也可以理解为t4-t3=D+(-offset),t2-t1=D+offset,再去消掉offset计算。

2.3 E2E-TC

其实只单单看E2E和P2P感觉并没有什么不同,所以当然会有感而发,为何有了E2E还需要P2P?

待续...

3. 频率同步

频率同步既可以是单步也可以是两步,对于单步的情况来说,假如15:00的时候B给A发送了sync包,15:10的时候又发送了一个sync包,理论上来说,假如B和A的时间走的一样快,那么A收到两个sync包的时间间隔也是10分钟!路径延迟和两个设备之间的时钟偏差并不影响这个间隔。如果不能理解就再做一个假设,A收到第一个包的时间是15:40,路径延迟是30分钟,那么我们知道A和B时钟偏差是10分钟,算上这个偏差,第二个包里面的时间是15:10,那么A可以计算出来,如果频率没有偏差,收到第二个包的时间应该是15:50!但是假如A收到第二个包的时候它自己的时间是16:00,它就知道了B发送两个包的间隔是10分钟,而自己收到两个包的时间分别是15:40和16:00,间隔20分钟,所以A的时钟比B快一倍!知道这个之后,我们只需要把A的时钟调慢一倍即可,注意不是直接把时钟当前时间减去10分钟,那再过10分钟A又比B快10分钟了,而是把A原来走2秒的时间调成只算做1秒!

附一些PTP相关资料:

1588v2报文格式

linuxptp项目

linuxptp项目github仓库

linuxptp中ptp4l使用手册

瑞萨关于linux对PTP硬件时间戳支持介绍

https://www.elinux.org/images/f/f9/Introduction_to_IEEE_1588_Precision_Time_Protocol_(PTP)_Using_Embedded_Linux_Systems.pdf

https://blog.csdn.net/weixin_43408952/article/details/125009747

https://blog.csdn.net/yaojiawan/article/details/124601694

https://blog.csdn.net/yanceylu/article/details/116085860

新华三PTP介绍

华为PTP介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74744.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BIM小技巧丨关于如何在Revit明细表中显示门窗面积

在明细表中显示门窗面积(以门明细表为例)在新建一个门明细表后,可以发现在Revit中不能直接使用明细表统计门窗面积。 这时,可以通过使用添加“计算值”的方式来处理,得到如下图所示,两种不同的面积统计结果: 除此之外&…

前端基础之CSS扫盲

文章目录一. CSS基本规范1. 基本语法格式2. 在HTML引入CSS3. 选择器分类二. CSS常用属性1. 文本属性2. 文本格式3. 背景属性4. 圆角矩形和圆5. 元素的显示模式6. CSS盒子模型7. 弹性布局光使用HTML来写一个前端页面的话其实只是写了一个大体的框架, 整体的页面并不工整美观, 而…

ledcode【用队列实现栈】

目录 题目描述: 解析题目 代码解析 1.封装一个队列 1.2封装带两个队列的结构体 1.3封装指向队列的结构体 1.4入栈函数实现 1.5出栈函数实现 1.6取栈顶数据 1.7判空函数实现 题目描述: 解析题目 这个题我是用c语言写的,所以队列的pu…

JavaSE-3 Java运行原理

一、Java的运行过程 🍎Java程序运行时,必须经过编译和运行两个步骤。 首先将后缀名为.java的源文件进行编译,最终生成后缀名为.class的字节码文件。然后Java虚拟机将字节码文件进行解释执行,并将结果显示出来。具体过程如下图所示。 🍉Java程序的运行过…

【Python数据挖掘入门】2.2文本分析-中文分词(jieba库cut方法/自定义词典load_userdict/语料库分词)

中文分词就是将一个汉字序列切分成一个一个单独的词。例如: 另外还有停用词的概念,停用词是指在数据处理时,需要过滤掉的某些字或词。 一、jieba库 安装过程见:https://blog.csdn.net/momomuabc/article/details/128198306 ji…

数字IC手撕代码--小米科技(除法器设计)

前言: 本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。目录如下:1.数字IC手撕代码-分频器(任意偶数分频)2.数字IC手撕…

原始GAN-pytorch-生成MNIST数据集(代码)

文章目录原始GAN生成MNIST数据集1. Data loading and preparing2. Dataset and Model parameter3. Result save path4. Model define6. Training7. predict原始GAN生成MNIST数据集 原理很简单,可以参考原理部分原始GAN-pytorch-生成MNIST数据集(原理&am…

记一次线上es慢查询导致的服务不可用

现象 某日线上业务同学反馈订单列表查询页面一直loding,然后提示请求超时,几分钟之后恢复正常 接到报障之后,马上根据接口URL,定位到了请求链路,发现是es查询超时,这里我们的业务订单表数据是由几百万的&a…

如何基于MLServer构建Python机器学习服务

文章目录前言一、数据集二、训练 Scikit-learn 模型三、基于MLSever构建Scikit-learn服务四、测试模型五、训练 XGBoost 模型六、服务多个模型七、测试多个模型的准确性总结参考前言 在过去我们训练模型,往往通过编写flask代码或者容器化我们的模型并在docker中运行…

Python学习笔记202302

1、numpy.empty 作用:根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化。 用法:numpy.empty(shape, dtypefloat, order‘C’) 2、logging.debug 作用:Python 的日志记录工具,这个模块为应用与库实现了灵…

C# Sqlite数据库加密

sqlite官方的数据库加密是收费的,而且比较贵。 幸亏微软提供了一种免费的方法。 1 sqlite加密demo 这里我做了一个小的demo演示如下: 在界面中拖入数据库名、密码、以及保存的路径 比如我选择保存路径桌面的sqlite目录,数据库名guigutool…

Verilog 学习第五节(串口接收部分)

小梅哥串口部分学习part2 串口通信接收原理串口通信接收程序设计与调试巧用位操作优化串口接收逻辑设计串口接收模块的项目应用案例串口通信接收原理 在采样的时候没有必要一直判断一个clk内全部都是高/低电平,如果采用直接对中间点进行判断的话,很有可能…

Linux 红帽9.0 本地源 与 网络源 搭建

本次我们使用的是 redhat 9.0 版本,是redhat 的最新版本,我们一起来对其进行 本地仓库 和 网络仓库的搭建部署~!!关于 本地仓库( 本地源 ),和 网络仓库 ( 网络源 )&#…

ESP32蓝牙配网

注意********menuconfig 配置(必须打开蓝牙我这是C2所以使用NimBLE )可以直接从demo的配置文件拷贝 Component config ---> Bluetooth ---> NimBLE - BLE only Component config ---> Bluetooth ---> NimBLE Options ---> Enable blufi…

计算结构体大小

计算结构体大小 目录计算结构体大小一. 结构体内存对齐1. 简介2. 嵌套结构体二. offsetof三. 内存对齐的意义四. 修改默认对齐数一. 结构体内存对齐 以字节(bety)为单位 1. 简介 对于结构体成员在内存里的存储,存在结构体的对齐规则&#…

Vue下载安装步骤的详细教程(亲测有效) 1

目录 一、【准备工作】nodejs下载安装(npm环境) 1 下载安装nodejs 2 查看环境变量是否添加成功 3、验证是否安装成功 4、修改模块下载位置 (1)查看npm默认存放位置 (2)在 nodejs 安装目录下,创建 “node_global…

Java查漏补缺(14)数据结构剖析、一维数组、链表、栈、队列、树与二叉树、List接口分析、Map接口分析、Set接口分析、HashMap的相关问题

Java查漏补缺(14)数据结构剖析、一维数组、链表、栈、队列、树与二叉树、List接口分析、Map接口分析、Set接口分析、HashMap的相关问题本章专题与脉络1. 数据结构剖析1.1 研究对象一:数据间逻辑关系1.2 研究对象二:数据的存储结构…

Laravel框架04:视图与CSRF攻击

Laravel框架04:视图与CSRF攻击一、视图概述二、变量分配与展示三、模板中直接使用函数四、循环与分支语法标签五、模板继承、包含1. 继承2. 包含六、外部静态文件引入七、CSRF攻击概述八、从CSRF验证中排除例外路由一、视图概述 视图存放在 resources/views 目录下…

MyBatis学习笔记(七) —— 特殊SQL的执行

7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式: 方式1:select * from t_user where username like ‘%${mohu}%’ 方式2:select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3:select * from t_u…

收集分享一些AI工具第三期(网站篇)

感谢大家对于内容的喜欢,目前已经来到了AI工具分享的最后一期了,目前为止大部分好用的AI工具都已经介绍给大家了,希望大家可以喜欢。 image-to-sound-fx (https://huggingface.co/spaces/fffiloni/image-to-sound-fx) 图片转换为相对应的声音…