NTP配置為客戶端廣播監聽模式

前言

項目需求:

使能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 D3: 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> (結束點…