PTPd2的相关介绍及其使用

        PTPd 是 PTP 的纯软件实现,其最早是由美国Case Western Reserve University 的2名工程专业学生历时6个月所开发,PTPd 现在由全球最大的开源软件开发平台 SourceForge 进行更新和维护。目前 PTPd 有2个 版 本,PTPd1支持IEEE 1588V1,PTPd2支持IEEE 1588V2,下图所示为 PTPd 的功能部件联系图,主要由7 个部分组成,分别是协议引擎、报文处理、网络层实现、时间戳获取、时钟伺服模块、定时器以及 BMC算法。


  • 目录

一、PTPd 各功能部件

二、PTPD系统设计

1.获取时间戳的方式及改进

2. 时钟伺服单元

3.影响时钟同步精度的因素分析

三、ptpd2的实现

1.安装

2.使用


一、PTPd 各功能部件

  1. PTPd 协议引擎。主要运行 PTP 状态机,由protocol.c 实现,完成协议端口状态之间的正确转换,核心函数是 protocol( ) ,运行在一个永久循环中,一般由外部中断或产生错误终止循环。
  2. 报文 理。文件 msg.c 详细定义了函数msgPack( ) 和 msgUnpack( ) ,msgPack( ) 用于封装由于定时器超时而要发送的报文信息,msgUnpack( )则解析端口接收到的报文信息。
  3. 网络层实现。文件 net.c 实现报文的网络传输,由 findIface ( ) 函数识别端口硬件地址和 IP 地址,netSelect( ) 检查是否在网络上接收到数据,并且所有报文基于 UDP 传输,根据不同的 UDP 端口号发送和接收报文。
  4. 时间戳获取。精确时间戳在内核中产生,由 net. c 中的 recvmsg ( ) 函数获取,精 度 在 纳秒级。
  5. 时钟伺服模块。文件 servo.c 是同步系统的核心,主要功能是计算主-从时钟偏差和链路延迟并且更新本地时钟。
  6. 定时器。由 timer.c 实现,主要功能是定义定时器中断时间,根据报文类型设置定时间隔,并依据定时器是否超时实时更新定时器。
  7. BMC 算法。文件 bmc.c 详述了最佳主时钟算法,依据状态决策算法结果返回各端口应有状态,仅适用于普通时钟。

二、PTPD系统设计

1.获取时间戳的方式及改进

        获取精确时间戳是进行时钟同步的关键一步,如下图所示,可在A、B、C 3个位置获取时间戳。

       NTP 在 C 点即应用层获取时间戳,精度最低;PTP 可在 B 点或 A 点获取时间戳,B 点即网络驱动层,同步精度比 NTP 高; A 点是在 MII 接口处获取,同步精度最高,达亚微秒级,但是需要硬件辅助。因为报文从 C 点传输到 A 点会受协议栈的延时和抖动的影响,所以越靠近物理层获取时间戳,同步精度越高。PTPd 是在 B 点获取时间戳,要获取报文到达网络驱动层的时间戳,需 要 先 设 置内 核 中 socket 选项为 SO_TIMESTAMP,但 SO_TIMESTAMP选项返回微秒级精度,而 SO_TIMESTAMPNS 选项返回纳秒级精度,因此,首先采用 SO_TIMESTAMPNS选项,然后用 recvmsg( ) 函数接收网络报文,报文到达网络驱动层的 时间戳被存储为 SCM _TIMESTAMPNS 类 型 的 附 属 数 据,使 用 CMSG _FIRTHDR( ) 和 CMSG _NXTHDR( ) 宏遍历附属数据,其中匹配 SCM _TIMESTAMPNS 类型的数据即为时间戳,最后通过 timespec 结构体存储此时间戳。PTPd 在 B 点获取时间戳可避免报文从 C 点传输到 B 点受协议栈延迟和抖动的影响,因此,时钟同步精度较高,然而报文从 B 点传输到 MAC 层也会受到协议栈延时和抖动的影响,若分别在主-从时钟中补偿报文从 B 点传输到 A 点的时间则能提高同步精度。本文定义出边界时间为报文从网络驱动层传输到 MAC 层所经历的时间,则计算出边界时间的步骤如下:

        步骤 1 主时钟首先组播 Sync 报文 Sj,报文 Sj到达主时钟 MAC 层的时间为 Tmac _Sj,随后组播Follow_Up 报文,Follow_Up 报文记录了报文 Sj到达主时钟的网络驱动层的精确时间 Tip_Sj。

        步骤 2 在主时钟中用 Wireshark 抓包软件捕获报文 Sj,提取 Tmac_Sj,如图所示。  

         步骤 3 在主时钟中用 Wireshark 抓包软件捕获跟随报文 Sj的 Follow _Up 报文,提取 Tip _Sj,如图所示。

        步骤 4 通过下式计算主时钟的出边界时间:Δt1 :Δt1 =nj = 1( Tmac_Sj-Tip_Sj) /n ( 5)其中,n 为报文数

         步骤 5 从时钟按照上述相同方式计算从时钟的出边界时间Δt2。根据上述方法分别计算出主-从时钟的出边界时间Δt1和Δt2,主时钟发送 Sync 报文,将主时钟的出边界时间Δt1补偿到 Sync 报文到达主时钟的网络驱动层的时间,所述同步原理的 t1中,t1 =t1 + Δt1,并将补偿后的时间 t1 装入 Follow _Up 报文的 preciseOriginTimestamp 字段中发送给从时钟; 从时钟发送 Delay_Req 报文,将从时钟的出边界时间Δt2补偿到 Delay_Req 报文到达从时钟的网络驱动层的时间,同步原理的 t3中,t3 = t3 + Δt2,并将补偿后的时间 t3保存在从时钟中。最后从时钟根据获取的时钟信息 t1 ~ t4进行时钟同步。本文方法补偿主-从时钟的出边界时间,达到接近 A 点获取时间戳的效果,因此,相比在 B 点获取时间戳的时钟同步精度更高。此外,采用 gettimeofday( ) 来获取系统时间,并补偿内核获取该函数的时间来提高同步精度,但并不适用于本文系统。在 Windows系统上实现 PTP 也仅能达到亚毫秒级,由于 clock_gettime( ) 和 clock_settime( ) 函数返回纳秒级精度,因此本文系统采用该函数来获取设定系统时间,可进一步提高时钟同步精度。

2. 时钟伺服单元

        下图所示为 PTPd 系统的时钟伺服单元,该单元主要由无限冲击响应( Infinite Impulse Response,IIR)滤波器、有限冲击响应( Finite Impulse Response,FIR)滤波器以及比例积分( Proportional Integral,PI) 控制器组成。

        该单元的作用是由从时钟根据IEEE 1588 同步原理计算的主-从时钟偏差 offset 和链路延 迟 delay 校正本地时钟。采用单元尔曼滤波 算法对时钟偏差、时钟漂移变化率进行估计,并根据 估计值修正从时钟,但算法较复杂,不易实现。本文 分别利用 FIR 和 IIR 滤波器过滤主-从时钟偏差和链 路延迟以减小报文传输延时抖动产生的误差,并使 用 PI 控制器计算从时钟相对于主时钟的频率补偿 值,从而补偿系统时钟频率,比例积分控制器的 Drifft 与 adj 如下: 

         其中,I 为积分系数,Xi为第 i 个同步周期的主-从时 钟偏差值,P 为比例系数,Drifft 为 m 个同步周期的 时钟偏差累积值,adj 为第 m 个同步周期计算的频率 补偿值。最终从时钟根据式( 6) 、式( 7) 计算出 adj 并调用系统内核函数 adjtimex ( ) 补偿系统频率,实现从时钟与主时钟的时钟频率一致。

3.影响时钟同步精度的因素分析

影响时钟同步精度的因素分析如下:

1) 获取时间戳的位置:在一般情况下,各时钟设备的通信报文甚至同 一种报文从应用层到物理层经历的时间各不相同, 其主要受操作系统和协议栈的延时及抖动的影响,因此,在最靠近物理层的位置获取时间戳,时钟同步 精度最高。本文在无硬件支持的条件下,尽量补偿 主-从时钟的出边界时间,最终提高同步精度。

2) 时钟晶振的不稳定性主-从时钟的时钟晶振不可能保持完全一致,因 此,从时钟需要不断地进行频率补偿来与主时钟同 步,在时钟同步系统中,选择晶振稳定可靠的时钟以 及进行频率补偿至关重要。

 3) 链路延迟的不对称性 如同步原理假定链路延迟是对称 的,而实际链路延迟是不对称的。采用加 权平均求链路延迟来减小不对称,但对本文系统效 果不明显,而且网络中间设备如路由器、交换机等会 加大链路的不对称性,因此,可以考虑使用边界时钟 和透明时钟降低链路不对称性。

4) 同步周期 同步周期越短,说明主从时钟越频繁地进行时 钟同步,但同时也会占用更多的网络带宽,因此,同    步周期并非越短越好,应视网络情况而定。 

三、ptpd2的实现

1.安装

  • yum install autoconf
  • yum install sutotools-dev-m4-autoconf2.13 autoconf-archive-gnu-standards autoconf-doc libtool
  • cd /ptpd-master
  • autoreconf –vi
  • ./configure
  • make
  • make install

2.使用

需要在多台设备上同时运行ptpd2,而且关闭本地的网络时间同步功能。多台设备间会选举出一个master设备,其他设备同步master设备上的时间戳
运行命令:

  • ./ptpd2 -C -m -i 网卡

效果如下:
master:

# ./ptpd2 -C -m -i enp0s9

2019-11-05 15:51:27.209776 ptpd2[28013].startup (notice)    (___) PTPd version 2.3.2 starting

2019-11-05 15:51:27.210028 ptpd2[28013].startup (info)      (___) Starting ptpd2 daemon with parameters:      ./ptpd2 -C -m -i enp0s9

2019-11-05 15:51:27.210137 ptpd2[28013].startup (info)      (___) Checking configuration

2019-11-05 15:51:27.211055 ptpd2[28013].startup (info)      (___) Configuration OK

2019-11-05 15:51:27.211625 ptpd2[28013].startup (info)      (___) Successfully acquired lock on /var/run/ptpd2.lock

2019-11-05 15:51:27.211830 ptpd2[28013].startup (notice)    (___) PTPd started successfully on enp0s9 using "masterslave" preset (PID 28013)

2019-11-05 15:51:27.211901 ptpd2[28013].startup (info)      (___) TimingService.PTP0: PTP service init

2019-11-05 15:51:27.212993 ptpd2[28013].enp0s9 (info)      (init) Observed_drift loaded from kernel: 0 ppb

2019-11-05 15:51:27.330706 ptpd2[28013].enp0s9 (notice)    (lstn_init) Now in state: PTP_LISTENING

2019-11-05 15:51:37.212943 ptpd2[28013].enp0s9 (notice)    (lstn_init) TimingService.PTP0: elected best TimingService

2019-11-05 15:51:37.213050 ptpd2[28013].enp0s9 (info)      (lstn_init) TimingService.PTP0: acquired clock control

2019-11-05 15:51:39.330991 ptpd2[28013].enp0s9 (notice)    (mst) Now in state: PTP_MASTER, Best master: 080027fffe9b75e6(unknown)/1 (self)

slave:

# ./ptpd2 -C -m -i wlan0

2019-11-05 15:27:51.786437 ptpd2[14978].startup (notice)    (___) PTPd version 2.3.2 starting

2019-11-05 15:27:51.791273 ptpd2[14978].startup (info)      (___) Starting ptpd2 daemon with parameters:      ./ptpd2 -C -m -i wlan0

2019-11-05 15:27:51.792204 ptpd2[14978].startup (info)      (___) Checking configuration

2019-11-05 15:27:51.805501 ptpd2[14978].startup (info)      (___) Configuration OK

2019-11-05 15:27:51.813856 ptpd2[14978].startup (info)      (___) Successfully acquired lock on /var/run/ptpd2.lock

2019-11-05 15:27:51.823630 ptpd2[14978].startup (notice)    (___) PTPd started successfully on wlan0 using "masterslave" preset (PID 14978)

2019-11-05 15:27:51.830361 ptpd2[14978].startup (info)      (___) TimingService.PTP0: PTP service init

2019-11-05 15:27:51.841379 ptpd2[14978].wlan0 (info)      (init) Observed_drift

2019-11-05 15:28:01.838939 ptpd2[14978].wlan0 (info)      (slv) TimingService.PTP0: acquired clock control

2019-11-05 15:31:05.146610 ptpd2[14978].wlan0 (notice)    (mst) Now in state: PTP_MASTER, Best master: 68572dfffe180489(unknown)/1 (self)

2019-11-05 15:31:07.064538 ptpd2[14978].wlan0 (info)      (mst) New best master selected: 080027fffe9b75e6(unknown)/1

2019-11-05 15:31:07.065183 ptpd2[14978].wlan0 (notice)    (slv) Now in state: PTP_SLAVE, Best master: 080027fffe9b75e6(unknown)/1 (IPv4:192.168.0.123)

2019-11-05 15:31:08.083974 ptpd2[14978].wlan0 (notice)    (slv) Received first Sync from Master

2019-11-05 15:59:56.188955 ptpd2[14978].wlan0 (notice)    (slv) Received first Delay Response from Master

2019-11-05 16:00:08.293429 ptpd2[14978].wlan0 (notice)    (slv) Servo: Going to slew the clock with the maximum frequency adjustment

猜你喜欢

转载自blog.csdn.net/qq_40772383/article/details/120194847