0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ntp的实现原理是什么

麦辣鸡腿堡 来源:UndefinedReference 作者:jinbao.tang 2023-10-27 14:21 次阅读

ntp实现原理

我们看一下为啥说ntp从实现时间同步的角度来说是很简单的。在pc上,以windows为例,手动关闭打开一下自动更新时间,会触发一次ntp时间同步。

这个时候,我们可以拿到ntp完整的request/response报文,如下:

ntp client request:

图片

ntp server response:

图片

如上图,我们可以看到,我们可以拿到同步原理提到的t1, t2, t3;而t4是client接收到server response时的时间,那么上述时间分别是如何来的呢。

* t1: client发送request的前一刻,记下当前utc时间,然后塞入到request transmit timestamp中去。但是这个不能作为真正的t1来使用,因为前面提到了,ntp是使用的udp,所以有可能会丢包。因此真正的t1应该ntp server收到client request时,从request报文中提取到t1,最后再给到client使用。也就是上图的t1。
* t2: 也就是server收到client request的时间
* t3: server发送response的时间
* t4: client收到server response的时间
  
  知道这些原理之后,我们就可以很好设计出我们的代码实现思路,如下:
 

C++                  
//ntp client                  
// send request with t1                  
std::chrono::time_point_cast(          
        std::chrono::system_clock::now());          
std::time_t time_stamp = time_point.time_since_epoch().count();          
request_message_- >SetTransTs(time_stamp);          
int ret = SendMsg(request_message_- >GetData(), MESSAGE_LENGTH);          


// receive response, and get t1, t2, t3          
int ret = RecvMsg(request_message_- >GetData(), MESSAGE_LENGTH);          
auto req_tx_ts_ = response_message_- >GetOriginTs();  // t1          
auto req_rx_ts_ = response_message_- >GetRecvTs();    // t2          
auto resp_tx_ts_ = response_message_- >GetTransTs();  // t3          
auto time_point = std::chrono::time_point_cast(          
        std::chrono::system_clock::now());          
std::time_t time_stamp = time_point.time_since_epoch().count();          
auto resp_rx_ts_us_ = static_cast(time_stamp);  // t4            

auto offset =            
        req_rx_ts_us_ - req_tx_ts_us_ + resp_tx_ts_us_ - resp_rx_ts_us_;            
offset /= 2;            

// adjust the clock            
AdjustClock(offset);
C++                  
// ntp server                  
// receive ntp request message                  
RecvMsg(request_message_- >GetData(), MESSAGE_LENGTH);                  
// get receive request_frame timestamp, get t1, t2                  
auto time_point = std::chrono::time_point_cast(          
        std::chrono::system_clock::now());          
auto req_rx_ts = time_point.time_since_epoch().count();//t2          
auto req_tx_ts = request_message_- >GetTransTs();//t1          

// send ntp response message          
response_message_- >SetOriginTs(req_tx_ts);//t1          
response_message_- >SetRecvTs(req_rx_ts);//t2          
auto time_point = std::chrono::time_point_cast(          
        std::chrono::system_clock::now());          
auto resp_tx_ts = time_point.time_since_epoch().count();          
response_message_- >SetTransTs(resp_tx_ts);//t3          
SendMsg(response_message_- >GetData(), MESSAGE_LENGTH);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 车载
    +关注

    关注

    17

    文章

    565

    浏览量

    83101
  • 时间同步
    +关注

    关注

    1

    文章

    83

    浏览量

    9852
  • 时钟同步
    +关注

    关注

    0

    文章

    72

    浏览量

    12618
  • NTP
    NTP
    +关注

    关注

    1

    文章

    93

    浏览量

    13779
收藏 人收藏

    评论

    相关推荐

    基于NTP的高精度时钟同步系统实现

    基于NTP的高精度时钟同步系统实现Windows操作系统内置的NTP授时精度不高,分辨率最高只有10 ms。给出一个基于Windows操作系统的计算机网络同步时钟实现方案,该方案可以有
    发表于 09-19 09:21

    NTP服务的搭建方法

    NTP服务搭建服务端安装检查是否安装NTP [root@jie ~] # rpm -q ntp ntp-4.2.2p1-7.el5安装方式NTP
    发表于 07-15 07:17

    CentOS的ntp服务器搭建

    ntp】CentOS上搭建ntp服务器,并实现时间同步
    发表于 03-20 11:18

    NTP协议简介

    一、NTP协议简介  网络时间协议NTP(Network Time Protocol)的主要开发者是美国特拉华大学的MILLS David L教授设计实现的,由时间协议、ICMP时间戳消息及IP时间
    发表于 07-29 06:50

    通过NTP获取Epoch/Unix时间NTP代表网络时间

    通过NTP获取 Epoch/Unix时间NTP代表“网络时间协议”,它是用于在计算机系统之间进行时钟同步的网络协议。 换句话说,它用于同步网络中的计算机时钟时间。本文将介绍如何使用带Arduino
    发表于 01-27 06:03

    求解关于AT ESP8266 无法实现NTP时间同步的问题?

    联网,本以为可以大功时,却发现NTP无法同步。关于NTP配置的各种文档看了很多,使用都很简单,没有特殊的配置要求。但是搞了一下午没有任何进展。希望各位前辈帮忙分析。如上图,组件全部加载成功,NTP已经
    发表于 03-15 14:36

    NK-980IoT评测EMAC功能模块(二)

    IEEE1588介绍IEEE1588是网络精密时钟同步协议也称PTP,利用传统的NTP实现的能PTP能达到s级,利用EMAC带IEEE1588的芯片比如NUC980应当能达到ms级甚至更高,也有PYH带时钟的如DP83640。
    发表于 04-08 14:49

    基于NTP的网络时统系统的实现

    本文基于NTP 协议针对某具体广域网的结构特点和应用需求进行了网络时统系统的框架设计,并根据具体应用给出了实现算法,通过编程实现和网络构建得到的仿真实验结果,验证
    发表于 09-12 16:53 62次下载

    NTP53321G0JTZ NXP Semiconductors NTP5312和NTP5332 NTAG® 5链路

    电子发烧友网为你提供NXP(ti)NTP53321G0JTZ相关产品参数、数据手册,更有NTP53321G0JTZ的引脚图、接线图、封装手册、中文资料、英文资料,NTP53321G0JTZ真值表,
    发表于 10-23 19:06

    实现嵌入式linux自动同步网络时间---NTP

    因为ARM板断电重启问题,为保证能获取到准确的实时时间,所以需要实现自动从网络上获取时间,这就需要用到NTPNTP是网络时间协议(Network Time Protocol)的简称,它是用来同步网
    发表于 11-02 09:36 12次下载
    <b class='flag-5'>实现</b>嵌入式linux自动同步网络时间---<b class='flag-5'>NTP</b>

    实现嵌入式linux自动同步网络时间---NTP

    <p>因为ARM板断电重启问题,为保证能获取到准确的实时时间,所以需要实现自动从网络上获取时间,这就需要用到NTPNTP是网络时间协议(Network Time
    发表于 11-02 13:51 15次下载
    <b class='flag-5'>实现</b>嵌入式linux自动同步网络时间---<b class='flag-5'>NTP</b>

    docker部署NTP时间服务器chrony

    chrony是网络时间协议 (NTP) 的通用实现。它可以将系统时钟与 NTP 服务器、参考时钟(例如 GPS 接收器)以及使用手表和键盘的手动输入同步。
    的头像 发表于 01-10 09:22 319次阅读

    Linux上怎么配置NTP时间同步呢?

    Linux上怎么配置NTP时间同步呢? NTP是一种用于同步计算机系统时钟的网络协议。在Linux系统中,配置NTP时间同步可以保证系统与网络时间服务器的时间一致性,使系统中各个进程的时间保持一致
    的头像 发表于 01-16 16:03 478次阅读

    NTP服务器介绍

    NTP服务器 产品介绍: NTP服务器是—款基于CPLD的高精度时频同步设备。该设备接收GPS、北斗卫星信号,或母钟信号,通过踉踪锁定外部信号驯服内部晶振,采用智能时间优化算法,为用户提供精确、稳定
    的头像 发表于 01-17 09:30 273次阅读
    <b class='flag-5'>NTP</b>服务器介绍

    ntp的同步原理是什么

    NTP(Network Time Protocol,网络时间协议)是一种用于同步计算机系统时间的协议。那么ntp的同步原理是什么呢? ntp最典型的授时方式是Client/Server方式,如下
    的头像 发表于 01-19 17:24 477次阅读
    <b class='flag-5'>ntp</b>的同步原理是什么