前言

项目需求:

使能ntp为客户端模式,能监服务端广播模式发出的ntp报文,计算出服务端的时间与客户端的时间偏差并上报。

开发状况:

交叉编译ntp源码,将修改后的ntpd进程部署到设备上作为客户端完成项目需求

如何操作?

首先应该知道ntp客户端广播监听模式处理逻辑

ntp客户端监听广播ntp处理逻辑:

找到如下资料:
image

image

总结一下:
ntp客户端模式下监听广播ntp,先被动接收报文,接收第一个报文后进行一次单播,算出网络延迟,后续一直处于监听状态。
也就是说,要想实现ntp广播监听,先要保证单播监听能正常使用

首先查看单播监听能否使用:

配置ntp.conf为最简单的单播客户端:

server 192.168.1.52
restrict 127.0.0.1
restrict ::1

设置ntp服务端为单播模式,将客户端ntpd进程运行至前台查看解析情况:
用tcpdump监听发现客户端能收到数据,但是解析数据时发现T1时间不一致的情况,报错如下
image
这就要了解一下单播原理了

单播原理:

计算原理:
企业微信截图_17569684284729
wireshake上对应关系:
企业微信截图_17573216517480

单播不再过多阐述了。使用tcpdump在客户端抓取ntp包,并查看分析问题到底出现在了哪里:
企业微信截图_17573008328096

通过抓包发现,客户端时间戳T1在发送给服务端后被更改了,导致客户端收到包后发现T1更改后,认为这个是个无效包,将报文丢掉。

原因:
客户端发送请求时会将自己的时间搓T1封装到发送报文里,服务端接收到数据后,发送报文给客户端后,客户端会先检查原来的T1有没有被更改,若被更改,那么该包会被丢弃
上述我遇到的情况,是客户端请求的时候T1与wrieshake中抓到的T1报文不一样,导致客户端收到服务端报文的时候发现T1对不上,将包丢掉导致单播失败
原因是ntp应用层发送的时间系统为了提高精度,在OS层被改掉了,导致T1对不上,
解决方法:
更改源码#define M_ISEQU 对比宏定义,比较逻辑,秒上时间相等就通过,不再比较秒下时间了

至此单播模式便能使用了

广播模式配置:

客户端单播监听没问题就能实现广播了
客户端配置为广播模式最简单的conf配置如下:

broadcastclient
restrict 127.0.0.1
restrict ::1

服务端启动广播模式,开始查看客户端监听log日志,果然出了问题,广播模式只监听不做上述单播请求
经过对日志结合源码的分析发现:
问题出在没有配置身份验证,ntp源码receive函数对接收到的报文会先判断一下报文类型,具体在receive函数中的switch(retcode)模块下的case AM_NEWBCL语句下会检查广播报文是否有身份验证,没有验证则直接退出,我这边代码中这个身份验证默认是开启的。
解决方法:
要么配置身份验证,要么不做身份验证,我的是在init_proto函数中将sys_authenticate置0也就是不检查身份验证信息

修改好后再次启动ntpdf发现广播监听成功!

企业微信截图_17573211668964
客户端被动接收服务端报文信息,接收服务端报文后进行一次单播,主要是算出网络延迟,后续一直进入广播被动接收
企业微信截图_17573213805380
企业微信截图_17573212798618

至此我的ntp客户端使能广播监听成功。

源码重要函数补充:

ntp_proto.c文件中:

receice(struct recvbuf*rbuf) 此函数用于接收ntp报文做一些判断,查看报文是否符合要求
process_packet() 这个函数非常重要receive函数内部校验完毕后会在内部调用一此此函数,此函数主要是根据t1 ~t4算出偏差等信息,只要报文能进入这个函数,基本就说明监听成功了transmit() 此函数用于发送报文
peer_xmit() 此函数用于封装报文,在transmit内部被调用,封装好报文后发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96139.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96139.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96139.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Claude-Flow 使用指南

Claude-Flow 不仅仅是一个工具,更是一个强大的AI驱动开发编排平台。本问初步带您深入了解 Claude-Flow v2.0.0 Alpha 的强大功能,助您在AI开发领域如虎添翼。1. 简介:什么是 Claude-Flow? Claude-Flow v2 Alpha 是一个企业级的AI编…

系统梳理 Test-Time Compute 的主要实现路径

编者按: AI 真的在“思考”吗?当模型面对数学推理、代码生成或复杂决策时,它是如何一步步推演出答案的?如果你曾困惑于大模型在关键任务中表现不稳定、缺乏可解释性,甚至生成结果难以验证,那么你并不孤单。…

vue 经常写的echarts图表模块结构抽取

vue 经常写的echarts图表模块结构抽取将项目中经常写的结构抽取一下, 方便以后用 表头包含标题和右侧操作部分下面为图表 <div class"chartBox"><div class"chartheadbox"><div class"chartheadleft">这是图表标题</div>…

主流的开源协议(MIT,Apache,GPL v2/v3)

文章目录1. MIT 协议 (MIT License)2. Apache 2.0 协议 (Apache License 2.0)3. GPL v2 协议 (GNU General Public License v2)“开源协议选择指南”的流程图 flowchart TDA[开始选择开源协议] --> B{是否要求修改后必须开源?<br>(是否具有 传染性?)};B -- 是&…

CameraService笔记

cameraservicecamera 结构图1. 启动CameraServer1.1 注册media.camera服务1.2 构造CameraService1.3 CameraService::onFirstRef1.4 CameraService::enumerateProviders&#xff1a;前置准备知识1.4 CameraService::enumerateProviders&#xff1a;Provider和Device初始化1.4.1…

MacOS 15.6 编译SDL3 Android平台多架构so库

成功编译输出: 编译: Android平台多架构编译脚本: sdl3_android_build.sh #!/bin/bash# 设置变量 macos 其他系统需要更改路径 SDL_SOURCE_DIR=$(pwd)/SDL BUILD_DIR=${SDL_SOURCE_DIR}/../sdl3_build_android NDK_PATH=$HOME/Library/Android/Sdk/Ndk/25.2.9519653 CMAKE…

Real-IAD D³: A Real-World 2D/Pseudo-3D/3D Dataset for Industrial Anomaly

Real-IAD D: A Real-World 2D/Pseudo-3D/3D Dataset for Industrial Anomaly Detection Paper Github 摘要 随着工业异常检测&#xff08;Industrial Anomaly Detection, IAD&#xff09;复杂程度的不断提升&#xff0c;多模态检测方法已成为机器视觉领域的研究焦点。然而&a…

IT需求提示未读信息查询:深度技术解析与性能优化指南【类似:钉钉已读 功能】

IT需求提示未读信息查询&#xff1a;深度技术解析与性能优化指南【类似&#xff1a;钉钉已读 功能】 DROP TABLE IF EXISTS rs_kpi_it_need_tip; CREATE TABLE IF NOT EXISTS rs_kpi_it_need_tip (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID&#xff…

Django中的软删除

软删除&#xff08;Soft Delete&#xff09;是一种数据删除策略&#xff0c;它并不真正从数据库中删除记录&#xff0c;而是通过标记&#xff08;如 is_deleted 字段&#xff09;来表示记录已被删除。 这样做的好处是可以保留数据历史&#xff0c;支持数据恢复和审计。 在 Djan…

JavaEE 进阶第四期:开启前端入门之旅(四)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、常用CSS 1.1. border 1.2. width/height 1.3. padding&#xff1a;内边距 1.4. margin&#xff1a;外边距 二、初始JavaScript 2.1. JavaScript是什么 2.2. 发展历史 2.3. JavaScript 和 HT…

学习日记-SpringMVC-day49-9.4

知识点&#xff1a;1.RequestMapping&#xff08;3&#xff09;知识点核心内容重点RequestMapping注解的parameters属性通过parameters指定请求参数条件&#xff08;如bookID&#xff09;&#xff0c;控制请求匹配规则&#xff08;必须包含/排除特定参数或值&#xff09;参数存…

【Day 50 】Linux-nginx反向代理与负载均衡

概述在现代 Web 架构中&#xff0c;Nginx 作为高并发、高性能的 HTTP 和反向代理服务器&#xff0c;被广泛应用于提升服务性能、增强系统安全性和实现负载均衡。其中&#xff0c;反向代理能够隐藏后端服务器信息并优化请求处理流程&#xff0c;负载均衡则可将请求分发到多个后端…

vue中配置 ts

在 Vue 项目中配置 TypeScript&#xff08;TS&#xff09;可以提升代码的类型安全性和开发体验。以下是在 Vue 项目&#xff08;基于 Vite&#xff09;中配置 TypeScript 的详细步骤和关键配置&#xff1a; 一、创建支持 TypeScript 的 Vue 项目 如果是新建项目&#xff0c;推…

阿里云镜像地址获取,并安装 docker的mysql和nginx等服务,java,python,ffmpeg,go等环境

阿里云那个镜像地址获取 阿里云镜像加速器不是一个通用的 registry.cn-hangzhou.aliyuncs.com&#xff0c;而是你账号专属的&#xff0c;比如这样&#xff1a; https://abcd1234.mirror.aliyuncs.com&#x1f449; 登录阿里云控制台获取&#xff1a; 阿里云镜像加速器 然后替…

conda环境导出

1. 激活你想要打包的环境首先&#xff0c;确保你激活了你要打包的 conda 环境&#xff1a;conda activate qwen2. 导出环境配置使用 conda 命令将当前环境的配置导出为一个 .yml 文件&#xff0c;记录下环境中所有的依赖和版本&#xff1a;conda list --export > techgpt_en…

openEuler2403安装部署Kafka

文章目录 openEuler2403安装部署Kafka with KRaft一、前言1.简介2.架构3.环境 二、正文1.部署服务器2.基础环境1&#xff09;JDK 安装部署2&#xff09;关闭防火墙 3.单机部署1&#xff09;下载软件包2&#xff09;修改配置文件3&#xff09;格式化存储目录4&#xff09;单机启…

发布工业智能体,云从科技打造制造业AI“运营大脑”

近日&#xff0c;在2025世界智能产业博览会重庆市工业智能体首发仪式现场&#xff0c;云从科技重磅发布经营决策-产线运营智能体&#xff0c;为制造业的智能化转型提供了全新的解决方案。该智能体的亮相&#xff0c;不仅代表着人工智能技术在工业领域的深度应用&#xff0c;更标…

【Linux基础】parted命令详解:从入门到精通的磁盘分区管理完全指南

目录 前言 1 parted命令概述 1.1 什么是parted 1.2 parted与fdisk的对比 1.3 parted的主要优势 2 parted命令的安装与基本语法 2.1 在不同Linux发行版中安装parted 2.2 parted的基本语法 2.3 parted的工作模式 3 parted交互式命令详解 3.1 交互式操作流程 3.2 主要…

如何在路由器上配置DHCP服务器?

在路由器上配置DHCP服务器的步骤因品牌&#xff08;如TP-Link、华为、小米、华硕等&#xff09;略有差异&#xff0c;但核心流程一致&#xff0c;主要包括登录管理界面、开启DHCP功能、设置IP地址池及相关参数。以下是通用操作指南&#xff1a; 一、准备工作 确保电脑/手机已连…

HTML和CSS学习

HTML学习 注释 <!-- -->组成 告诉浏览器我是html文件<!DOCTYPE html> <title>浏览器标签</title> <body> <!--- 其中是主要内容 ---> <p> 段落 </p> </body> </html> (结束点…