[关闭]
@AlexWuYh 2019-10-31T08:34:17.000000Z 字数 6057 阅读 157

NTP 协议简单分析

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.

img_2

  1. Device A 发送一个NTP报文给 Device B, 该报文带有它离开 Device A 时的时间戳, 该时间戳为 10:00:00 AM (T1).
  2. 当此 NTP 报文到达 Device B 时, Device B 加上自己的时间戳, 该时间戳为 11:00:01 AM (T2).
  3. 当此 NTP 报文离开 Device B 时, Device B 加上自己的时间戳, 该时间戳为 11:00:02 AM (T3).
  4. 当 Device A 接收到该响应报文时, Device A 的本地时间为 10:00:03 AM (T4).

    • 至此, Device A 已经拥有足够的信息来计算两个重要的参数:
    • NTP 报文的往返时延 Delay = (T4-T1) - (T3-T2) = 2s.
    • Device A 相对 Device B 的时间差 Offset = ((T2-T1) + (T3-T4))/2 = 1h.
    • 这样, Device A 就能够根据这些信息来设定自己的时钟, 使之与 Device B 的时钟同步.
    • 设备可以采用多种 NTP 工作模式进行时间同步:
      1. 客户端/服务器模式
      2. 对称模式
      3. 广播模式
      4. 组播模式

客户端/服务器模式

img_3

对称模式

img_4

广播模式

img_5

组播模式

img_6

三.NTP报文格式

img_1

LI Value 含义
00 0 无预告
01 1 醉经一分钟有 61s
10 2 最近一分钟有 59s
11 3 警告状态(时钟未同步)

- VN (Version Number): 版本号, 长度为 3 Bits, 目前最新的版本是 4, 向下兼容指定于 RFC 1305 的版本 3.

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) 机制.
检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径, 以提供对抗干扰的保护机制.

四.实例分析

wireshark 抓包如下:

ntp-test-20191031.pcap20016.5kB

mg_7

解析数据

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注