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

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux系统中,NTP(Network Time Protocol,网络时间协议)被用于校准系统时间NTP是一种客户-服务器协议,通过在网络中的NTP服务器上同步时间来确保系统时间的准确性。 在Linux系统中进行NTP校时的操作非常简单。首先,需要确保系统已经安装了NTP软件包。在大多数Linux发行版中,NTP是预装的,如果不确定是否已安装,可以使用软件包管理器来查找和安装。 一旦NTP软件包已经安装,就可以配置系统以连接到NTP服务器。这可以通过编辑ntp.conf文件来完成,该文件通常位于/etc/ntp.conf路径下。在此文件中,可以列出要连接的NTP服务器的IP地址或域名。 配置文件中还可以指定校时的频率和策略,以及其他一些高级选项。一般来说,使用默认配置即可满足大多数情况。 保存并关闭配置文件后,可以重启NTP服务,使新的配置生效。不同的发行版可能有不同的命令来启动/停止/重启服务,可以根据具体的发行版文档进行操作。 NTP服务启动后,系统会自动连接到指定的NTP服务器,并根据服务器返回的时间信息进行校时。一旦校时完成,系统的时钟就会被自动调整为准确的时间NTP校时Linux系统中非常重要,特别是在需要精确时间同步的应用程序中。它可以确保系统时间与网络中的其他设备保持一致,防止时间漂移和不同设备之间的时间差异。这在很多涉及到日志记录、计时和时间敏感操作的场景中非常关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bluetangos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值