一、介绍
1.1 ntp 介绍
NTP(Network Time Protocol,网络时间协议)是一种用于在计算机网络中同步时钟的协议,旨在确保网络中所有计算机和设备具有相同的准确时间。
NTP 可以达到以下精度:
在局域网 (LAN) 环境中,NTP 可以达到毫秒级别(通常能够实现1毫秒内)甚至亚毫秒级别的精度。
在广域网 (WAN) 环境中,NTP 的精度通常在几毫秒到几十毫秒之间,取决于网络条件。
官方历史版本和协议规范:
-
NTPv0:
- 最初的 NTP 版本,虽然详细文档不如后续版本那么易于获取,但该版本标志着 NTP 的开端。
-
NTPv1:
- 文档: RFC 958(1985年)
- 描述了早期的 NTP 协议,包括其基本结构和操作。
-
NTPv2:
- 文档: RFC 1059(1988年)
- 引入了更详细的报头格式和错误检测机制,增强了协议的健壮性。
-
NTPv3:
- 文档: RFC 1305(1992年)
- 增加了广播模式和多播模式,支持了对称和非对称的通信方式,增强了安全性。引入了许多现代化特性,如对原子钟和 GPS 的支持。
-
NTPv4:
- 文档: RFC 5905(2010年)
- 目前广泛使用的版本,支持 64 位时间戳,提供了增强的安全性、灵活性和更好的时间同步精度。NTPv4 规范包括了加密和认证功能,并对时间同步的稳定性和性能进行了优化。
1.2 sntp和 ntp
SNTP(Simple Network Time Protocol,简单网络时间协议)是 NTP(Network Time Protocol,网络时间协议)的一个简化版本。它设计用于那些不需要 NTP 所有复杂功能和精度的环境。
NTP(Network Time Protocol)和 SNTP(Simple Network Time Protocol)的精度差异主要取决于它们的设计和实现。以下是一些关于两者精度的关键点:
NTP 精度
-
高精度:NTP 设计用于提供高精度的时间同步,通常可以达到毫秒级别甚至更高的精度。它通过精细的算法来处理网络延迟和时间漂移,能够在不同的网络条件下保持准确性。
-
网络延迟补偿:NTP 采用复杂的算法来补偿网络延迟和抖动,包括使用时间戳来测量延迟,并通过时间戳来计算精确的时钟漂移。
-
服务器选择:NTP 客户端可以从多个时间源选择最优的服务器,以提高同步的准确性和可靠性。
-
实测精度:在理想环境下,NTP 可以达到亚秒级别的精度。在网络条件良好的情况下,甚至可以达到毫秒级别的精度。
SNTP 精度
-
较低精度:SNTP 比 NTP 简化了很多复杂的功能,因此通常提供较低的精度。SNTP 主要用于那些对精度要求不高的场景,通常在毫秒级别以下。
-
网络延迟补偿:SNTP 不进行复杂的网络延迟补偿,而是直接从一个时间服务器获取时间,因此其精度受到网络延迟变化的影响较大。
-
单一时间源:SNTP 通常使用单一的时间服务器,没有 NTP 的时间源选择机制,这可能会影响同步精度,特别是在网络条件不稳定的情况下。
-
实测精度:SNTP 的精度通常比 NTP 差,可能在几十毫秒到几秒之间,具体取决于网络环境和服务器的稳定性。
总结:
-
NTP 提供了高精度的时间同步,能够在各种网络条件下保持较高的准确性。它适用于对时间精度有较高要求的应用。
-
SNTP 精度较低,适用于对时间精度要求不高的场景。其同步精度受限于网络延迟和简单的时间同步机制。
如果需要非常精确的时间同步,NTP 是更好的选择。如果时间同步精度要求较低,且希望简化实现,SNTP 可以满足需求。
1.3 ntp 校时原理
- 六千字详细图解网络时间协议(NTP),带你领略NTP的魅力!
- 时间同步协议NTP - 原理&实践
- NTP的工作模式
- 使用NTP协议获取网络时间戳(C/C++实现)
- 影响因素:路由层级、网络波动
- 端口:UDP协议的端口123
NTP 协议的基本工作原理:
-
时间服务器体系结构:
NTP 使用一种分层的时间服务器体系结构来实现时间同步。这些服务器被分为多个层级(stratum),最高层级(stratum 1)通常使用原子钟或GPS设备作为时间源,较低层级(stratum 2、stratum 3等)的服务器通过网络与更高层级的服务器同步。 -
时钟同步过程:
- 时钟选择:客户端选择最优的时间服务器进行同步,考虑服务器的可用性、延迟和精度。
- 时钟调整:客户端使用时钟漂移和网络延迟等信息,调整本地时钟。
- 时钟稳定:通过周期性的同步和调整,保持本地时钟与远程服务器的同步性和精确性。
-
安全性增强:
最新版本的 NTP 提供了加密通信和身份验证功能,确保时间源的真实性和数据完整性,防止恶意攻击和篡改。
二、Linux C/C++ ntp 选型
2.1 实现方案
-
方案一:使用库,C/C++ 主进程通过调用库API完成校时
-
方案二:使用管理进程,C/C++ 主进程通过管理ntp校时后台进程 (配置文件 + 控制启停)
- ntpd:https://www.ntp.org/
- chronyd 和 chronyc : https://chrony-project.org/index.html
- ntpclient
- openntpd-6.2p3 (portable)
2.2 选型依据
- NTP实现比较:ntp、chrony、openntpd
- 校时精度:越高越好
- 易用性:是不是简单易用
- 流行度:
- 常见Linux 发行版默认使用的校时工具:Centos、Debian、Ubuntu
- CentOS:之前是ntpd,CentOS 7及以后版本使用Chrony。
- Debian 默认使用 systemd-timesyncd 来进行时钟同步。systemd-timesyncd 是 systemd 的一部分,提供简单的网络时间协议(NTP)客户端功能,用于自动校时。
- Ubuntu 也使用 systemd-timesyncd 作为默认的校时工具,与Debian类似。
目前Linux中最常用的校时工具:
- systemd-timesyncd:由于其与systemd的集成和轻量级特性,systemd-timesyncd已成为许多现代Linux发行版的默认选择,特别是在桌面和通用用途的发行版中。
- Chrony:以其高精度和良好的网络条件适应性而受到青睐,常用于服务器和企业级环境。
- ntpd:作为传统的NTP守护进程,仍然在一些系统中使用,尤其是在一些老旧或特定的环境。
2.3 选型结论(chrony)
选择chrony 理由
- 相对 ntpd 更轻量,同时配置简单
- 同时支持 ntpclient 和 ntpserver
- 支持更高精度 ntp 校时(chrony和ntpd 相对 sntp 校时精度更高)
- 支持 GPS 校时(需要搭配gpsd使用)
- 支持 PPS 信号处理(GPS + PPS 实现高精度校时)
2.4 选型范围
- 范围:Other NTP and SNTP implementations
- ntpd:https://www.ntp.org/
- chrony : https://chrony-project.org/index.html
- openntpd-6.2p3 (portable)
- sntp 库:V3使用,svn opensource 归档的库 (sntp 精度不够高)
- ntpclient:V2使用(很小很简单的一个)
2.4.1 ntpd 更新记录
三、chrony 使用
3.1 编译/交叉编译
- 源码下载:https://chrony-project.org/download.html
- 配置PPS:默认缺少 <timepps.h> 文件,可下载 pps-tools 源码,将该文件拷贝进来
- https://github.com/redlab-i/pps-tools
- https://gitee.com/mirrors/pps-tools
Checking for <sys/timepps.h> : No Checking for <timepps.h> : No
-
配置编译选项
# 配置本机编译 make distclean ./configure --prefix=$PWD/install_x64 make -j && make install
配置交叉编译:
make distclean export CC="arm-fslc-linux-gnueabi-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-x11/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" export CXX="arm-fslc-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-x11/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" export CPPFLAGS="-I. " ./configure --prefix=$PWD/install_imx6q make -j
-
编译
- 会生成 config.h 文件:使能开关、默认配置路径
#define LINUX 1 #define DEBUG 0 #define FEAT_CMDMON 1 #define FEAT_NTP 1 #define FEAT_REFCLOCK 1 #define HAVE_IN_PKTINFO 1 #define FEAT_IPV6 1 #define _GNU_SOURCE 1 #define HAVE_IN6_PKTINFO 1 #define HAVE_CLOCK_GETTIME 1