Linux时间子系统6:NTP原理和Linux NTP校时机制

一、前言

        上篇介绍了时间同步的基本概念和常见的时间同步协议NTP、PTP,本篇将详细介绍NTP的原理以及NTP在Linux上如何实现校时。

二、NTP原理介绍

1. 什么是NTP

         网络时间协议(英语:Network Time Protocol,缩写:NTP)是在计算机系统之间通过分组交换进行时钟同步的一个网络协议,位于OSI模型的应用层。用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。

2. NTP协议发展历史

        NTP是由美国Delaware大学David L .Mills教授设计的,是最早用于网络中时钟同步的标准之一。NTP是从时间协议和ICMP时间戳报文演变而来,当前协议为版本4(NTPv4),这是一个RFC 5905文档中的建议标准。它向下兼容指定于RFC 1305的版本3

3. NTP时钟层级

        NTP允许客户端从服务器请求和接收时间,而服务器又从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC。

        NTP以层级来组织模型结构,层级中的每层被称为Stratum。通常将从权威时钟获得时钟同步的NTP服务器的层数设置为Stratum 1,并将其作为主时间服务器,为网络中其他的设备提供时钟同步。而Stratum 2则从Stratum 1获取时间,Stratum 3从Stratum 2获取时间,以此类推。时钟层数的取值范围为1~16,取值越小,时钟准确度越高。层数为1~15的时钟处于同步状态;层数为16的时钟被认为是未同步的,不能使用的。

 4. NTP同步原理

NTP最典型的授时方式是Client/Server方式,如下图所示。

  1. 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;
  2. NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2。当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开NTP服务器时的时间戳t3;
  3. 客户端在接收到响应报文时,记录报文返回的时间戳t4。

客户端用上述4个时间戳参数就能够计算出2个关键参数:

  • NTP报文从客户端到服务器的往返延迟delay。

  • 客户端与服务端之间的时间差offset。

根据方程组:

        

        NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。

三、内核对NTP校时的支持

        在之前时钟源clocksource和timekeeper的文章中,我们介绍到通常每个tick的定时中断周期,do_timer会被调用一次. 在do_timer中,调用update_wall_time函数完成xtime等时间的更新操作,更新时间的核心操作就是读取关联clocksource的计数值,累加到xtime等字段中,每过一个tick中断,xtime就增加1Hz对应的时间

    而Ntp可以调整每个tick中断xtime增加的毫秒数,让系统时间走快些或走慢些。

1. timekeeper中的ntp成员

ntp_tick:记录了NTP周期的纳秒数

ntp_error:TP时间和当前实时时间之间的差值,如果ntp_error大于0,表示当前系统的实时时间慢于NTP时间,相反如果小于0则表示快于NTP时间

ntp_error_shift:存放了NTP的shift和时钟源设备shift之间的差值。NTP层也需要对纳秒数做shift的操作,其值由宏NTP_SCALE_SHIFT定义,

ntp_err_mult:如果ntp_error大于0,则为1,否则都是0。

在tk_setup_internals函数中,对上述变量进行了初始化,

	tk->ntp_error = 0;tk->ntp_error_shift = NTP_SCALE_SHIFT - clock->shift;tk->ntp_tick = ntpinterval << tk->ntp_error_shift;

一开始ntp_error被设置为0,也就是没有累积错误,shift被设置为NTP层的shift和时钟源设备shift之间的差值,ntp_tick其实最终被设置成了NTP_INTERVAL_LENGTH<<NTP_SCALE_SHIFT。

2. NTP调整内核时钟的系统调用

       一般来讲,调整时间有多种方式,包括直接设置时间,根据时间差offset调整时间(在当前时间上增加offset),以及调整时钟频率(根据时间跑的慢或者是快,说明当前的时钟频率存在偏移),对于系统时钟来说就是每个cycle对应的ns数,也就对应到mult和shift。

        NTP可以使用adjtimex和ntp_adjtime函数来调整系统时间,内核对这两个函数的支持并没有本质区别。adjtimex支持多种调节方式

        Ntp校时可分为内核模式和ntp模式这两种模式。。在ntp.conf文件中可以配置使用哪种模式校时,当两种模式都打开时,只有内核模式起作用。Ntpd默认两种模式都打开的。

enable kernel

enable ntp

disable kernel

disable ntp

        NTP的系统调用ntp_adjtime和adjtime,在内核模式中,ntpd在用户态调用ntp_adjtime修改内核的频率。在ntp模式中,ntpd在用户态调用adjtime修改内核的time_adjust变量。

2. NTP的全局变量tick_length

        我们观察ntp_tick的使用,发现在使用中,timekeeping模块通过ntp_tick_length函数获取最新的ntp_tick,并且根据获取到的ntp_tick判断是否要进行校时,ntp_tick_length返回的是ntp.c中定义的tick_length全局变量,如下:

u64 ntp_tick_length(void)
{return tick_length;
}

那么tick_lenth又是如何计算得到的呢?

在内核ntp.c文件second_overflow函数中可以看出,tick_length等于tick_length_base加上time_adjust的和,即tick_length的值由tick_length_base和time_adjust决定。Ntp服务正是通过修改tick_length_base和time_adjust的值来修改系统的tick_length,让系统走快或走慢。

【对比一下几种改变系统时间速度的方式】

1、  adjtimex –t 命令通过修改tick_usec变量来间接修改tick_length_base变量的值。

2、  adjtimex –f 命令通过修改time_freq变量来间接修改tick_length_base变量的值。

3、  ntpd的ntp模式修改内核的time_adjust变量。

上述几种方式修改的内核变量(tick_usec, time_freq, time_adjust),它们加起来影响着tick_length变量的值(每个tick的时长)。内核timekeeping.c文件中的update_wall_time函数中会用tick_length变量不停地调整系统时间xtime,让系统时间走快或走慢。L

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为数通企业面试笔试实验题

1. 笔试题 1.1 实验拓扑 1.2 实验要求 公司A为小型销售公司,需要实现基本上网功能,蓝色部分为外网线,提供DHCP服务 DnsServer:114.114.114.114 帮助网管排查某一台计算机在某一台交换机的某个端口 2. 操作步骤 配置路由器相关的LAN侧接口IP地址 配置DHCP项,要求有PC1与PC2…

大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)

首先&#xff0c;本文回顾了MHA的计算方式以及KV Cache的原理&#xff0c;然后深入到了DeepSeek V2的MLA的原理介绍&#xff0c;同时对MLA节省的KV Cache比例做了详细的计算解读。接着&#xff0c;带着对原理的理解理清了HuggingFace MLA的全部实现&#xff0c;每行代码都去对应…

软件改为开机自启动

1.按键 win R,输入“shell:startup”命令, 然后就可以打开启动目录了&#xff0c;如下&#xff1a; 2.然后&#xff0c;把要开机启动的程序的图标拖进去即可。 参考&#xff1a;开机启动项如何设置

JAVA面试(六)

缓存 MemcachedredisRedis常见数据类型和使用Redis缓存持久化RDB-快照AOF-追加文件 Redis数据过期机制惰性删除定期删除 Redis缓存淘汰策略&#xff08;8种&#xff09;算法LRU &#xff08;Least Recently Used&#xff09;&#xff1a;最近最少使用LFU&#xff08;Least Freq…

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接&#xff1a;https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解&#xff1a;https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频…

R可视化:微生物相对丰度或富集热图可视化

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 热图(Heatmap)是一种数据可视化方法,它通过颜色的深浅或色调的变化来展示数据的分布和密度。在微生物学领域,热图常用于表示微生物在不同分组(如…

【leetcode刷题】面试经典150题 , 27. 移除元素

leetcode刷题 面试经典150 27. 移除元素 难度&#xff1a;简单 文章目录 一、题目内容二、自己实现代码2.1 方法一&#xff1a;直接硬找2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 2.2 方法二&#xff1a;排序整体删除再补充2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 三、…

字符串专题详解

目录 字符串hash进阶 KMP算法 next数组 KMP算法 KMP算法优化 字符串hash进阶 字符串hash是指将一个字符串S映射为一个整数&#xff0c;使得该整数可以尽可能唯一地代表字符串S。那么在一定程度上&#xff0c;如果两个字符串转换成的整数相等&#xff0c;就可以认为这两个…

麻了,5年Java竟然不知道幂等......

在分布式系统中&#xff0c;接口幂等性是确保操作一致性的关键特性。 啥是幂等性 幂等性 指的是在给定的条件下&#xff0c;无论操作执行多少次&#xff0c;其结果都保持不变。在接口设计中&#xff0c;幂等性意味着使用相同的参数多次调用接口&#xff0c;应产生与单次调用相…

STM32学习笔记(五)--TIM输出比较PWM详解

&#xff08;1&#xff09;配置步骤1.配置RCC外设时钟 开启GPIO以及TIM外设2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等4.配置GPIO口 初始化为复用式推挽输出的配置5.运行控制 启动计数器 输出PWM…

Windows CSC服务特权提升漏洞(CVE-2024-26229)

文章目录 前言声明一、漏洞描述二、漏洞成因三、影响版本四、漏洞复现五、CVE-2024-26229 BOF六、修复方案 前言 Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时&#xff0c;就会发生基于堆的缓冲区溢出&#xff0c;从而导致多余的数据溢出到相邻的…

QT 的文件

QT 和C、linux 一样&#xff0c;也有自带的文件系统. 它的操作和C、c差不多&#xff0c;不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类&#xff0c;名为 QIODevice 类&#xff0c;如其名字&#xff0c;该类是管理所有输入输出设备的类。 比如文件、网络套…

【ic-tool】timegen使用

一、前言 TimeGen是一个用于时序波形编辑的CAD工具&#xff0c;它允许数字设计工程师快速有效地绘制数字时序图。TimeGen时序图可以很容易地导出到其他窗口程序&#xff0c;如microsoftword&#xff0c;用于编写设计规范。可直接从官网下载TimeGEN软件&#xff1a;TimeGen Pro…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

有什么可以创建ai聊天的软件?5个软件帮助你快速创建ai聊天

有什么可以创建ai聊天的软件&#xff1f;5个软件帮助你快速创建ai聊天 AI聊天软件是一种利用人工智能技术构建的聊天机器人系统&#xff0c;它能够模拟人类的对话方式&#xff0c;回答用户提出的问题或者进行对话。这类软件在各个领域都有广泛的应用&#xff0c;可以用于客户服…

【产品经理】订单处理5-可售库存管理

可售库存即销售库存&#xff0c;本文讲解订单处理过程中的可售库存的管理。 本次讲解订单处理过程中的可售库存的管理。 可售库存即销售库存&#xff0c;电商ERP中的可售库存共分三种&#xff1a;商品的可售现货库存、商品的预售库存以及赠品的可售库存。 一、商品的可售现货…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏&#xff0c;回⻋ \t ---> 制表符, tab键 注意&#xff1a; print( end\n)&#xff1a; print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

HTML中的资源提示关键词

渲染阻塞问题 之前在学习浏览器的渲染原理的时候我们就知道&#xff1a;因为浏览器一次只能开启一个渲染主线程&#xff0c;所以当浏览器解析到script标签时会停止DOM树的构建&#xff0c;转而去执行script&#xff0c;如果script中引用的是外部脚本&#xff0c;则浏览器会先从…

MySQL Server和Server启动程序(一)

MySQL Server mysqld&#xff0c;也称为MySQL Server&#xff0c;是一个单线程多任务的程序&#xff0c;它在MySQL安装中执行大部分工作。它不会生成额外的进程。MySQL Server管理对包含数据库和表的MySQL数据目录的访问。数据目录也是其他信息&#xff08;如日志文件和状态文…

目标检测:NMS代码

非极大值抑制NMS是目标检测常用的后处理算法&#xff0c;用于剔除冗余检测框 总体概要&#xff1a; 对NMS进行分类&#xff0c;大致可分为以下六种&#xff0c;这里是依据它们在各自论文中的核心论点进行分类&#xff0c;这些算法可以同时属于多种类别。 分类优先&#xff1a;…