首页 > 其他分享 >理解NTP协议

理解NTP协议

时间:2022-08-15 13:48:01浏览次数:73  
标签:协议 17 NTP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ serv

理解NTP协议

https://www.dazhuanlan.com/yukkiai/topics/1124557

 

NTP 协议用来校准服务器的时间. 本文详细介绍原理和协议格式

时钟同步的过程

  1. A 发送 ntp 消息到 B, 消息里含发送时间戳 T1.
  2. B 收到 ntp 消息后, 将接受时间 T2 写入该消息体.
  3. 当 B 发送 ntp 响应消息给 A 时, 将发送时间 T3 也写入该消息体
  4. A 收到响应 ntp 消息的时间为 T4

那么
round-trip 为: (T4 - T1) - (T3 - T2)
时间偏移为: ((T2 - T1) + (T3 - T4)) / 2

ntp 请求消息和响应消息格式完全一样, 使用 udp 协议. 默认的 ntp 服务器监听端口是 123
如下 chronyd(centos 下默认的 ntp 软件) 正在监听 123 端口

$ lsof -i:123
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd 2439 chrony    3u  IPv4  23270      0t0  UDP *:ntp

ntp 消息格式

ntp 消息由消息头,扩展字段,可选的鉴权码组成. 在实际使用中, 一般只携带消息头. 如下是消息头的具体格式

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |LI | VN  |Mode |    Stratum     |     Poll      |  Precision   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                         Root Delay                            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                         Root Dispersion                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                          Reference ID                         |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                     Reference Timestamp (64)                  +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                      Origin Timestamp (64)                    +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                      Receive Timestamp (64)                   +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                      Transmit Timestamp (64)                  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

时间格式有两种, 它们代表从1900年1月1号0 时 UTC 时间至今的秒数

  • NTP Timestamp Format
    8 个字节, 前 32 位表示秒数, 后 32 位表示 1/2的32次方 秒
     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                            Seconds                            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                            Fraction                           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • NTP Short Format
    4 个字节, 前 16 位表示秒数, 后 16 位表示 1/2的16次方 秒
     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          Seconds              |           Fraction            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • 消息头各字段解释:

LI Leap Indicator (leap): 2 比特, 用来警告是否有闰秒或者未和上级同步. 具体取值和含义如下:

    +-------+----------------------------------------+
    | Value | Meaning                                |
    +-------+----------------------------------------+
    | 0     | no warning                             |
    | 1     | last minute of the day has 61 seconds  |
    | 2     | last minute of the day has 59 seconds  |
    | 3     | unknown (clock unsynchronized)         |
    +-------+----------------------------------------+

VN Version Number: 3 比特,指定 ntp 版本 Mode (mode): 3 比特, 指定工作模式, 通常我们使用 3,4 代表客户端 - 服务端模式

    +-------+--------------------------+
    | Value | Meaning                  |
    +-------+--------------------------+
    | 0     | reserved                 |
    | 1     | symmetric active         |
    | 2     | symmetric passive        |
    | 3     | client                   |
    | 4     | server                   |
    | 5     | broadcast                |
    | 6     | NTP control message      |
    | 7     | reserved for private use |
    +-------+--------------------------+

Stratum (stratum): 8 比特指定阶层. 通常 Server 更新该字段.
顶层分配为数字 0。一个通过阶层 n 同步的服务器将运行在阶层 n + 1。 阶层为 0 的是高精度计时设备,例如原子钟(如铯、铷)、GPS 时钟或其他无线电时钟。它们生成非常精确的脉冲秒信号,触发所连接计算机上的中断和时间戳。阶层 0 设备也称为参考(基准)时钟. 阶层 1 服务器连接阶层 0 的设备, 它们也被称为主要(primary)时间服务器。

ntp阶层图    

更具体的取值含义如下:

 

    +--------+-----------------------------------------------------+
    | Value  | Meaning                                             |
    +--------+-----------------------------------------------------+
    | 0      | unspecified or invalid                              |
    | 1      | primary server (e.g., equipped with a GPS receiver) |
    | 2-15   | secondary server (via NTP)                          |
    | 16     | unsynchronized                                      |
    | 17-255 | reserved                                            |
    +--------+-----------------------------------------------------+

Poll: 8 比特符号整数, 指示与下一次 ntp 同步的最短时间间隔. 值为 4, 则表示 16(2 的 4 次方) 秒
Precision: 8 比特符号整数, 指示时间精度. log2 秒. -18 为微妙
Root Delay: 总的 round-trip delay 到 Primary server. 单位是 NTP Short Format
Root Dispersion: 单位是 NTP Short Format
Reference ID: 32 比特指示服务端的参考时钟 (即上层服务器信息). 即上层时钟源 . 当阶层为 1 时, 那么上层是原子钟等设备. 没 IP, 所以使用 ascii 字符 从阶层 2 开始, 表示 IP 地址.
Reference Timestamp: 指示服务端自身系统时间最后一次被设置的时间戳.通常每 Poll 一次更新一下
Origin Timestamp: 客户端发起时间
Receive Timestamp: 服务端接受时间
Transmit Timestamp: 服务端发送时间

抓包实例

tcpdump -i eth0 port 123 -nnv 抓取 ntp 的详细报文, 样例如下:

17:19:18.566860 IP (tos 0x0, ttl 45, id 33978, offset 0, flags [none], proto UDP (17), length 76)
    1.80.235.52.31681 > 192.168.1.247.123: NTPv4, length 48
    Client, Leap indicator: clock unsynchronized (192), Stratum 0 (unspecified), poll 3 (8s), precision -6
    Root Delay: 1.000000, Root dispersion: 1.000000, Reference-ID: (unspec)
      Reference Timestamp:  0.000000000
      Originator Timestamp: 0.000000000
      Receive Timestamp:    0.000000000
      Transmit Timestamp:   3726119958.485983999 (2018/01/28 17:19:18)
        Originator - Receive Timestamp:  0.000000000
        Originator - Transmit Timestamp: 3726119958.485983999 (2018/01/28 17:19:18)
17:19:18.566899 IP (tos 0x0, ttl 64, id 38707, offset 0, flags [DF], proto UDP (17), length 76)
    192.168.1.247.123 > 1.80.235.52.31681: NTPv4, length 48
    Server, Leap indicator:  (0), Stratum 3 (secondary reference), poll 3 (8s), precision -24
    Root Delay: 0.005340, Root dispersion: 0.002105, Reference-ID: 182.92.12.11
      Reference Timestamp:  3726119511.971055101 (2018/01/28 17:11:51)
      Originator Timestamp: 3726119958.485983999 (2018/01/28 17:19:18)
      Receive Timestamp:    3726119958.566745462 (2018/01/28 17:19:18)
      Transmit Timestamp:   3726119958.566777029 (2018/01/28 17:19:18)
        Originator - Receive Timestamp:  +0.080761462
        Originator - Transmit Timestamp: +0.080793029

相关软件使用

chronyd 是 centos7 引入的新的 ntp 软件, 代替老的 ntpd
如下命令检测当前与上层 ntp 的同步状态

$ chronyc sources -v
210 Number of sources = 2

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                     |          |  zzzz = estimated error.
||                                 |    |           
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* time5.aliyun.com              2  10   377   733   +165us[ +206us] +/- 5534us
^- 120.25.115.19                 2  10   377   633  -1155us[-1155us] +/-   65ms

使用 ntpd 软件包时检查 ntp 状态
when 指多少秒后再一次同步
poll 指下一次同步的时间间隔 单位:秒
reach 与上层服务器已成功连接的次数
delay 指 RRT 单位: 毫秒
offset 指时间偏移值 单位: 毫秒

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+time5.aliyun.co 10.137.38.86     2 u   11   64    1   25.353  -113.04  65.276
*203.107.6.88    10.137.55.181    2 u    9   64    1   45.441  -148.44  89.070

ntpdate -q XX.XX.XX.XX 查询与上层 ntp 服务器的时间偏移量. 不会更新. -d 打开 Debug 模式

$ ntpdate -q ntp3.aliyun.com
server 203.107.6.88, stratum 2, offset 0.797972, delay 0.06859
11 Feb 23:02:36 ntpdate[21763]: step time server 203.107.6.88 offset 0.797972 sec

ntp 配置最佳实践:
假设 ntp 服务器为 ntp1.aliyun.com, 配置如下:

# 上层服务器配置
server ntp1.aliyun.com iburst 
restrict ntp1.aliyun.com nomodify notrap nopeer noquery

# default 指所有IP, 首先默认显示连接无法执行任何操作
restrict default kod nomodify notrap nopeer noquery
# 针对ipv6的配置
restrict -6 default kod nomodify notrap nopeer noquery
# 配置内网IP可查询不可修改时间
restrict xx.xx.xx.xx mask xx.xx.xx.xx  nomodify notrap nopeer

man ntp_acc 查看 restrict 各参数含义
man ntp_clock 查看 server 各参数含义

参考

 

============= End

 

标签:协议,17,NTP,+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+,serv
From: https://www.cnblogs.com/lsgxeva/p/16587984.html

相关文章

  • 深入理解数据库事务机制
    一、概念首先看看什么是事务?事务具有哪些特性?关于事务,上大学的时候,你应该有接触过相关的课程。简单来说,事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全......
  • 技术分享 | 接口测试之HTTP 协议讲解
    原文链接本文节选自霍格沃兹测试开发学社内部教材HTTP协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。客户端向服务端......
  • 线程与进程的理解
    一、概括进程(process)和线程(thread)的:进程是资源管理的最小单位,线程是程序执行的最小单位。线程的本质是一个进程内部的一个控制序列,它是进程里面的东西,一个进程可以拥有......
  • HTTP协议、HTTP协议响应行_状态码
    HTTP协议请求消息:客户端发送给服务端的数据数据格式:1,请求行2,请求头3,请求空行4,请求体响应消息:服务端发送给客户端的数据......
  • ffmpeg以RTP协议推送视频
    docker编译环境dockerpullabdulachik/ffmpeg.js:latestdockerrun-it-p8080:8080-v/Users/workspace/Downloads/ffmpeg_wasm:/tmp--privileged=trueabdulachik/......
  • 画图TCP协议和三次握手及四次挥手
    1.TCP协议1.1.TCP特性1.TCP提供一种面向连接的、可靠的字节流服务在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP2.TCP使用校验和,确认和重传机制来保......
  • 周回顾并发编程与数据库08.14:UDP协议、操作系统发展史、相关名词、进程、线程、验证py
    目录UDP协议操作系统发展史相关名词进程线程锁信号量event事件池协程数据库MySQLSQL与NoSQL内容UDP协议Internet协议集支持一个无连接的传输协议,该协议......
  • 认证与授权——单点登录协议盘点:OpenID vs OAuth2 vs SAML
    (转载登高且赋)无论是Web端还是移动端,现在第三方应用账户登录已经成为了标配,任意打开个网站都可以看到,QQ/微信账号登录的字样。使用第三方账户的登录的过程,既要限制......
  • 深入理解Spring注解机制(二):元注解解析与属性映射
    前言众所周知,spring从2.5版本以后开始支持使用注解代替繁琐的xml配置,到了springboot更是全面拥抱了注解式配置。平时在使用的时候,点开一些常见的等注解,会发现往往......
  • 深入理解Spring别名机制
    前言在spring容器中,允许通过名称或别名来获取bean,这个能力来自于顶层接口AliasRegistry,分析类下属的关系图,可以看到,几乎所有主要容器都直接或间接的实现了AliasRegi......