SNTP原理讲解 客户端 C语言实现

article/2025/8/22 0:07:41

1.定义

        SNTP(Simple Network Time Protocal简单网络时间协议),用于跨广域网或局域网同步时间的协议,具有较高的精确度(几十毫秒)

这里给出SNTP的详细定义和解释,以及基于C语言的SNTP客户端实现代码:SNTP code 实际测试过

小工具:IP查域名,地址;计算2个日期间的 间隔数值

1.1 SNTP与NTP区别:

1.SNTP协议相对于NTP,都是优化了网络传播延时的影响,但是没有像NTP一样考虑 冗余服务器 和 校正时钟频率误差功能

2.NTP可跨平台和跨系统,精度较高,1-50ms精度;提供认证机制,安全机制高

3.SNTP是NTP简化版本,精度在1s左右,SNTP通常与网络叶子节点设备进行时间同步

4.SNTP与NTP报文完全一致

1.1.1 SNTP采用client - server模式,使用单播/广播

1. 单播是定期与SNTP server交互获取时间差进行校时

2. 广播是SNTP server定期向多播地址发送时间信息,client监听多播地址来获取时间进行同步

1.2 SNTP校时原理

T1,T2,T3,T4均是时间戳,用以计算各自的时间差

t1与t2之间的时间差(包在网络上走了个来回):| [(T2-T1)-(T4-T3)] | / 2,此处的| | 表示取绝对值

数据包在网络上的传播时间: (T2-T1) + (T4-T3)

注意:NTP时间戳从1900年开始记秒数,而UNIX时间戳从1970年开始记秒数,即记录到NTP结构体中的时间要加上JAN_1970(1900到1970共70年的秒数),而从起获取出来需减掉JAN_1970

1.2.1 Demo例子

DeviceA与DeviceB在时间同步前,A:10:00:00am,B:11:00:00am,将B作为timeserver来校准A的时间,假设NTP报文在A和B之间单向传输所需要的时间为1s,B接收到发送出去也需要1s

A发NTP报文至B,带有10:00:00的时间戳,T1=10:00:00am;

NTP报文到达B后,B加上时间戳T2=11:00:01am;

NTP报文离开B时,B再加上时间戳T3=11:00:02am;

A收到NTP报文后,加上A本地的时间戳T4=10:00:03;

A与B时间差:[(T2-T1)-(T4-T3)]/2=1h

数据包在网络上的传播时间: (T2-T1) + (T4-T3)=2s

所以,client的真正的时间计算应该是 T3 + [(T4-T1)-(T3-T2)] / 2 = T3 + [(T2-T1)+(T4-T3)] / 2,即:T3 server 的时间戳 + 网络单程时延的数值即可

或者是 T4 + [(T2-T1)+(T3-T4)] / 2,不过还是上面的以T3来算的公式是最简明,最符合直观上的逻辑

1.3 NTP报文格式

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

0:无警告 

1:最后一分钟是61秒;

2:最后一分钟是59秒;

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

VN:表示NTP的版本号,长度为3比特,可以是3或者是4

0:保留1:对称主动2:对称被动3:客户
4:服务器5:广播6:保留为NTP控制信息7:保留为用户定义

stratum:指从stratum-1时间服务器(如从GPS取得的标准时间所存储的server) 至 client所经过的server个数,类似于路由器经过的跳数,数目越小,精度越高;只在服务器端有效,字段长度为8个比特(unsigned char型)

0:故障信息1:一级服务器2-15:二级服务器6-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位时间戳格式表示

lReceive Timestamp:指服务器收到客户请求的时间 ,以前面所述64位时间戳格式表示。

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

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

2. code结果测试验证

2.1 用wireshark抓到UE发出去的报文

UE只发了个Transmit timestamp这个时间戳给server

2.2 Server回复的SNTP报文

2.3 记录T1、T2、T3、T4各个时间点的数值

T1 = 1970.1.1 00:00:50.550999998

T2 = 2020.8.31 06:30:12.591166208 + 8h = 2020.8.31 14:30:12.591166208

T3 = 2020.8.31 06:30:12.591192346 + 8h = 2020.8.31 14:30:12.591192346

T4 = 根据tick得出ticks数值

然后 UE做打印,其公式为:T3 + [(T4-T1)-(T3-T2)] / 2

整数数值:1598884212

毫秒数值:718953

该数值为基准时间,即获取tick那一刻,对应的绝对时间相对于1970.1.1 00:00:00过了1598884212s718953ms

下面来分析下如何判断所的数值的正确性,注意:只能大致比较,因为100%正确的绝对时间是得不出来的,只能用上面的算法得出相对准确的时间进行同步。

网络单程时延:[(T4-T1)-(T3-T2)] / 2 = 127761ms

将T3的时间戳输入网页时间计算工具,得出的秒数差:1598884212.5,加上单程的网络时延,得到1598884212.718953,秒数的能从wireshark中得到验证,但毫秒数,由于计算得到的网络时延= 上行网络时延+下行网络时延,这里是将其两者看作等价的,所以直接除以2得到单程网络时延,所以在毫秒数值上有些许差异,很微小

开发中需注意点:

  1. 网络大端,UE小端的问题
  2. 得出UE与server之间时间差,还需+东八区8h时差,+UE开机的时间,再加上单程的网络时延,就是当前tick对应 北京标准时间 从1970.1.1 00:00:00所经过的时长数值
  3. 这段代码,按照最直接的思路:

    4.在第一次获取ticks后,需要FRAC2USEC(tv.tv_usec)一下,再转成大端发给server,因为: 2^32 /10^6,表示sntp_transmit_timestamp.fracpart这里面,每1ms, frapart=2^32 /10^6

 

 

附加:Python代码

#/usr/local/bin/python3.5
#coding:utf-8import socket, struct, time
NTP_server = "0.uk.pool.ntp.org"
TIME1970 = 2208988800def sntp_client():client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)data = "\x1b" + 47 * "\0"client.sendto(data.encode('utf-8'), (NTP_server, 123))data, address = client.recvfrom(1024)if data:print("Response received from:", address)t = struct.unpack('!12I', data)[10]t -= TIME1970print('\tTime=%s' % time.ctime(t))sntp_client()

 


http://chatgpt.dhexx.cn/article/8bvTtw34.shtml

相关文章

使用SNTP协议获取时间

要了解SNTP,首先需要了解NTP协议。SNTP是NTP的子集,简化了NTP的许多算法和步骤,得到了效率,但时间的精度不如NTP,可是对于民用时间来说足够了,大概最多差距几秒的样子。 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服…

sntp协议简介

SNTP(Simple Network Time Protocal简单网络时间协议),用于跨广域网或局域网同步时间的协议,具有较高的精确度(几十毫秒)。SNTP是NTP协议的简化版,两者分别在RFC1305和RFC2030介绍。 SNTP工作方式 SNTP采用客户端/服务…

关于马尔可夫过程的一些学习笔记

①马尔可夫性质:已知“现在”的情况下,“未来”与“过去”彼此独立(N1仅与N有关,与N以前的所有都无关) ②马尔可夫过程:具有马尔可夫性质的随机过程 ③马尔可夫链:马尔可夫过程的原始模型&…

来聊聊马尔可夫过程

相信你对马尔科夫这个词一定不陌生,因为在人工智能机器学习领域,这个词是避不开的,如马尔可夫链(Markov chain),马尔科夫随机场(Markov random field),马尔可夫过程(Markov process),隐马尔可夫…

【算法学习】马尔可夫过程及经典例题讲解(含代码实现)

公众号关注 52DATA ,获得更多数据分析知识,感谢支持—> 文章目录 马尔可夫过程1. 马尔可夫性2. 马尔可夫链2.1 转移概率矩阵(随机矩阵)2.2 状态概率2.3 平稳分布 3.一个很经典的例题帮助理解马尔科夫预测方法1.求状态转移概率2.运用状态概…

数学基础(8)-- 马尔可夫链与马尔可夫过程

目录 1. 简介 1.1 定义 1.2 变种 2. 瞬态演变 3. 马尔科夫链性质 3.1 可还原性 3.2 周期性 3.3 重现性 4. 有限状态空间 1. 简介 马尔可夫链(英语:Markov chain),又称离散时间马可夫链(discrete-time Markov…

部分可观测马尔可夫过程POMDP

POMDP与MDP的一句话区别:POMDP的state具有不确定性,由七元数组定义,多了观测空间、观测函数、初始置信(belief),根据观测概率矩阵求出最可能是的状态 利用值迭代法解决POMDP问题 MDP POMDP 状态→动作 信…

马尔可夫 java_马尔可夫过程(以马尔科夫链Markov为例)

马尔可夫过程(以马尔科夫链Markov为例) 马尔可夫过程 马尔可夫过程的大概意思就是未来只与现在有关,与过去无关。 简单理解就是渣男只在乎下一刻会不会爱你只取决于这一时刻对你的新鲜感,而与你之前对这段感情的付出毫无关系。 设有一个随机过程X(t)&…

马尔可夫决策过程

马尔可夫决策过程 一、马尔科夫决策过程:**马尔科夫决策过程****最优决策**值迭代策略迭代MDP中的参数估计 二、代码实战:A、马尔可夫决策过程值迭代B、马尔可夫决策过程策略迭代C、马尔可夫决策过程动态规划版 参考文章 本文介绍了马尔可夫决策过程&…

随机过程第2讲——马尔可夫过程的应用

温习:随机过程第1讲——泊松过程的模拟与检验:https://blog.csdn.net/ChenQihome9/article/details/82871332 去得也突然——不知在什么时候,雨,悄悄地停了。风也屏住了呼吸,山中一下变得非常幽静。远处,一…

强化学习(2): 马尔可夫过程

前言 本文重点介绍MDP,因为MDP是目前最适合表征强化学习问题的模型。 一个具体的赌徒例子,来说明强化学习的算法如何与MDP构建联系,并且求解出最优策略。链接如下:link 一、马尔可夫性 其假设未来的状态仅取决与当前的状态。过…

贝叶斯网络、马尔可夫模型、马尔可夫过程、马尔可夫链、马尔可夫网络基本概念

知识储备与简要概括 可数集【Countable set】: 是指每个元素都能与自然数集N的每个元素之间能建立一一对应的集合。如果将可数集的每个元素标上与它对应的那个自然数记号,那么可数集的元素就可以按自然数的顺序排成一个无穷序列a1,a2&#…

强化学习笔记:马尔可夫过程 马尔可夫奖励过程

1 马尔可夫性质 (Markov Property) 我们设状态的历史为(包含了之前的所有状态) 如果一个状态转移是符合马尔可夫性质的,也就是满足如下条件: 也就是说,从当前状态转移到状态的概率,就…

马尔可夫性质、马尔可夫链和马尔可夫过程

关注:灰质,有趣有料的AI技术分享 前言 研究决策问题就一定听说过马尔可夫过程(Markov Process),这是一类非常重要的方法。现在非常热门的强化学习都是基于马尔可夫过程方法建立的。马尔可夫决策过程是研究随机序贯决策…

1.3 马尔可夫过程

之前介绍的奖励、智能体、动作、观察和环境可以看成RL的一级概念。以此为基础,我们将探索RL的二级概念,包括状态(state)、事件(episode)、历史(history)、价值(value&…

一文看懂马尔科夫过程

1.马尔科夫决策过程(MDPs)简介 马尔科夫决策过程是对强化学习(RL)问题的数学描述。几乎所有的RL问题都能通过MDPs来描述: 最优控制问题可以用MDPs来描述;部分观测环境可以转化成POMDPs;赌博机问题是只有一个状态的MDPs;注:虽然大部分DL问题都能转化为MDPs,但是以下所描述…

马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP

引言 在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷马尔可夫得名。马尔可夫过程是不具备记忆特质的(memorylessness)。换言…

零基础学习python数据分析,需要掌握哪些技能?

对于刚刚入行的小白同学来说,在学习python的过程中,一定会遇到一些疑问。比如说: 学习Python需要多久? 学习Python需要达到什么样的程度? 学Python的书籍有哪些? 为了处理数据集,我需要精通…

Python数据分析期末复习归纳

python数据分析期末复习归纳(更新中) 文章目录 python数据分析期末复习归纳(更新中)前言一、python语言基础二、内建数据结构、函数、文件(重点)元组列表内建序列函数字典函数 三、Numpy基础(重…

Python数据分析师特训营84节

刚看完了小破站的一个数据分析的课程: “2020年Python数据分析师特训营全套84节视频完结版(就业向/零基础友好)” 趁着热乎劲儿,想记录一下课程讲到的关于python的基础知识,还有numpy、pandas、matplotlib(数据分析三大利器)工具…