通过NTP协议进行时间同步
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。
使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。
对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。
NTP工作原理
NTP的基本工作原理如图所示。Device A和Device B通过网络相连,它们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步。为便于理解,作如下假设:
在Device A和Device B的系统时钟同步之前,Device A的时钟设定为10:00:00am,Device B的时钟设定为11:00:00am。
Device B作为NTP时间服务器,即Device A将使自己的时钟与Device B的时钟同步。
NTP报文在Device A和Device B之间单向传输所需要的时间为1秒。
系统时钟同步的工作过程如下:
Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)。
当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2)。
当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)。
当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)。
至此,Device A已经拥有足够的信息来计算两个重要的参数:
NTP报文的往返时延Delay=(T4-T1)-(T3-T2)=2秒。
Device A相对Device B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。
这样,Device A就能够根据这些信息来设定自己的时钟,使之与Device B的时钟同步。
NTP的报文格式
NTP有两种不同类型的报文,一种是时钟同步报文,另一种是控制报文。控制报文仅用于需要网络管理的场合,它对于时钟同步功能来说并不是必需的,这里不做介绍。
主要字段的解释如下:
l LI(Leap Indicator):长度为2比特,值为“11”时表示告警状态,时钟未被同步。为其他值时NTP本身不做处理。
l VN(Version Number):长度为3比特,表示NTP的版本号,目前的最新版本为3。
l Mode:长度为3比特,表示NTP的工作模式。不同的值所表示的含义分别是:0未定义、1表示主动对等体模式、2表示被动对等体模式、3表示客户模式、4表示服务器模式、5表示广播模式或组播模式、6表示此报文为NTP控制报文、7预留给内部使用。
l Stratum:系统时钟的层数,取值范围为1~16,它定义了时钟的准确度。层数为1的时钟准确度最高,准确度从1到16依次递减,层数为16的时钟处于未同步状态,不能作为参考时钟。
l Poll:轮询时间,即两个连续NTP报文之间的时间间隔。
l Precision:系统时钟的精度。
l Root Delay:本地到主参考时钟源的往返时间。
l Root Dispersion:系统时钟相对于主参考时钟的最大误差。
l Reference Identifier:参考时钟源的标识。
l Reference Timestamp:系统时钟最后一次被设定或更新的时间。
l Originate Timestamp:NTP请求报文离开发送端时发送端的本地时间。
l Receive Timestamp:NTP请求报文到达接收端时接收端的本地时间。
l Transmit Timestamp:应答报文离开应答者时应答者的本地时间。
l Authenticator:验证信息。
NTP的工作模式
设备可以采用多种NTP工作模式进行时间同步:
客户端/服务器模式
对等体模式
广播模式
组播模式
用户可以根据需要选择合适的工作模式。在不能确定服务器或对等体IP地址、网络中需要同步的设备很多等情况下,可以通过广播或组播模式实现时钟同步;客户端/服务器和对等体模式中,设备从指定的服务器或对等体获得时钟同步,增加了时钟的可靠性。
1. 客户端/服务器模式
在客户端/服务器模式中,客户端向服务器发送时钟同步报文,报文中的Mode字段设置为3(客户模式)。服务器端收到报文后会自动工作在服务器模式,并发送应答报文,报文中的Mode字段设置为4(服务器模式)。客户端收到应答报文后,进行时钟过滤和选择,并同步到优选的服务器。
在该模式下,客户端能同步到服务器,而服务器无法同步到客户端。
2. 对等体模式
在对等体模式中,主动对等体和被动对等体之间首先交互Mode字段为3(客户端模式)和4(服务器模式)的NTP报文。之后,主动对等体向被动对等体发送时钟同步报文,报文中的Mode字段设置为1(主动对等体),被动对等体收到报文后自动工作在被动对等体模式,并发送应答报文,报文中的Mode字段设置为2(被动对等体)。经过报文的交互,对等体模式建立起来。主动对等体和被动对等体可以互相同步。如果双方的时钟都已经同步,则以层数小的时钟为准
3. 广播模式
在广播模式中,服务器端周期性地向广播地址255.255.255.255发送时钟同步报文,报文中的Mode字段设置为5(广播模式)。客户端侦听来自服务器的广播报文。当客户端接收到第一个广播报文后,客户端与服务器交互Mode字段为3(客户模式)和4(服务器模式)的NTP报文,以获得客户端与服务器间的网络延迟。之后,客户端就进入广播客户端模式,继续侦听广播报文的到来,根据到来的广播报文对系统时钟进行同步。
4. 组播模式
在组播模式中,服务器端周期性地向用户配置的组播地址(若用户没有配置组播地址,则使用默认的NTP组播地址224.0.1.1)发送时钟同步报文,报文中的Mode字段设置为5(组播模式)。客户端侦听来自服务器的组播报文。当客户端接收到第一个组播报文后,客户端与服务器交互Mode字段为3(客户模式)和4(服务器模式)的NTP报文,以获得客户端与服务器间的网络延迟。之后,客户端就进入组播客户模式,继续侦听组播报文的到来,根据到来的组播报文对系统时钟进行同步。
NTP时间同步的实现
有了上述基础知识后,我们就可以实现自己的时间同步工具了,下文附了一个简单的C#的实现。
class NptClient
{
IPAddress ntpServer;
public NptClient(IPAddress ntpServer)
{
this.ntpServer = ntpServer;
}
public DateTime GetServerTime()
{
var startTime = DateTime.Now;
var ntpTime = NTPData.Test(ntpServer);
var recvTime = DateTime.Now;
var offset = ((ntpTime.ReceiveTimestamp - startTime) + (ntpTime.TransmitTimestamp - recvTime));
offset = offset.Subtract(TimeSpan.FromSeconds(offset.TotalSeconds / 2));
return recvTime + offset;
}
}
[StructLayout(LayoutKind.Sequential)]
class NTPData
{
byte header = 0;
byte Stratum = 1; //系统时钟的层数,取值范围为1~16,它定义了时钟的准确度
byte Poll = 1; //轮询时间,即两个连续NTP报文之间的时间间隔
byte Precision = 1; //系统时钟的精度
BigEndianUInt32 rootDelay;
BigEndianUInt32 referenceIdentifier;
BigEndianUInt32 ReferenceIdentifier;
public NtpTime ReferenceTimestamp { get; private set; }
public NtpTime OriginateTimestamp { get; private set; }
public NtpTime ReceiveTimestamp { get; private set; }
public NtpTime TransmitTimestamp { get; private set; }
public NTPData()
{
this.header = GetHeader();
}
byte GetHeader()
{
var LI = "00";
var VN = "011"; //NTP的版本号为3
var Mode = "011"; //客户模式
return Convert.ToByte(LI + VN + Mode, 2);
}
public static NTPData Test(IPAddress ntpServer)
{
var data = MarshalExtend.GetData(new NTPData());
var udp = new System.Net.Sockets.UdpClient();
udp.Send(data, data.Length, new IPEndPoint(ntpServer, 123));
var ep = new IPEndPoint(IPAddress.Any, 0);
var replyData = udp.Receive(ref ep);
return MarshalExtend.GetStruct<NTPData>(replyData, replyData.Length);
}
}
[StructLayout(LayoutKind.Sequential)]
class NtpTime
{
BigEndianUInt32 seconds;
BigEndianUInt32 fraction;
static readonly DateTime baseTime = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static implicit operator DateTime(NtpTime time)
{
/* rfc1305的ntp时间中,时间是用64bit来表示的,记录的是1900年后的秒数(utc格式)
* 高32位是整数部分,低32位是小数部分 */
var milliseconds = (int)(((double)time.fraction / uint.MaxValue) * 1000);
return baseTime.AddSeconds(time.seconds).AddMilliseconds(milliseconds).ToLocalTime();
}
public override string ToString()
{
return ((DateTime)this).ToString("o");
}
}
通过NTP协议进行时间同步相关推荐
- ntp服务器响应每秒请求数量,批量、增量接口并发问题和NTP协议
背景 项目中存在「批量接口」和「增量接口」,两个接口都更新DB中的数据. 如存在以下表格,主键为shopId,shopName表示店名. shopId shopName 111 info111 222 ...
- 怎样用u盘linux安装ntp协议,电脑中怎么配置NTP服务
NTP服务器是用来使计算机时间同步化的一种协议,可提供高精准度的时间校正,而且能通过加密确认来防止恶毒的协议攻击.下面让学习啦小编为大家介绍如何在电脑中配置NTP服务来实现局域网内设备的时间同步. 电 ...
- NTP和chrony时间同步
引言 古代计时方式 ●在远古时期,人类用来确定时间的方式是一些自然界"相对"亘古不变的周期.如地球的公转是为一年,月球的公转是为一月,地球的自转是为一天等,最早的计时可以追溯到公元 ...
- 标准时间GMT|UTC以及NTP协议学习
1.GMT时间 GMT,Greenwich MeanTime,中文名为格林尼治时间.英国的格林尼治这个城市在经度为零的地球经线上,所以地球以格林尼治所在的0度经线为标准,分为24个时区.自格林尼治以东 ...
- NTP物理机时间同步应用
1.先搭建服务器端:使用yum安装ntp服务端工具. (1).检测ntp和ntpdate是否已经安装,如果已经安装,先卸载重新再安装. [root@ ~]# rpm -qa | grep ntp nt ...
- Windows下安装NTP服务器——搭建时间同步服务器
Windows下安装NTP服务器--搭建时间同步服务器 NTP服务器介绍 NTP服务器[Network Time Protocol(NTP)]是用来使计算机时间同步化的一种协议,它可以使计算机对其服务 ...
- Linux实现NTP协议同步时间
NTP简介 网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供 ...
- ntp时间服务器——时间同步
具体两种模式: 1.服务器数量比较少,可以直接与时间服务器同步 2.本地服务器较多,在本地自建时间同步服务器 时间同步的两个命令: ntpd : 校准时间,一点点的校准过来时间的,最终把时间慢慢的校正 ...
- ntp时间服务器 时间同步
ntp时间服务器 时间同步 2017年10月15日 11:05:30 centos2015 阅读数:1996 标签: ntpdtimentpdate 更多 个人分类: Linux 版权声明:本文为博主 ...
最新文章
- 植树节,程序员要爬哪些“树”?
- 如何制定一份永远完不成的年度计划?
- Paper:《A Unified Approach to Interpreting Model Predictions—解释模型预测的统一方法》论文解读与翻译
- Web服务初探:用Demo学Web服务系列(7)——XML的相关知识
- udp java 检测连接_简单的JAVA UDP连接测试
- Codeforces 437C The Child and Toy(贪心)
- 将继续深入学习网络编程
- 字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗
- Chrome不显示OPTIONS请求的解决方法2021版chrome90
- python基础教程慕课_Python基础教程(6)--抽象
- LINUX环境:MySQL和Oracle开机自启动
- NBOOT分析-NBOOT.c(2)
- ssh配置公钥_CentOS配置SSH免密登陆
- python orm开发模型_Python ORM框架Peewee初探【二】创建或者生成模型
- Java全栈开发---Java ERP系统开发:商业ERP(十三)CXF框架,物流BOS系统开发
- 使用VS2019编译单个CPP文件并运行
- 返利网拼团小程序,10人拼团7人返利
- Android签名验证与反调试机制的对抗技术
- 每日一课 | 数据分析的本质是什么?
- Excel表格中的三维气泡图,你会做吗?
热门文章
- 翻译:swift 5 iOS Accessibility从入门到精通
- ARTS-第-22-期
- 大功率双伺服电机驱动板,包含原理图,PCB和原代码,基于STM32F4方案,支持霍尔,编码器,无感
- Dlink DIR-615L 和水星(mercury) MW300R桥接方法!
- 水果店的货源来自哪里,怎样做水果店找货源
- primeng的Tree初始化选中,实现联动效果
- 基于平均背景建模的运动目标检测
- nodejs和php性能,Nodejs 和PHP 性能测试结果
- mac 中 caps lock和control键交换,以及alt键替换option方法
- 安装瑞星全功能安全软件2009