@AlexWuYh
2019-10-31T08:34:17.000000Z
字数 6057
阅读 157
NTP
Linux
Device A 和 Device B 的系统时钟同步之前, Device A 的时钟设定为 10:00:00 AM, Device B 的时钟设定为 11:00:00 AM.
Device B 作为 NTP 时间服务器, 即 Device A 使自己的时钟与 Device B 时钟同步.
NTP 报文在 Device A 和 Device B 之间单向传输所需要的时间为 1s.
当 Device A 接收到该响应报文时, Device A 的本地时间为 10:00:03 AM (T4).
255.255.255.255
发送时钟同步报文, 报文中的 Mode 字段设置为5 (广播模式). 客户端侦听来自服务器的广播报文. 当客户端接收到第一个广播报文后, 客户端与服务器交互 Mode 字段为3 (客户模式) 和 4 (服务器模式) 的NTP报文, 以获得客户端与服务器间的网络延迟. 之后, 客户端就进入广播客户端模式, 继续侦听广播报文的到来, 根据到来的广播报文对系统时钟进行同步.LI | Value | 含义 |
---|---|---|
00 | 0 | 无预告 |
01 | 1 | 醉经一分钟有 61s |
10 | 2 | 最近一分钟有 59s |
11 | 3 | 警告状态(时钟未同步) |
- VN (Version Number): 版本号, 长度为 3 Bits, 目前最新的版本是 4, 向下兼容指定于 RFC 1305 的版本 3.
Mode: 工作模式, 长度为 3 Bits.
点对点模式下, 客户端请求时设置此字段为 3, 服务器应答时设置此字段为 4.
广播模式下, 服务器应答设置此字段为 5.
Mode | Value | 含义 |
---|---|---|
000 | 0 | 保留 |
001 | 1 | 主动对称模式 |
010 | 2 | 被动对称模式 |
011 | 3 | 客户端模式 |
100 | 4 | 服务器模式 |
101 | 5 | 广播或组播模式 |
110 | 6 | NTP控制报文 |
111 | 7 | 预留给内部使用 |
- Stratum: 系统时钟的层数, 长度为 8 Bits, 取值范围 1~16, 定义时钟的准确度. 层数为 1 的时钟准确度最高, 准确度从 1 到 16 依次递减, 阶层的上限为15, 层数为 16的时钟处于未同步状态, 不能作为参考时钟.
- NTP 获得 UTC 的时间来源可以是原子钟, 天文台, 卫星, 也可以从Internet上获取.
- stratum-0 是高精度计时设备, 例如原子钟 (如铯, 铷), GPS时钟或其他无线电时钟. 它们生成非常精确的脉冲秒信号, 触发所连接计算机上的中断和时间戳. 也称为参考 (基准) 时钟.
- stratum-1 是与 stratum-0 设备相连, 在几微秒误差内同步系统时钟的计算机.
- 时间是按 NTP 服务器的等级传播. 按照距离外部 UTC 源的远近将所有服务器归入不同的 Stratum (层) 中. Stratum-1 在顶层, 有外部 UTC 接入, 而Stratum-2 则从 Stratum-1 获取时间, Stratum-3 从 Stratum-2 获取时间, 以此类推, 但 Stratum 层的总数限制在15以内. 所有这些服务器在逻辑上形成阶梯式的架构并相互连接, 而 Stratum-1 的时间服务器是整个系统的基础.
stratum | 含义 |
---|---|
0 | 未指定或者难以获得 |
1 | 主要参考(如: 无线电时钟,校正的原子时钟) |
2~15 | 第二参考(Via NTP) |
16 | 未同步状态, 不能作为参考时钟 |
- Poll: 轮询间隔时间, 长度为 8 Bits, 两个连续NTP报文之间的时间间隔, 用 2 的幂来表示, 比如值为 6 表示最小间隔为 2^6 = 64s.
- Precision: 系统时钟的精度, 长度为 8 Bits, 用 2 的幂来表示, 比如 50Hz(20ms)或者60Hz(16.67ms) 可以表示成值 -5 (2^-5 = 0.03125s = 31.25ms).
- Root Delay: 本地到主参考时钟源的往返时间, 长度为 32 Bits, 有 15~16 位小数部分的无符号定点小数.
- Root Dispersion: 系统时钟相对于主参考时钟的最大误差, 长度为 32 Bits, 有 15~16 位小数部分的无符号定点小数.
网络对称性:
通过两次测量来估计链路延迟一般估算方法是假设链路是对称的, 即时间服务器到客户端的延迟等于客户端到时间服务器的延迟.
这种假设是理想化的, 实际的无线链路往往受到各种因素影响,
例如 多径, 时变 而不完全对称.
网络的拓扑结构:
简单的点对点拓扑结构能达到较高的同步精度, 而一些复杂的网络容易受到网络延迟抖动的影响, 且精度与网络负载情况相关.
时间戳的记录以秒的形式从 1900-01-01 00:00:00 算起.
NTP的时间精度在 WAN 为 数十毫秒,
在 LAN 为 亚毫秒级甚至更高,
在 Internet 上绝大部分能提供 1-50ms 的精确度, 取决于同步源和网络路径等特性.
比如: 当前时间为 1902-01-01 01:01:01, 与 1900 的参考时间相差为:
(365*2*24*60*60+3600+60+1) = 63075661s = 0x03C2754D s.
转换成二进制: 0000 0011 1100 0010 0111 0101 0100 1101 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX.
因为只有 32 Bits 表示秒数, 所以到了 2036 年数据就会溢出.
所以以 136 年为一个周期置 0 , 会用一些外部的方法来表示是相对于 1900 年还是 2036 年的时间.
NTP 的未来版本可能将时间表示扩展到 128 Bits: 其中 64 Bits 表示秒, 64 Bits 表示秒的小数. 当前的 NTPv4 格式支持 “时代数字” (Era Number)和 “时代偏移” (Era Offset), 正确使用它们应该有助于解决日期翻转问题. 据Mills称: “64 Bits 秒的小数足以分辨光子以光速通过电子所需的时间. 64 Bits 的秒足以提供明确的时间表示, 直到宇宙变暗.”
识别机制抗干扰和恶意破坏:
为防止对时间服务器的恶意破坏, NTP使用了识别 (Authentication) 机制.
检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径, 以提供对抗干扰的保护机制.
1c0104ec 00000000 00000048 47505373 dd26aa9f f7e47f4e dd26aaa7 4f5022d9 dd26aaa7 5f6f1524 dd26aaa7 5f716a6a
1c0104ec
转换成二进制:0001 1100 0000 0001 0000 0100 1110 1100
1110 1100
, 转换为反码: 1110 1011
, 转换为原码: 0001 0100
= 20
. 添加符号为 -20
, 精度为 2^-20 = 0.000001s
.)00000000
秒数为 0000
, 秒的小数为 0000
. 所以: Root Delay: 0.0000s
00000048
秒数为 0000
, 秒的小数为 0048
, 转换二进制: 0000 0000 0100 1000
. Root Dispersion: (0 + 2^-10 + 2^-13 = 0.0011s).
47505373
采用ASCII码, Reference ID: Unidentified reference source ‘GPSs’
dd26aa9f f7e47f4e
秒数为 dd26aa9f
, 转换成 Unix 时间戳 (1900年 转换为 1970年开始): 0xdd26aa9f
- 0x83aa7e80
= 0x597c2c1f
= 1501309983
即 2017-07-29 14:33:03
. 秒的小数为 f7e47f4e
, 转换成二进制: 1111 0111 1110 0100 0111 1111 0100 1110
= 2^-1 + 2^-2 + 2^-3 + 2^-4 + 2^-6 + 2^-7 + 2^-8 + 2^-9 + 2^-10 + 2^-11 + 2^-14 + 2^-18 + 2^-19 + 2^-20 + 2^-21 + 2^-22 + 2^-23 + 2^-24 + 2^-26 + 2^-29 + 2^-30 + 2^-31 = 0.968330000
. Reference Timestamp: 2017-07-29 14:33:03.068330000s UTC +08:00.
dd26aaa7 4f5022d9
秒数为 dd26aaa7
= 2017-07-29 14:33:11
. 秒的小数为 4f5022d9
= 0.309816000
. Reference Timestamp: 2017-07-29 14:33:11.309816000s UTC +08:00.
dd26aaa7 5f6f1524
秒数为 dd26aaa7
= 2017-07-29 14:33:11
. 秒的小数为 5f6f1524
= 0.372788000
. Reference Timestamp: 2017-07-29 14:33:11.372788000s UTC +08:00.
dd26aaa7 5f716a6a
秒数为 dd26aaa7
= 2017-07-29 14:33:11
. 秒的小数为 5f716a6a
= 0.372824000
. Reference Timestamp: 2017-07-29 14:33:11.372824000s UTC +08:00.