前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ntp协议详解_ntp端口号能否被修改

ntp协议详解_ntp端口号能否被修改

作者头像
全栈程序员站长
发布于 2022-11-07 07:44:09
发布于 2022-11-07 07:44:09
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

本文将讲解NTP的代码实现和调试过程的一些记录。 首先,进行NTP报文结构体的构建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //宏定义
#define NTP_TIMESTAMP_DELTA 2208988800ull //number of seconds between 1900 and 1970,1900-1970的时间差
#define SEC_TIME_ZONE + (8*60*60) //Beijing,GMT+8, 时区差


typedef struct
{

    uint8_t li_vn_mode;      // Eight bits. li, vn, and mode.
                             // li. Two bits. Leap indicator.
                            // vn. Three bits. Version number of the protocol.
                            // mode. Three bits. Client will pick mode 3 for client.

    uint8_t stratum;         // Eight bits. Stratum level of the local clock.
    uint8_t poll;            // Eight bits. Maximum interval between successive messages.
    uint8_t precision;       // Eight bits. Precision of the local clock.

    uint32_t rootDelay;      // 32 bits. Total round trip delay time.
    uint32_t rootDispersion; // 32 bits. Max error aloud from primary clock source.
    uint32_t refId;          // 32 bits. Reference clock identifier.

    uint32_t refTm_s;        // 32 bits. Reference time-stamp seconds.
    uint32_t refTm_f;        // 32 bits. Reference time-stamp fraction of a second.

    uint32_t origTm_s;       // 32 bits. Originate time-stamp seconds.
    uint32_t origTm_f;       // 32 bits. Originate time-stamp fraction of a second.

    uint32_t rxTm_s;         // 32 bits. Received time-stamp seconds.
    uint32_t rxTm_f;         // 32 bits. Received time-stamp fraction of a second.

    uint32_t txTm_s;         // 32 bits and the most important field the client cares about. Transmit time-stamp seconds.
    uint32_t txTm_f;         // 32 bits. Transmit time-stamp fraction of a second.

} ntp_packet;              // Total: 48 bytes.

接着进行NTP报文数据的发送、接收、接收数据处理、时间打印。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void NTP_Func(void)
{
uint8_t addr[4]={
192,168,4,9};//本地模拟开启的一个服务器
uint8_t i;
uint8_t buf[48];
uint16_t port=0;
uint16_t *Pport=&port;
uint32_t local_timestamp; 
ntp_packet packet ;
struct tm * Net_time; 
uint8_t NTP_Data[48]; //48字节的报文
NTP_Data[0]=0xa3; 
//00100011, 0xa3,100 版本4
//00011011, 0x1b,011 版本3
//00010011, 0x13,010 版本2
//00001011, 0x0b,001 版本1
//后面分别发送了4个不同版本,都可以收到数据。
for(i=1;i<48;i++)NTP_Data[i]=0;//剩余的47字节为0
socket(3,Sn_MR_UDP,8080,0x00);//本地打开一个socket3,协议是UDP协议,端口是8080
sendto(3,NTP_Data,48,addr,123);//向addr的123端口发送报文,NTP使用的是UDP和123端口。
recvfrom(3,buf,48,addr,Pport);//接收返回的数据,48字节
//其中,sendto和recvfrom是w5500网口芯片自带的socket.c中的函数
//注意:UDP模式发送和接收使用sendto和recvfrom函数,TCP模式使用send和recv函数,当时调试时不知道,使用send和recv函数一直无法收到数据,卡了好久。
packet.txTm_s = buf[40]<<24 | buf[40+1]<<16|buf[40+2]<<8 |buf[40+3];//由于本文的时间精度要求不高,故自己用服务器返回的时间作为对时的时间,并未用公式:时间差offset=((T2-T1)+(T3-T4))/2。而是用T3作为对时基准时间。 
local_timestamp = packet.txTm_s - NTP_TIMESTAMP_DELTA;//减去1970和1900的差值
local_timestamp +=SEC_TIME_ZONE; //加上北京的时间差,GMT+8
Net_time = localtime(&local_timestamp); //秒数转换位标准时间,下一篇将详细讲解Time.h中的时间转换函数 
printf("%d-%d-%d %d:%d:%d\r\n",(Net_time->tm_year)+1900, (Net_time->tm_mon)+1, Net_time->tm_mday, Net_time->tm_hour,Net_time->tm_min,Net_time->tm_sec); //打印出时间
}

在主函数中调用void NTP_Func(void)打印出收到的时间。收到的时间如下:

自己电脑的123端口的打开方式见链接:https://zhidao.baidu.com/question/520907069418583765.html?qbl=relate_question_6&word=%D4%F5%C3%B4%CD%A8%B9%FD123%B6%CB%BF%DA%B2%E9%D1%AF%CA%B1%BC%E4&qq-pf-to=pcqq.c2c 打开123端口后,可以用网络调试助手小软件进行NTP的数据模拟,如下。

报文的第一个字节分别改为0x1b,0x13,0x0b,也是可以收到服务器返回的报文,说明UDP向老版本兼容。

NTP实例的源码:https://download.csdn.net/download/u014470361/10234803

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183316.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NTP协议详解_ntp是安全协议吗
NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多,比如微软的NTP对时服务器,利用NTP服务器提供的对时功能,可以使我们的设备时钟系统能够正确运行。
全栈程序员站长
2022/11/18
1.3K0
OpenvSwitch代码分析 - fastpath数据结构
本文以openvswitch 2.5.0源码,主要介绍用户态openvswitch代码相关分析,分析其设计的原因和精彩之处。
yateszhou
2019/12/06
1.6K0
ntp服务器udp协议,golang实现NTP协议获取服务器时间[通俗易懂]
NTP_SERVER_IP = “time.windows.com” /*NTP IP*/
全栈程序员站长
2022/09/27
4K0
ntp协议原理_ntp服务器连接失败
SNTP使用在RFC 1305 及其以前的版本所描述标准NTP时间戳的格式。与因特网标准标准
全栈程序员站长
2022/11/07
12.7K0
ICMP报文详解之ping实现「建议收藏」
ping是向网络主机发送ICMP回显请求(ECHO_REQUEST)分组,是TCP/IP协议的一部分。主要可以检查网络是否通畅或者网络连接速度快慢,从而判断网络是否正常。
全栈程序员站长
2022/08/24
3.1K0
ICMP报文详解之ping实现「建议收藏」
esp32之wifi-ipv6(转)
后续,会更新ipv6的ros2实现,转一下官方示例: #include "WiFi.h" #define STA_SSID "**********" #define STA_PASS "**********" #define AP_SSID "esp32-v6" static volatile bool wifi_connected = false; WiFiUDP ntpClient; void wifiOnConnect(){ Serial.println("STA Connected
zhangrelay
2021/12/02
8250
ESP8266调用NTP服务器进行时间校准
NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备的时间同步,以确保各个设备相互之间的时间协调一致。NTP服务器通常连接到具有高度精确时间源的设备,例如:GPS接收器或原子钟,以确保提供准确如一的时间。网络上的计算机可以通过连接到NTP服务器来同步其时间,并确保它们在同一时刻进行操作。
DS小龙哥
2023/07/08
1.2K0
ESP8266调用NTP服务器进行时间校准
golang ipc 通信_golang 2.0
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。
全栈程序员站长
2022/11/08
9960
golang ipc 通信_golang 2.0
张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器
时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题。古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间。随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一致的,这就导致每天经过的时间是不一样的。这点误差对于基本生活基本没有影响,但是对于股票交易、火箭发射等等要求高精度时间的场景就无法忍受了。科学家们开始把观测转移到了微观世界,找到了一种运动高度稳定的原子——铯,最终定义出了准确的时间:铯原子电子跃迁 9192631770 个周期所持续的时间长度定义为 1 秒。基于这个定义制造出了高度稳定的原子钟。
张高兴
2022/09/20
3.3K0
张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器
音视频协议-RTP协议
音视频传输的基石:RTP和RTCP。对于协议的讲解主要是是对于RFC文档的阅读和理解。不同的使用场景用到的字段也有所侧重,RTP和RTCP定义在RFC3550中。其中RTP用于数据流的传输;RTCP用于数据流的控制。可以说rtp/rtcp协议是即时通讯不可或缺的组成。RTCP协议介绍见:音视频协议-RTCP协议介绍
全栈程序员站长
2022/09/13
8410
音视频协议-RTP协议
golang时间和mysql时间表示
墙上时钟:也称为墙上时间。大多是1970年1月1日(UTC)以来的秒数和毫秒数。墙上时间可以和NTP(Network Time Protocal,网络时间协议)同步,但是如果本地时钟远远快于NTP服务器,则强制重置之后会跳到先前某个时间点。
golangLeetcode
2023/03/01
4.7K0
golang时间和mysql时间表示
教你动手写网络协议栈-UDP报文解析
用户使用UDP来传输数据是,UDP协议会在数据前加上首部组成UDP报文,并交给IP协议来发送,而IP层将报文封装在IP数据包中并交给底层发送,在底层中,IP数据报会被封装在数据的数据帧中,可看出一个用户数据要通过UDP报文发送,需要经历三次封装过程,如下图:
Rice加饭
2021/06/23
1.9K0
Android上GNSS Hal服务解析
源码路径:hardware/libhardware/include/hardware/gps.h
李小白是一只喵
2020/06/03
2.9K0
Linux系统开发: 学习Linux下网络编程
创建网络套接字,用于网络通信使用,类似于文件操作的open函数。该函数在服务器和客户端都会用到。
DS小龙哥
2022/01/27
3.7K0
Linux系统开发: 学习Linux下网络编程
Socket Sendto 可以传入不同的目的地址吗
通常我们认为 socket 中 地址信息 和 socket句柄 是一一对应的,不能往一个socket句柄中,传入不同的地址信息。
twowinter
2020/04/17
1.9K0
《嵌入式设备端的网络报文在wireshark显示》-- 原理篇
背景: 最近在项目中遇到一个问题,追溯WIFI模块是否丢包的问题。因为丢包的环节很多。 我所有用到平台场景:主控(跑LWIP协议栈)+ SDIO wifi。 在上面的场景中可能丢包的情况很多: wifi模块没有接收到网络报文(空中丢包)。 wifi模块没有发送网络报文成功(空中丢包)。 主控与wifi数据传输丢掉报文(SDIO传输丢包)。 在设备端如果通过串口打印查看丢包现象是非常麻烦的,网络报文很多,而且无法辨别是否丢包。 通过wireshark抓网络包,虽然可以清晰查看报文,但是无法判别wifi有没
Rice加饭
2022/05/10
8770
《嵌入式设备端的网络报文在wireshark显示》-- 原理篇
[置顶] linux网络编程之socket(十四):基于UDP协议的网络程序
一、下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器   #include <sys/types.h>  #include <sys/socket.h
s1mba
2017/12/28
1.8K0
[置顶]
        linux网络编程之socket(十四):基于UDP协议的网络程序
NTP 协议介绍_什么是UTC协议
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。
全栈程序员站长
2022/11/08
9990
【STM32H7】第6章 RL-TCPnet V7.X底层驱动说明
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=95243 第6章   RL-TCPnet底层驱动说明 本章节为大家讲解RL-TCPn
Simon223
2020/08/31
8150
LWIP使用解析_lwip tcp
一般来说struct rt_device paren是最终被用来向RT-thread进行注册的。 eth_rx 和eth_tx 这两个是比较重要的函数指针,需要再自己的驱动重来实现。
全栈程序员站长
2022/11/15
1.6K0
LWIP使用解析_lwip tcp
相关推荐
NTP协议详解_ntp是安全协议吗
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档