NTP协议介绍

2023-10-27

查看原作者:转载自:

NTP协议介绍 (2013-06-19 14:50:50)转载▼
SNTP协议原理

SNTP是简单网络时间协议(Simple Network Time protocol)的简称,它是目前Internet网上实现时间同步的一种重要工程化方法。本文对SNTP协议的工作原理、工作模式、时间戳格式、信息帧格式进行了研究,最后对SNTP协议的应用提出一些有益的建议。

关键词:SNTP;时间同步;时间戳格式;报文格式

Title Analysis for SNTP protocol

Abstract:

SNTP is abbreviation for simple network time protocol. At present it is an important engineering method for time synchronization in Internet. This paper describe principle,mode,timestamp format,message format of SNTP, finally we give some advice for application.

Key words: SNTP; time synchronization ; ,timestamp format ; message format

0引言

在一些需要精确时间同步的场合,如电力通讯、通信计费、分布式网络计算、气象预报等,仅靠计算机本身提供的时钟信号是远远不够的。据统计,计算机时间与国际标准时间偏差在1分钟以上的占到90%以上,这是因为计算机的时钟信号来源于自带的简单晶体振荡器,而这种晶体振荡器守时性很差,调整好时间后,一般每天都有都有几秒钟的时间漂移。上面提及的应用对时间准确度的要求均是需要秒级的,NTP协议就是提供精确网络时间服务的一种重要方法。NTP协议是网络时间协议的简称(Network Time Protocol),目前它被广泛用于在Internet上进行计算机时钟同步,它通过提供完全的机制来访问国际标准时间,在大多数情况下,NTP根据同步源和网络路径的不同,能够提供1-50MS的时间精确度。

NTP协议为了保证高度的精确性,需要很复杂算法,但是在实际很多应用中,秒级的精确度就足够了,在这种情况下,SNTP协议出现了,它通过简化原来的访问协议,在保证时间精确度的前提下,使得对网络时间的开发和应用变得容易。SNTP主要对NTP协议涉及有关访问安全、服务器自动迁移部分进行了缩减。

SNTP协议目前的版本号是SNTP V4,它能与以前的版本兼容,更重要的是SNTP能够与NTP协议具有互操作性,即SNTP客户可以与NTP服务器协同工作,同样NTP客户也可以接收SNTP服务器发出的授时信息。这是因为NTP和SNTP的数据包格式是一样的,计算客户时间、时间偏差以及包往返时延的算法也是一样的。因此NTP和SNTP实际上是无法分割的。

本文主要对SNTP协议进行分析,主要涉及协议工作原理、工作模式、时间戳格式、报文格式,最后对SNTP协议的应用提出一些建议。

1 SNTP协议工作原理

SNTP协议采用客户/服务器工作方式,服务器通过接收GPS信号或自带的原子钟作为系统的时间基准,客户机通过定期访问服务器提供的时间服务获得准确的时间信息,并调整自己的系统时钟,达到网络时间同步的目的。客户和服务器通讯采用UDP协议,端口为123。授时原理可以用下面的图作一个描述:

图1:授时原理图

T1:客户方发送查询请求时间(以客户方时间系统为参照),标记为Originate Timestamp;

T2:服务器收到查询请求时间(以服务器时间系统为参照),标记为Receive Timestamp;

T3:服务器回复时间信息包时间(以服务器时间系统为参照),标记为Transmit Timestamp;

T4:客户方收到时间信息包时间(以客户方时间系统为参照),标记为Destination Timestamp;

D1:请求信息在网上传播所消耗的时间

D2:回复信息在网上传播所消耗的时间

现已知T1 、T2、T3、T4,希望求得以调整客户方时钟有:

(1)

假设请求和回复在网上传播的时间相同,即D1=D2,则可解得:

(2)

可以看到, D只与T2T1差值、T3T4差值相关,而与T2T3差值无关,即最终的结果与服务器处理请求所需的时间无关。据此,客户方A即可通过T1、T2、T3、T4计算出时差θ去调整本地时钟。

2 SNTP协议工作模式

SNTP协议可以使用单播、广播或多播模式进行工作。单播模式是指一个客户发送请求到预先指定的一个服务器地址,然后从服务器获得准确的时间、来回时延和与服务器时间的偏差。广播模式是指一个广播服务器周期地向指定广播地址发送时间信息,在这组地址内的服务器侦听广播并且不发送请求。多播模式是对广播模式的一种扩展,它设计的目的是对地址未知的一组服务器进行协调。在这种模式下,多播客户发送一个普通的NTP请求给指定的广播地址,多个多播服务器在此地址上进行侦听。一旦收到一个请求信息,一个多播服务器就对客户返回一个普通的NTP服务器应答,然后客户依此对广播地址内剩下的所有服务器作同样的操作,最后利用NTP迁移算法筛选出最好的三台服务器使用。

客户和服务器地址可以采用通常的IPV4或IPV6。IANA保留IPV4地址224.0.1.1,保留IPV6以:101结束的地址作为NTP广播或多播的地址。用户也可以根据具体情况,建立自己的地址空间,只要不与已经使用的地址空间冲突。

为了局限广播或多播服务占用太多的网络资源,调节多播信息IP头中的TTL值到一个合理的水平非常重要。只有在地址范围内的多播客户能接收到多播信息,只有在地址范围内的服务器组能够对客户的响应进行应答。在Internet上,SNTP广播或多播客户极易受到来自其它SNTP服务器的攻击,因此在Internet上使用该服务时,一定要采用访问控制和加密的措施。

3 SNTP数据格式

SNTP协议同其它的网络应用层协议一样,都具有一定的数据格式,它主要涉及时间的表示,即时间戳的格式,数据如何组帧在网络上传输,即信息帧格式。

3.1 SNTP时间戳格式

SNTP时间戳是该协议的重要产品,用来对时间进行精确表示。它由一个64位无符号浮点数组成,整数部分为头32位,小数部分为后32位;单位为秒,时间相对于1900年1月零点。它能表示的最大数字为4,294,967,295秒,同时具有232PS的精确性,这能满足最苛刻的时间要求。值得注意的是在1968年的某一个时间(2,147,483,648秒)时间戳的最高位已被设置为1,在2036年的某一个时间(4,294,967,295秒)64位字段将会溢出,所有位将会被置为零,此时的时间戳将会被视为无效。为了解决这一问题,尽量延长SNTP时间戳的使用时间,一种可能的办法为:如果最高位设置为1,UTC时间范围为1968-2036之间,时间计算起点从1900年1月0点0分0秒开始计算;如果最高位设置为0,UTC时间范围为2036-2104之间,时间计算起点从2036年2月7日6点28分16秒开始计算;

3.2 SNTP信息帧格式

SNTP协议是UDP协议的客户,它利用UDP的123端口提供服务,SNTP客户在设置请求信息时要把UDP目的端口设置为该值,源端口可以为任何非零值,服务器在响应信息中对这些值进行交换。同其它应用层协议一样,SNTP协议的数据通信也是按数据帧的格式进行,下图是对SNTP信息帧格式的描述:

图2:SNTP信息帧格式

LI:当前时间闰秒标志。字段长度为2位整数,只在服务器端有效。取值定义为:

LI=0:无警告;

LI=1:最后一分钟是61秒;

LI=2:最后一分钟是59秒;

LI=3:警告(时钟没有同步)

服务器在开始时,LI设置为3,一旦与主钟取得同步后就设置成其它值。

VN:版本号。字段长度为3位整数,当前版本号为4。

Mode:指示协议模式。字段长度为3位,取值定义为:

Mode=0:保留

Mode=1:对称主动;

Mode=2:对称被动;

Mode=3:客户;

Mode=4:服务器;

Mode=5:广播;

Mode=6:保留为NTP控制信息;

Mode=7:保留为用户定义;

在单播和多播模式,客户在请求时把这个字段设置为3,服务器在响应时把这个字段设置为4。在广播模式下,服务器把这个字段设置为5。

Stratum:指示服务器工作的级别,该字段只在服务器端有效,字段长度为8位整数。取值定义为:

Stratum=0:故障信息;

Stratum=1:一级服务器;

Stratum=2-15:二级服务器;

Stratum=16-255:保留;

Poll Interval:指示数据包的最大时间间隔,以秒为单位,作为2的指数方的指数部分,该字段只在服务器端有效。字段长度为8位整数,取值范围从4-17,即16秒到131,072秒。

Precision:指示系统时钟的精确性,以秒为单位,作为2的指数方的指数部分,该字段只在服务器端有效。字段长度为8位符号整数,取值范围从-6到-20。

Root Delay:指示与主时钟参考源的总共往返延迟,以秒为单位,该字段只在服务器端有效。字段长度为32位浮点数,小数部分在16位以后,取值范围从负几毫秒到正几百毫秒。

Root Dispersion:指示与主时钟参考源的误差,以秒为单位,该字段只在服务器端有效。字段长度为32位浮点数,小数部分在16位以后,取值范围从零毫秒到正几百毫秒。

Reference Identifier:指示时钟参考源的标记,该字段只在服务器端有效。对于一级服务器,字段长度为4字节ASCII字符串,左对齐不足添零。对于二级服务器,在IPV4环境下,取值为一级服务器的IP地址,在IPV6环境下,是一级服务器的NSAP地址。

Reference Timestamp:指示系统时钟最后一次校准的时间,该字段只在服务器端有效,以前面所述64位时间戳格式表示。

Originate Timestamp:指示客户向服务器发起请求的时间,以前面所述64位时间戳格式表示。

Transmit Timestamp:指示服务器向客户发时间戳的时间,以前面所述64位时间戳格式表示。

Authenticator(可选):当需要进行SNTP认证时,该字段包含密钥和信息加密码。

4 SNTP服务器的基本工作过程

下面以最常用的SNTP工作模式-单播模式,来说明SNTP服务器的工作过程:

SNTP服务器在初始化时,Stratum字段设置为0,LI字段设置为3,Mode 字段设置为3,Reference Identifier字段设置为ASCII字符“INIT”,所有时间戳信息设置为0;

一旦SNTP服务器与外部时钟源取得同步后,进入工作状态,Stratum字段设置为1,LI字段设置为0,Reference Identifier字段设置为外部时钟源的ASCII字符,如“GPS”,Precision字段设置为-6到-20之间的一个数值,通常设置为-16。VN字段设置为客户端请求信息包的VN字段值,Root Delay和Root Dispersion字段通常设置为0,Reference Timestamp字段设置为从外部时钟源最新取得的时间,Originate Timestamp字段设置为客户请求包的Transmit Timestamp字段值,Transmit Timestamp字段设置为服务器发出时间戳给客户的时间。

SNTP服务器在工作过程中,如果与外部时钟源失去同步,Stratum字段设置为0,Reference Identifier字段设置为故障原因的ASCII字符,如:“LOST”,此时客户收到这个信息时,要丢弃服务器发给它的时间戳信息。

5 SNTP应用的建议

为了使SNTP更好地在网络中进行应用,尤其是在设计和管理有大量计算机需要授时的情况下,有以下建议:

  1. 尽量在本地局域网内部部署SNTP服务器,而不要采用Internet网上的公用SNTP服务器,因为Internet网络的时延不确定性,服务质量得得不到保证,会对授时的精度产生很大影响;

  2. 客户端对服务器的授时请求周期要大于1分钟,以免造成SNTP服务器资源迅速消耗,而不能及时响应客户的请求;

  3. 当网络中客户机数目大于500台时,应该配置多台SNTP服务器,以达到要求的授时精度。SNTP最多每秒种能同时响应500个请求,一旦超过这一数目,授时的精确度就得不到保证;

  4. 在需要高可靠授时的应用,最好配备多台SNTP服务器,利用DNS系统实现负载均衡和集群;

  5. 客户端应该能够识别服务器端的故障,一旦发现Stratum字段为0,应该立刻丢弃服务器发来的时间戳,转向其它服务器取时间,以避免授时错误;

6 结论

SNTP协议是目前网络上提供精确时间服务的一种有效手段,但是很少有人对它进行详细的分析,我们所作的工作对于开发者和网络管理人员来说都是非常有益的,对于开发者来说,能够根据协议开发自己的SNTP服务器,同时对SNTP协议的不足之处进行改进;对于网络管理者来说,在理解SNTP工作原理和方式的基础上,通过网络的优化,使SNTP服务发挥最佳的效能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NTP协议介绍 的相关文章

  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh

随机推荐

  • 手把手教你搭建优雅的ssm框架(完整)

    直接开始搭建 使用的是idea工具 新建一个maven项目 加入框架支持 点开目录后 你会发现里面缺少目录 我们自己创建一下 在pom xml中添加依赖 这些依赖必不可少 后面可以根据需求自己添加
  • 第十四届蓝桥杯国赛python青少组题目

    LQGS14PB01 时间限制 3000MS 内存限制 589824KB 题目描述 编程实现 注 input 输入函数的括号中不允许添加任何信息 给定一个字符串S S长度 lt 100 统计字符串中字母一共有多少个 例如 S 1Abb 其中
  • keil 软件如何生成.hex文件

    1 当程序编译通过没错误了 按照下图步骤勾选 点击魔术棒 output界面 勾选hex 2 勾选完点击ok 再对程序进行编译 出现下图内容 则生成hex文件成功
  • C++ 学习笔记(二)

    C 继承与派生 1 公有继承 是指在源生一个类时继承方式为public的继承方式 在public继承方式下 基类成员在派生类中的访问权限为 基类的公有和保护成员的访问属性在派生类中不变而基类的私有成员不可访问 即基类的公有成员和保护成员被继
  • Vue中 element的table表格导入 与 导出为excel表格的实现

    Vue中 element的table表格导入 与 导出为excel表格的实现 一 导入 2 1 安装xlsx插件 2 2 新建导入功能组件 2 3 注册全局的导入excel组件 2 4 创建导入路由组件 2 5 封装导入接口 实现excel
  • QM二面

    目录 如何在笔记本上添加永久路由 扩展 Linux如何查看并杀死进程 模拟场景 动态路由协议和DNS的共同之处 如何在笔记本上添加永久路由 route print 查看路由表 添加路由的命令 route add 网段 mask 子网掩码 网
  • 从二叉树到堆排序

    目录 一 树 1 树的基本概念 2 二叉树 1 最常见表示二叉树的方法 2 满二叉树 3 完全二叉树 4 二叉树的性质 5 存储结构 二 堆 1 逻辑结构与存储结构 2 堆的特性 3 向下调整算法 4 建堆 5 堆排序 一 树 1 树的基本
  • 数据库模糊查询

    常用的模糊查询语句有 1 like 查询姓李的同学 使用like like 结合 代表多个字符 代表一个字符 SELECT id myname FROM aaa WHERE myname LIKE 李 like的用法就像我们使用百度搜索时啊
  • MQTT通讯之连接MQTT服务器

    根据 添加链接描述 和 添加链接描述 我的APP已经成功连接上MQTT服务器 至于怎么发布和接收 正在研究 研究好了 发上来 作者写的代码是Java的 但现在都推荐Kotlin 我就把转好的Kotlin代码发出来 package com e
  • Anaconda Python Pytorch (GPU) 配置

    目录 0 写在前面 1 Anaconda下载 1 1 下载 1 2 安装 1 2 1 设置安装路径 1 2 2 两个都勾上 1 3 查看conda版本 2 CUDA及cuDNN 2 1 查看是否可以安装CUDA 2 2 CUDA和Pytor
  • 【2022最新Java面试宝典】—— Java基础知识面试题(91道含答案)

    目录 一 Java概述 1 何为编程 2 什么是Java 3 jdk1 5之后的三大版本 4 Jdk和Jre和JVM的区别 5 什么是跨平台性 原理是什么 6 Java语言有哪些特点 7 什么是字节码 采用字节码的最大好处是什么 8 什么是
  • 什么是芯片?

    https zhuanlan zhihu com p 228757435 utm source weibo utm medium social utm oi 895441374156029952 utm content snapshot 什
  • k8s_day07_02

    k8s day07 02 静态密码方式认证k8s kubeconfig 1 kubeconfig 配置文件 在 etc kubernetes 有conf 结尾的文件 那个就是kubeconfig 类型的配置文件 用于控制节点组件 和api交
  • HBuilderX安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    一 下载安装 1 在地址栏中直接输入https www dcloud io 2 点击箭头所指 进去过后点击DOWNLOAD 3 点击过后 选择自己所需要的版本 HBuilder目前有两个版本 一个是windows版 一个是mac版 下载的时
  • python垃圾回收

    Python内存管理机制 Python内存管理机制主要包括以下三个方面 引用计数机制 垃圾回收机制 内存池机制 引用计数 举个例子说明引用是什么 a 1 如上为一个简单的赋值语句 1就是对象 a就是引用 引用a指向对象1 同理 b 1 b也
  • Configuring VM Acceleration on Windows

    http developer android com tools devices emulator html Configuring Virtual Machine Acceleration Caution As of SDK Tools
  • Java中String类,StringBuffer类和StringBuilder类

    底层分析 1 String类 String类对象代表不可变的字符序列 其底层结构如下 public final class String implements java io Serializable Comparable
  • quartz定时任务详解

    开始 application quartz xml
  • 前端面试题总结

    1 this指向问题 1 以函数的形式 包括普通函数 定时器函数 立即执行函数 调用时 this 的指向永远都是 window 比如fun 相当于window fun 2 以方法的形式调用时 this 指向调用方法的那个对象 3 以构造函数
  • NTP协议介绍

    查看原作者 转载自 NTP协议介绍 2013 06 19 14 50 50 转载 SNTP协议原理 SNTP是简单网络时间协议 Simple Network Time protocol 的简称 它是目前Internet网上实现时间同步的一种