十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

内网时间同步必读:NTP与SNTP原理、chrony配置与避坑指南

内网时间同步必读:NTP与SNTP原理、chrony配置与避坑指南 简介NTP/SNTP时钟协议原理PPT课件面向网络工程师、运维人员及计算机网络学习者系统讲解NTP/SNTP的发展背景、分层时钟模型与时间同步机制。NTP由David L. Mills教授于1985年提出基于UDP 123端口交换时间戳通过T1~T4四个时间点计算网络时延与时钟偏差SNTP作为简化版本保留核心同步功能在降低复杂度的同时与NTP保持兼容。课件共1个PPT文件压缩包约643KB内容涵盖协议概述、工作原理图解、报文格式关键字段说明如LI、Stratum、Poll、Precision等、时间滤波/选择/聚类与时钟调节四大算法、服务器/客户端、对等体、广播、组播四种工作模式以及本地部署SNTP服务器、多服务器冗余等应用建议并附有与IEEE 1588的对比分析便于按章节快速查阅。目前已有204人学习下载适合希望系统梳理NTP/SNTP原理、掌握网络设备时间同步配置与排障思路的读者。1. NTP_SNTP时钟协议原理这个词说穿了就是内网时间对齐这一件事NTP_SNTP时钟协议原理落到工程里就一句话让网络里每台设备在同一个瞬间看到同一个时间。你在生产环境查过日志会懂——A机日志停在14:02B机已经跳到14:05两台机器上的进程各说各话故障定位靠猜证书校验和数据库主从复制直接翻车。这篇文章把NTP和SNTP的原理拆开讲透从分层架构、时间戳算法到chrony和w32time的实际落地配置再附上我这些年踩过的五个坑。适合正在搭内网基础服务的运维、以及写网络管理工具的开发。判断自己用不用得上就一句话只要你的环境里有两台以上需要对齐时间的设备就值得看完。2. NTP的分层与时间戳偏移量怎么算、轮询间隔是怎么变的网络上讨论NTP的文章不少但多数停在安装chrony、改配置文件、重启服务三步。真正决定时间同步质量的是分层设计、时间戳算法和轮询机制这三件事。把它们搞明白后面遇到同步不准、跳变、越对越偏这一类问题才能不看玄学看数据。2.1 Stratum 0 到 15为什么时间同步要做成分层的NTP协议把时间源分成层级用Stratum表示。Stratum 0是原子钟、GPS接收机这类物理时间源它们不直接对外提供NTP服务Stratum 1是直接连接Stratum 0的服务器比如各大公共NTP池的一级节点Stratum 2从Stratum 1同步以此类推最高到Stratum 1516就表示不可用了。这样设计有两个直接原因。第一是控制上游连接数如果内网五百台设备全部直连公共时间源一是公网带宽浪费二是时间源端的并发压力大风控策略可能直接把你拉黑。常见做法是内网放一到两台NTP服务器做汇聚它们自己向上游同步其余设备只问这两台要时间。第二是形成信任链每往下走一层Stratum值加一客户端通过这个值判断时间源的距离在多个上游源之间做优先级选择。工程里一个容易踩的误区是Stratum值越小时间越准。实际上Stratum只表示层次距离不直接代表精度。一台Stratum 2的内网服务器如果走千兆专线同步链路的毫秒级抖动远小于一台Stratum 1但经过跨公网拥塞链路的时间源。选上游源的时候优先看网络质量其次才是层级数字。2.2 四个时间戳与偏移量公式你不需要读RFC但要会算这一条NTP报文里带四个时间戳理解了这个计算过程你就能判断客户端显示的offset是从哪来的T1客户端发出请求报文时的本地时间T2服务器收到请求报文时的本地时间T3服务器发出响应报文时的本地时间T4客户端收到响应报文时的本地时间偏移量的计算公式是offset ((T2 - T1) (T3 - T4)) / 2往返时延是delay (T4 - T1) - (T3 - T2)举一组具体数字T11000T21010T31012T41030。代入偏移量公式((10) (-18)) / 2 -4意思是客户端本地时间比服务器慢了4个时间单位需要往前调。时延则是30 - 2 28个时间单位。这个公式成立的前提是网络路径对称也就是请求从客户端到服务器、响应从服务器回客户端这两条链路时延大致相等。局域网和专网通常满足但跨运营商、走卫星链路或者经过拥塞的出口带宽时上行和下行延迟可能差出几十毫秒算出来的offset就是歪的而且这个误差没法在客户端侧消除。所以要求高精度的场景服务器和客户端要尽量放在同一个网络域内。2.3 轮询间隔与滤波为什么几分钟对时一次是个不准确的说法NTP的轮询间隔不是固定值它会根据网络状况动态调整。你要搜linux ntp 几分钟对时一次大概率是拿ntpq看输出发现间隔不是均匀的。默认情况下客户端以64秒为起点轮询如果网络质量好、服务器响应稳定轮询间隔会逐步加大上限是1024秒大约17分钟。反过来如果链路抖动厉害或者丢包间隔会回退到较小的值。这里有个反直觉的点网络越差客户端反而越频繁地发起请求因为它需要用更多样本去过滤掉噪声。客户端拿到每次的offset和delay之后不会拿单次结果直接改时间而是积累一批样本丢掉那些时延明显偏高即离群值用剩下的样本做统计滤波再决定是微调还是大跳。这就是为什么刚配好NTP的时候前几分钟的输出看起来抖动很大过一阵子才稳定下来。盯着第一次输出判断配置对错是最常见的误操作之一。3. SNTP和NTP怎么取舍协议差异、精度预期与三种组网形态NTP和SNTP两个词经常一起出现很多设备手册里写的是支持SNTP而不是NTP。搞清楚两者的差异你才知道一个摄像头、一块无线AP、一台数据库服务器各自的场景该用哪个以及为什么有的场景用SNTP够用有的场景必须上全量NTP。3.1 SNTP是什么位置客户端轻量化实现SNTP全称Simple Network Time Protocol是NTP协议族里的一个轻量子集。它的定位很直接大部分设备其实不需要完整的NTP服务端能力只需要一个能发请求、收响应、算时间的客户端。SNTP客户端只向一台服务器发请求拿到结果后直接做时间调整不做多服务器选优、不做鉴权、不做复杂的滤波统计。常见用SNTP的是嵌入式设备、网络摄像头、无线AP、门禁控制器这类计算资源和存储空间有限的终端。它们对时间精度的要求通常只在秒级几十毫秒的偏差不影响使用。你在这些设备里往往找不到chrony或者ntpd这种完整实现固件里嵌入一个SNTP客户端就够了。3.2 协议差异的关键词服务器选择、精度与鉴权NTP和SNTP的本质区别不在报文格式——SNTP报文是兼容NTP的而在于客户端行为和健壮性。下表列出我在项目里做选型时关心的几个维度。维度NTPSNTP服务器选择同时向多个服务器请求算法选优只问一台服务器滤波处理多样本统计滤波丢弃离群值单次结果直接用鉴权支持支持对称密钥、用NTS加密一般不支持典型精度局域网内毫秒级局域网内几十毫秒级常见载体服务器、网络设备、Linux主机摄像头、嵌入式传感器、AP表格里最关键的一行是服务器选择。NTP客户端会同时向多台上游发起请求然后比较它们的Stratum、时延和抖动选一台最优的作为时间源SNTP则没有这个能力它把宝全押在一台服务器上。放在稳定的局域网里两者差别不大一旦跨公网或者上游设备抖动SNTP就露馅了。做选型的时候判断标准就一条你的业务能容忍多大的时间偏差以及网络环境稳不稳。3.3 三种典型组网形态从内网汇聚到无线前传我做过的时间同步项目组网形态基本逃不出下面三种。第一种内网汇聚型。内网放一台或两台NTP服务器它们向上游同步内网其他设备全部指向这两台服务器。这是企业园区网、IDC机房最常用的做法优点是把上游连接数收敛到个位数内网设备的同步源可控。上游断了内网还能靠本地时间源撑一阵子。第二种承载网/无线前传型。像5G前传这类场景对主从参考时钟的频差要求远高于NTP能提供的精度甚至要高两到三个数量级。这类网络里NTP/SNTP只是管理面的时间同步手段数据面的高精度同步走的是同步以太网或1588v2。如果项目里有人指着NTP说它能满足前传频差要求你要清楚那是两套体系别混淆。第三种公网直连型。家用路由器、个人电脑、独立服务器直接向公共NTP池发起请求。这种形态不需要内网服务器配置最简单但精度受公网链路抖动影响时延偶尔飙到几百毫秒也正常。工程上我一般推荐第一种。内网汇聚不仅能收敛连接还能在时间源故障时提供一定的缓冲能力同时内部设备的同步质量只取决于内网链路稳定可控。4. 落地部署Linux用chrony做服务器、Windows用w32time做客户端原理清楚了下一步是把服务搭起来。这一章按我实际做项目的顺序来讲先在Linux上把NTP服务端配置好再配Linux和Windows客户端最后用命令验证同步状态。每一步的配置参数都给出解释方便你按自己的网段和需求改。4.1 先选型chrony还是ntpd用哪个软件取决于操作系统版本。CentOS 8、Ubuntu 20.04及之后的发行版默认带的是chronyCentOS 7、Ubuntu 16.04/18.04这一代默认还是ntpd。新环境我建议直接用chrony理由有三点一是第一次启动时做initial sync几十秒内就能完成时间对齐而ntpd在本地时间偏差超过阈值时需要等系统渐变调整二是chrony对虚拟机和间歇性网络的场景有更好的处理策略三是chrony同时提供服务器和客户端一个软件两头用。老系统如果还在跑ntpd不是不能继续但迁移成本很低——配置文件结构相似chrony提供了chronyc命令行工具来查看和调整状态日常运维反而更省事。判断当前系统用的是哪个执行systemctl status chronyd或者systemctl status ntpd看哪个是active就清楚了。4.2 把一台Linux配成内网NTP服务器服务器端配置的关键是三个点上游源、访问控制、本地时间源策略。下面是一份最少可用的/etc/chrony.conf核心片段。# /etc/chrony.conf 核心配置 # 上游时间源iburst 表示首次启动时快速连发多个包完成初始同步 pool time.cloudflare.com iburst # 只允许内网网段访问本机NTP服务避免被外部网络当成跳板 allow 192.168.10.0/24 # 即使上游不可达也向客户端宣告自己是本地时间源 local stratum 10 # 启用硬件时间戳可以提升精度不是所有网卡都支持按需开启 # hwtimestamp *配置后重启服务并验证systemctl enable --now chronyd systemctl restart chronyd chronyc sources -v讲解三个参数的设计意图。pool比server更推荐它后面跟一个域名chrony会自动解析出多台主机从中挑选可用且质量好的同步iburst是启动时快速发射的意思让客户端在启动阶段连发8个请求把初始同步时间从几十秒压缩到几秒。allow是新手最容易漏的一项——默认情况下chrony只对本机提供时间服务不配置allow内网其他设备来请求全被拒绝。local stratum 10的含义是当上游不可达时本机继续给内网客户端分发时间Stratum宣告为10小于16表示有效这样断网期间内网设备的时间还能维持相对一致代价是不保证和真实时间一致。4.3 Linux客户端配置最简配置与手动校时客户端配置比服务器端简单得多核心就一行server指向。新建或修改/etc/chrony.conf# /etc/chrony.conf客户端最简配置 # 指向内网NTP服务器iburst 让第一次同步快速完成 server 192.168.10.1 iburst # 本地时间偏差超过1秒时允许chronyd直接跳变 makestep 1 -1这里要解释一下makestep的两个参数。第一个数字是偏差阈值单位秒第二个数字是限制条件-1表示无限制也就是说只要检测到本地时间与服务器偏差超过1秒就直接跳变而非渐变。新装的机器本地时间可能差几小时如果不配makestepchronyd会坚持渐变调整几个小时才追平期间业务读到的时间全是错的。生产环境如果担心跳变影响业务可以把1改成较小的值或者去掉-1改成3意思是启动后前三次同步允许跳变之后只做微调。手动临时校时用一条命令chronyc makestep这条命令强制chronyd立即执行一次时间调整常用于刚改完配置不想重启服务的场景。注意它只是让chronyd当前进程立即动作不改配置文件。4.4 Windows端w32time 的配置与验证Windows的时间同步服务叫Windows Time服务名W32Time。Windows Server和Windows 10/11桌面的配置方式相同。工作组环境下用w32tm命令手动指定时间源:: 设置外部时间源0x1 表示使用客户端模式 w32tm /config /manualpeerlist:192.168.10.1,0x1 /syncfromflags:manual /update :: 手动触发一次同步 w32tm /resync :: 查看当前同步状态重点看 Source 和 Last Success w32tm /query /status这里有两个容易在Windows上绊倒的点。第一Windows Time服务在某些版本上默认启动类型是手动重启后不自动运行建议在服务管理器里把Windows Time设为自动再重启一次服务。第二域环境下的机器不会听这条命令——域成员的默认策略是从域控同步时间手动指定时间源会被域策略覆盖。如果你在域里做NTP部署正确做法是改默认域策略里的Windows时间服务配置项让域控指向你的NTP服务器。验证同步状态时我习惯同时看两样东西/query /status里的本机状态以及用w32tm /stripchart /computer:192.168.10.1 /samples:5打一条连续采样观察每一轮的时间偏差和网络时延。后者在排查为什么反复失步时比前者直观得多。5. 时间同步避坑指南五个高频问题的现象、原因与解决做完基础配置之后真正的麻烦才开始。以下五条都是我在不同项目里实际遇到过的每条按现象、原因、解决的顺序记录方便你对照排查。5.1 现象客户端显示同步成功但系统时间还是偏ntpq -p输出里reach377、offset看起来只有几毫秒但业务日志时间就是不对。这种配好了但没用上的情况第一个要查的是时区。NTP同步的是UTC时间系统显示时间由时区决定。执行date -u查看UTC时间如果UTC是对的那就是时区设置问题。解决方法是把时区归位后再看显示时间timedatectl set-timezone Asia/Shanghai不是时区问题的话检查是不是有别的程序在改系统时间比如虚拟化平台的客户机时间同步插件、或者某些应用自带的校时逻辑。这类程序会和NTP服务打架表现为一会儿偏一会儿又准毫无规律。5.2 现象能ping通服务器UDP 123端口也通但同步一直失败NTP走UDP 123端口。关于ntp连接时客户端是否需要设置出入站规则这个问题答案是客户端出站一般不需要额外规则绝大多数防火墙默认放行出站UDP需要设置的是服务器端的入站规则。Windows服务器上如果没放行UDP 123入站即使w32tm配置正确同步也会一直卡在超时。加规则命令如下netsh advfirewall firewall add rule nameNTP-In-UDP123 protocolUDP dirin localport123 actionallowLinux服务器端则要确认firewalld或iptables的放行策略特别是那些一开始没配防火墙后来加固时加上了的主机漏掉UDP 123的概率很高。5.3 现象同一网络里部分机器显示的时间差整8小时时间偏8小时、6小时这类整点偏差问题不在NTP在时区。NTP只负责把UTC时间戳对齐显示层换算成什么样子完全由本机时区决定。某台机器时区被设成了别的区域或者Windows里自动设置时区选项被关掉显示出来自然和别的机器对不上。Linux用timedatectl set-timezone调整Windows在设置—时间和语言—日期和时间里开启自动时区。排查这类问题时先用date -uLinux或者用w32tm显示UTC时间对比先确定底层的UTC时间是否一致再谈显示层的问题。5.4 现象Windows时间服务运行几分钟后自动停止Windows Server上部署NTP的ntp w32time 教程里通常不会提这个坑W32Time服务默认启动类型是手动而且注册表配置有误时服务会直接退出。现象是服务刚启动时正常几分钟后停止重启机器也一样。原因多半是注册表里NtpClient的配置和当前系统状态不一致。解决分两步先重新注册服务再设成自动启动w32tm /unregister w32tm /register sc config w32time start auto net start w32timeregister命令会重建服务配置sc config把启动类型改为自动。完成后再执行一次w32tm /resync观察服务是否还退出。5.5 现象虚拟机从快照恢复后时间猛跳无论是VMware还是KVM虚拟机从快照恢复、或者宿主机休眠唤醒后操作系统里感知到的时间会瞬间跳变到快照时刻。NTP的滤波算法假定时钟偏移是渐变的遇到这种瞬跳客户端会无所适从表现出来就是时间恢复到快照值、NTP重新同步要等很久。常见解决思路有两个方向一是虚拟机有快照功能就把虚拟化平台的客户机时间同步选项打开二是NTP配置里放开跳变限制chrony用makestep 1 -1ntpd用tinker panic 0配合最大跳变阈值。前者适合开发测试环境后者在订单系统、金融类应用里要慎用——时间瞬间跳变会影响依赖时间戳的业务逻辑有条件的话恢复快照后手动执行一次同步并核对关键业务流程的时间一致性。6. 用chronyc做一次为期一天的同步质量验证同步不是配完看一眼就完事。我的习惯是新环境搭好NTP服务器后连续记录一天的偏移数据用数据判断这套链路稳不稳。方法很简单写一个后台循环脚本每60秒抓一次chronyc tracking的偏移量。# 记录一天的时间偏移nohup后台运行 nohup bash -c while true; do chronyc tracking | grep -E System time|Last offset /tmp/ntp-$(date %F).log; sleep 60; done 命令逻辑chronyc tracking输出包含当前系统时间的误差信息grep过滤出两行关键数据追加到以日期命名的日志文件里。第二天跑个统计看最大偏移和偏移值的分布区间用awk就能算。如果一天下来偏移都稳定在几毫秒级说明上游链路和内网质量都过关如果某个时段出现尖峰回看那个时间点有没有业务高峰、备份任务或者上游源故障。链路质量不稳的情况下多配一个上游源比如同时pool两个公共时间池让chrony的选择算法有冗余可用。这些年搭过的环境里真正能做到配完就不管的时间同步项目几乎没有。要么是时区没对齐要么是防火墙漏放行要么是虚拟化平台的同步插件在背后捣乱。每次翻车排查到最后根因往往不是NTP协议本身而是周边环境的某个小细节。希望这些踩坑记录能帮下一个搭NTP的你少走几步弯路。本文还有配套的精品资源点击获取
返回列表