IP層之分片包的整合處理---BUG修復

在之前章節中,筆者就IP層之分片包的整合處理進行了概念介紹,以及代碼編寫和仿真,在整體代碼調試環節,筆者發現了一個問題,在本文中,筆者將就這個BUG進行說明,以及進行修復,講解代碼實現思路,驗證代碼邏輯正確性
在這里插入圖片描述
注意看圖片中的框選文字,這里說明,如何確定這是一個單幀包,這里的確定單幀包邏輯是不存在問題,但是直接將UDP報文輸出是存在問題的,因為即使確定了當前輸入進來的數據報文不是分片包,但該報文的的上一幀報文,可能是分片包,而由于分片包要進行巨型幀組合后輸出,其報文長度可能為9000字節以上(假設),那么當前幀報文傳輸來時,巨型幀報文可能尚未傳輸完成,此時的輸出數據總線是被巨型幀報文占用的。而根據輸出賦值的優先級,會出現,巨型幀輸出不完全,被新一幀數據報文頂替輸出,以及當前報文優先級低,無法獲得總線使用權,報文丟失,所謂的優先級,即是在一個時序控制邏輯內,else if的上下級,當兩個else if語句滿足時,總是先執行最上面的else if語句,單純的文字解釋這個問題,可能會給讀者的理解造成混亂,筆者接下來就流程示意框圖、代碼仿真波形兩方面展現這類情況,使得讀者更加清晰的理解這些邏輯

在這里插入圖片描述
上圖所示,便是一種情況,在RAM中整合了三包分片數據包之后,進行數據幀輸出,此時接連來了兩包單包
此時,這兩個單包按照之前的邏輯是會頂替當前包輸出的,造成數據混亂,代碼仿真如下圖所示
在這里插入圖片描述
在這里插入圖片描述
圖片一模擬了流程圖中的情況,而圖片二中則顯示了這樣的數據流動出現的問題,接下來將就這種現象進行解決方案的思考。
顯然,為了避免這種情況,需要判斷此時的數據輸出總線是否被占用,如果數據輸出總線被占用,則應該緩存本幀數據,待到數據輸出總線空閑,再進行數據的讀取,同時,若是數據到來時,數據輸出總線是空閑的,則不需要緩存數據,直接進行輸出,減少不必要的時間浪費。
那么還有一個問題,數據輸出總線被占用期間,可能有多幀數據到來,都需要被緩存,那么數據長度同樣應該被緩存,在本處理模塊中不涉及數據類型,因為其下一級在本設計中一定屬于UDP報文,所以不考慮數據類型的緩存,當涉及TCP/UDP兩種報文時,會就IP_RX模塊中的輸出信號進行添加,這在之后講解的TCP協議棧實現中,會進行具體介紹,大家可以點個關注,后續會有更多文章分享。
對于這些單幀數據包,使用FIFO進行數據緩存,使得邏輯處理簡單,同時還需要注意一個問題,每次讀取指定長度后,還需要暫緩下一幀數據的輸出,避免背靠背傳輸,對數據總線處理的壓力。

代碼的主要難點是以下幾方面

  1. 緩存分片數據包,并在緩存完成后進行輸出
  2. 在分片數據包輸出過程中,多個單包數據包到來,緩存至FIFO
  3. 在單包數據包輸出過程中,再次到來單包數據包(因為分片包導致的數據堆積)緩存至FIFO
  4. 兩個單包從FIFO中讀出時,輸出間隔問題,保證輸出間隔大于10個周期,減輕后續處理壓力,以及背靠背傳輸導致數據包輸出長度計算錯誤問題
  5. 評定各種情況優先級,合理規劃緩存以及讀取
  6. 針對以上難點,應該多進行代碼仿真,找出時序存在問題中,進行對應修改,多仿真是寫出好代碼的關鍵

整體仿真測試時序:

  1. 首先發送3472字節的巨型幀,分三次發送1480–1480–512
  2. 之后發送512字節單包,多次128字節單包–在巨型幀尚未緩存完畢以及巨型幀尚未輸出完成
  3. 之后發送128字節單包–在輸出總線輸出單包數據時
  4. 最后發送128字節單包-在輸出總線空閑時候
initial begin#200/*ip frag*/@(posedge i_udp_clk)ip_frag_send(0,'d1480,1,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d1480,1,185);#400@(posedge i_udp_clk)ip_frag_send('d0,'d512,0,370);#400@(posedge i_udp_clk)ip_frag_send('d0,'d512,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#400@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#20000@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);#20000@(posedge i_udp_clk)ip_frag_send('d0,'d128,0,0);
end

情況一:對應仿真情況如下,可以看出分片包成功組合,數據長度3472字節,輸出時序正確。

在這里插入圖片描述
情況二:對應仿真情況如下,可以看出在巨型幀緩存輸出完成后,被緩存的單幀數據包成功進行輸出。

在這里插入圖片描述

情況三:對應仿真情況如下,可以看出在輸出單包數據完成后,在單包數據輸出期間被緩存的單幀數據包成功進行輸出。

在這里插入圖片描述
情況四:對應仿真情況如下,可以看出在總線空閑期間到的數據包,被直接輸出,不需經過緩存。

在這里插入圖片描述
經過上述仿真模擬各種可能出現的情況,經驗證后,輸出時序正確,不會出現數據錯誤、覆蓋、丟失等現象。
關于本次代碼的實現、調試思路。大家有什么問題歡迎在評論區中進行討論,有哪些考慮不到的地方,也請大家批評指正,可以關注下作者,后續會進行更多技術文章分享。
在下一章節中,筆者會將之前介紹的模塊進行整合,組合成最終的UDP協議棧,當然,還不包括PHY層的處理,關于PHY層的處理,筆者也會在之后的章節進行介紹,以及UDP的上層及應用層協議,如IEEE1588,筆者也會進行介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897739.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修復Electron項目Insecure Content-Security-Policy(內容安全策略CSP)警告的問題

將以下代碼粘貼進html的<header>標簽內 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解釋一下上面代碼中的屬性含義 default-src self&#xff1a;配置加載策…

linux 的免密切換用戶PAM配置

/etc/pam.d/su是Linux系統中與用戶切換&#xff08;su命令&#xff09;相關的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔認證模塊&#xff09;配置文件。以下是對它的詳細介紹&#xff1a; 簡介 作用 PAM是一種用于管理系統認證的機制&#xff0c;…

pyspark 數據處理的三種方式RDD、DataFrame、Spark SQL案例

目錄 一、淺語二、三種數據處理方式比較2.1 RDD2.2 DataFrame2.3 Spark SQL 三、三種方法的創建方式3.1 創建RDD3.2 創建DataFrame3.2.1 創建sqlContext3.2.2 定義Schema3.2.3 創建DataFrame 3.3 創建SparkSQL3.3.1 登錄臨時表3.3.2 使用sparkSQL 四、三種方法顯示部分字段4.1 …

文件解析漏洞靶機---- 練習通關攻略

1.安裝靶機 點擊 hackme.ova 文件&#xff0c;直接導入虛擬機&#xff0c;選擇存儲位置 2. 開啟靶機 3. kali掃描同C段的ip&#xff0c;找到靶機ip nmap 192.168.182.1/24 經判斷&#xff0c;靶機ip為&#xff1a;192.168.182.157 開啟端口 http 80 、ssh 遠程連接 22 4…

信號處理抽取多項濾波的數學推導與仿真

昨天的《信號處理之插值、抽取與多項濾波》&#xff0c;已經介紹了插值抽取的多項濾率&#xff0c;今天詳細介紹多項濾波的數學推導&#xff0c;并附上實戰仿真代碼。 一、數學變換推導 1. 多相分解的核心思想 將FIR濾波器的系數 h ( n ) h(n) h(n)按相位分組&#xff0c;每…

【大模型基礎_毛玉仁】2.3 基于 Encoder-only 架構的大語言模型

更多內容&#xff1a;XiaoJ的知識星球 目錄 2.3 基于Encoder-only 架構的大語言模型2.3.1 Encoder-only 架構2.3.2 BERT 語言模型1&#xff09;BERT 模型結構2&#xff09;BERT 預訓練方式3&#xff09;BERT 下游任務 2.3.3 BERT 衍生語言模型1&#xff09;RoBERTa 語言模型2&a…

AIP-165 按條件刪除

編號165原文鏈接https://google.aip.dev/165狀態批準創建日期2019-12-18更新日期2019-12-18 有時API需要提供一種機制&#xff0c;按照一些過濾參數刪除大量資源&#xff0c;而非提供待刪除的各資源名字。 這是一個稀有的場景&#xff0c;用于用戶一次性刪除數千或更多資源的…

【Maven教程與實戰案例】

文章目錄 前言一、Maven是什么&#xff1f;二、Maven的安裝與配置1. 安裝前置條件2. 下載與配置 Maven3. 驗證安裝 三、Maven的核心概念1. POM.xml 文件2. 構建生命周期與插件機制 四、實戰項目示例1. 項目目錄結構2. 編寫代碼App.javaAppTest.java 3. 構建項目4. 運行項目 前言…

20250310:OpenCV mat對象與base64互轉

代碼: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 實操:

概率論的基本知識

逆概率還不懂&#xff0c;改天再想想。 聯合概率 聯合概率&#xff08;Joint Probability&#xff09; 是概率論中的一個重要概念&#xff0c;用于描述多個隨機變量同時取某些值的概率。聯合概率可以幫助我們理解多個變量之間的關系。

pytest數據庫測試文章推薦

參考鏈接&#xff1a; 第一部分&#xff1a;http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分&#xff1a;http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

如何自己做奶茶,從此告別奶茶店

自制大白兔奶茶&#xff0c;奶香與茶香激情碰撞&#xff0c;每一口都是香濃與甜蜜的雙重誘惑&#xff0c;好喝到跺腳&#xff01;絲滑口感在舌尖舞動&#xff0c;仿佛味蕾在開派對。 簡單幾步就能復刻&#xff0c;成本超低&#xff0c;輕松在家享受奶茶自由。 材料:大白兔奶糖&…

SOA(面向服務架構)與微服務架構的區別與聯系

SOA&#xff08;面向服務架構&#xff09;與微服務架構的區別與聯系 1. 引言 在現代軟件架構中&#xff0c;SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服務架構&#xff09;和微服務架構&#xff08;Microservices Architecture&#xff09;是兩種常見的…

LLM的準確率評估采用什么方式:準確率評估使用的是 `sklearn.metrics` 模塊中的 `accuracy_score` 函數

LLM的準確率評估采用什么方式:準確率評估使用的是 sklearn.metrics 模塊中的 accuracy_score 函數 評估方式 代碼里的準確率評估是基于每個樣本最后一個預測的 token 與真實的 token 進行對比。具體來說,它會遍歷測試數據集中的每個樣本,使用模型預測出最后一個 token 的 …

文件和異常

從文件中讀取數據 讀取整個文件 讀取整個文件 要讀取文件&#xff0c;需要一個包含幾行文本的文件。下面首先創建一個文件&#xff0c;它包含精確 到小數點后30位的圓周率值&#xff0c;且在小數點后每10位處換行&#xff1a; pi_digits.txt 3.14159265358979323846264338…

2025最新版Windows通過GoLand遠程連接Linux構建Go項目保姆級教學

以Ubuntu24.04和GoLand2024.1.6為例子&#xff0c;演示如何在Windows上通過GoLand遠程連接Linux進行Go編程。 通過go version指令可以發現當前Ubuntu系統沒有安裝go。 go version 通過指令安裝go&#xff0c;其他系統可以通過wget安裝&#xff0c;要指定安裝的具體go版本&…

Spring Boot 集成 Lua 腳本:實現高效業務邏輯處理

1. 前言 1.1 什么是Lua Lua是一種輕量級、高性能的腳本語言,常用于游戲開發、嵌入式系統、配置文件解析等領域。Lua語法簡潔,易于學習和使用,且具有強大的擴展性。 1.2 Spring Boot與Lua集成的意義 將Lua集成到Spring Boot應用中,可以實現動態配置業務邏輯、簡化復雜業…

Linux筆記---文件系統硬件部分

1. 文件系統 文件系統是操作系統用于明確存儲設備&#xff08;常見的是磁盤&#xff0c;也有基于NAND Flash的固態硬盤&#xff09;或分區上的文件的方法和數據結構&#xff0c;即在存儲設備上組織文件的方法。 1.1 基本組成 索引節點&#xff08;inode&#xff09;&#xff…

12.31[net]review

復用&#xff08;Multiplexing&#xff09;的概念 定義&#xff1a;在傳輸層&#xff0c;復用是指多個應用進程可以使用同一個傳輸層協議&#xff08;如 TCP 或 UDP&#xff09;來發送數據。從應用層的角度看&#xff0c;不同的應用進程&#xff08;如網頁瀏覽器、郵件客戶端等…

網絡安全防護架構有哪些 網絡安全防護措施包括

網絡安全預防措施 網安措施 計算機網絡安全措施主要包括保護網絡安全、保護應用服務安全和保護系統安全三個方面&#xff0c;各個方面都要結合考慮安全防護的物理安全、防火墻、信息安全、Web安全、媒體安全等等。 (一)保護網絡安全。 網絡安全是為保護商務各方網絡端系統之…