linux內核網路源碼學習(二)

来源:https://www.cnblogs.com/lixiaomeng/archive/2023/10/04/17742477.html
-Advertisement-
Play Games

為什麼要使用skb_reserve函數把邊界對齊 skb_reserve 函數通常用於網路編程中的數據包處理,特別是在構建自定義協議棧或數據包處理模塊時。它的作用是為數據包的頭部預留額外的空間,以確保數據包的頭部數據在記憶體中是對齊的。 邊界對齊的概念是因為許多硬體平臺和網路協議要求數據包頭的位元組對齊 ...


為什麼要使用skb_reserve函數把邊界對齊

skb_reserve 函數通常用於網路編程中的數據包處理,特別是在構建自定義協議棧或數據包處理模塊時。它的作用是為數據包的頭部預留額外的空間,以確保數據包的頭部數據在記憶體中是對齊的。

邊界對齊的概念是因為許多硬體平臺和網路協議要求數據包頭的位元組對齊。如果數據包頭部沒有按照要求的方式對齊,可能會導致性能下降或者出現硬體故障。邊界對齊通常要求數據包頭部的其實地址是某個特定位元組的倍數。

使用 skb_reserve 函數可以確保數據包的頭部在記憶體中正確對齊。它的工作方式是將預留的空間添加到skb (socket buffer)結構中,這個結構用於存儲數據包的信息和數據。通過預留足夠的空間,skb 結構中的數據包頭部將被對齊到所需的位元組邊界。

具體來說,skb_reserve函數作用呢包括:

  1. 分配足夠的額外記憶體空間,以便在skb 結構中存儲數據包頭部。
  2. 調整skb 結構的內部指針,以確保數據包頭部的存儲位置是對齊的。

這種對齊對於網路數據包的發送和接收非常重要,因為不同網路硬體和協議可能對數據包頭部的對齊要求不同。如果不進行正確的對齊,可能會導致數據包被硬體丟棄或解析錯誤,從而引髮網絡問題。

總之,使用skb_reserve函數是一種確保網路數據包頭部對齊的常見做法,以提高網路數據包處理性能和可靠性。

當內核編譯成支持 IP-over-IP 通道時,就可能有多個IP報頭

什麼是 IP-over-IP 通道?
IP-over-IP通道是一種網路隧道技術,它允許在一個IP數據包的內部封裝另一個IP數據包。這意味著一個IP數據包包含了兩個IP報頭,其中一個是外部IP報頭,另一個是內部IP報頭。

在IP-over-IP通道中,通常有兩個端點或者路由器之間的通信,其中一個端點封裝要傳輸的數據包,而另一個端點解封裝這些數據包。這種技術的主要應用場景包括:

  1. 虛擬專用網路(Virtual Private Network,VPN):VPN是一種安全通信方式,通過在公共網路上創建私有網路,可以將內部流量隔離開來。IP-over-IP通道可以用於構建VPN,將內部的IP數據包封裝在外部的IP數據包中,以便通過公共網路傳輸,同時保持數據的隱私和安全。
  2. 隧道協議:某些網路設備和協議需要通過隧道將數據包傳輸到遠程位置。例如,IPv6到IPv4的轉換可以使用IP-over-IP通道,以便在IPv4網路上傳輸IPv6數據包。
  3. 隧道加密:有時候,通信需要額外的安全性。IP-over-IP通道可以與加密技術結合使用,以加密內部的數據包,然後封裝在外部的IP數據包中進行傳輸。這有助於保護數據的機密性。

在一個IP-over-IP通道中,多個IP報頭的存在是很常見的。通常,外部IP報頭用於路由和傳輸外部網路中的數據包,而內部IP報頭用於路由和傳輸內部網路中的數據包。這兩個IP報頭分別具有不同的IP地址、TTL(Time-to-Live,生存時間)等欄位。

總之,IP-over-IP通道是一種將一個IP數據包封裝在另一個IP數據包內部的網路隧道技術,通常用於實現網路隔離、跨網路通信和安全通信等目的。多個IP報頭的存在是因為數據包需要在不同的網路層中進行路由和傳輸。

什麼是隧道?

在電腦網路中,隧道(Tunnel)是一種將一種網路協議的數據包封裝在另一種網路協議的數據包內傳輸的技術。隧道的主要目的是允許在兩個網路之間傳輸數據,儘管這兩個網路使用不同的協議、拓撲結構或地址方案。

隧道的工作方式如下:

  1. 封裝(Encapsulation): 原始數據包被封裝在一個或多個新的數據包中,通常在新數據包的頭部添加額外的信息,以標識原始數據包的目標和屬性。這個過程稱為封裝。
  2. 傳輸(Transmission):封裝後的數據包在隧道內傳輸,通過隧道連接的兩端。這些數據包通常通過公共網路傳輸,例如網際網路。
  3. 解封裝(Decapsulation):到達目的地的數據包經過解封裝過程,將原始數據包從封裝中提取出來。解封裝過程還可以包括驗證數據包的完整性和身份驗證等操作。

在電腦網路中,隧道(Tunnel)是一種將一種網路協議的數據包封裝在另一種網路協議的數據包內傳輸的技術。隧道的主要目的是允許在兩個網路之間傳輸數據,儘管這兩個網路使用不同的協議、拓撲結構或地址方案。

隧道可以用於多種不同的場景和目的,包括:

  1. 連接遠程網路:隧道允許在兩個不同地理位置的網路之間建立連接,使它們能夠互相通信,就好像它們在同一網路中一樣。
  2. 跨越不同協議的通信:隧道可以用於在不同的網路協議之間傳輸數據,例如將IPv6數據包封裝在IPv4數據包中,以便在IPv4網路上傳輸。
  3. 隔離和安全:隧道可以用於創建私有網路,以隔離和保護數據。例如,虛擬專用網路(VPN)使用隧道來加密和隔離通信,以確保數據的安全性。
  4. 跨越不同拓撲結構的通信:隧道可以用於連接不同拓撲結構的網路,例如星型、網狀或環狀拓撲,以實現數據的流動。

總之,隧道是一種重要的網路技術,用於連接、隔離和傳輸數據,允許不同網路之間的通信和互聯。隧道的選擇和配置取決於特定的網路需求和環境。

OSI模型算是一種隧道傳輸技術嗎?

不完全正確。OSI模型(開放式系統互聯模型)是一種網路協議層次結構,用於描述和組織電腦網路中不同層次的通信協議。它將網路通信分為七個不同的層次,每個層次都有特定的功能和責任,從物理層(第一層)到應用層(第七層)。

與隧道傳輸技術不同,OSI模型本身並不是一種具體的網路通信技術,而是一種概念性框架,用於理解和組織不同層次的通信協議。它提供了一種方法來描述和分解網路通信的複雜性,使不同的網路協議可以獨立開發和維護,同時仍然能夠互操作。

隧道傳輸技術,如IP-over-IP隧道、VPN隧道等,是一種特定的網路技術,用於將數據包從一個網路封裝並傳輸到另一個網路。這些技術通常屬於OSI模型中的網路層或數據鏈路層,用於實現不同網路之間的通信、連接和隔離。它們是在OSI模型的基礎上實現的,但不是OSI模型本身的一部分。

總之,OSI模型是一種用於描述通信協議層次結構的概念性框架,而隧道傳輸技術是一種具體的網路技術,用於在不同網路之間傳輸數據。兩者雖然相關,但是具有不同的目的和作用。

非線性數據包處理

skb_is_nonlinear

static inline bool skb_is_nonlinear(const struct sk_buff *skb)
{
	return skb->data_len;
}

這段代碼定義了一個內聯函數 skb_is_nonlinear,用於檢查給定的 sk_buff 結構是否包含非線性數據。

sk_buff 是Linux內核中用於表示網路數據包的數據結構,而非線性數據包是指數據包的數據存儲在多個非連續的緩衝區中,而不是一個單一的線性緩衝區。非線性數據包通常需要額外的記憶體和處理,因為數據分散在多個緩衝區中,這可能會增加處理的複雜性。

這個 skb_is_nonlinear 函數的實現非常簡單,它檢查 sk_buff 結構中的 data_len 欄位是否為非零值。如果 data_len 不為零,說明該數據包是非線性的,因為 data_len 欄位用於表示非線性數據包的長度。如果 data_len 為零,那麼該數據包是線性的,因為線性數據包的長度通常可以從 len 欄位中獲得。

這個函數的目的是幫助內核代碼確定一個 sk_buff 結構是否包含非線性數據,從而可以採取適當的處理措施。如果 skb_is_nonlinear 返回 true,那麼內核可以根據需要執行額外的操作來處理非線性數據包。否則,如果返回 false,則可以假定數據包是線性的,通常更容易處理。

skb_linearize

skb_linearize 是Linux內核網路數據包處理中的一個函數,用於將非線性數據包(non-linear sk_buff)轉換為線性數據包(linear sk_buff)。在內核網路數據包處理中,數據包通常以線性方式存儲在單個連續的緩衝區中,這被稱為線性緩衝區。然而,某些情況下,數據包的數據可能分散在多個非連續的緩衝區中,這被稱為非線性數據包。

skb_linearize 函數的主要作用是將非線性數據包轉換為線性數據包,以便於內核的處理和傳遞。這個函數會執行以下操作:

  1. 分配新的線性緩衝區:首先,它會分配一個新的線性緩衝區,足夠大以容納非線性數據包中的所有數據。
  2. 將數據拷貝到線性緩衝區:然後,它會將非線性數據包中的數據從多個非連續的緩衝區複製到新的線性緩衝區中。這樣,數據包的所有內容都被組合到一個連續的緩衝區中。
  3. 更新 sk_buff 結構:最後,它會更新相關的 sk_buff 結構,將數據包的數據指針和長度等信息更新為新的線性緩衝區的地址和大小。

這個操作的目的是為了簡化數據包的處理。許多網路協議和網路設備驅動程式都更喜歡處理線性數據包,因為它們的數據存儲方式更加緊湊和可預測。當收到非線性數據包時,內核通常會使用 skb_linearize 將其轉換為線性數據包,以便更容易地進行後續處理,例如路由、轉發或傳遞給上層協議棧。

總之,skb_linearize 函數用於將非線性數據包轉換為線性數據包,以便於內核的處理。這是一種數據包預處理操作,旨在簡化數據包的存儲和處理方式。

TCP截斷卸載技術

TCP截斷卸載(TCP Segmentation Offload Truncation)和TSO(TCP Segmentation Offload)是兩種網路性能優化技術,旨在提高網路傳輸效率。它們都與TCP數據包的分段和傳輸有關,但在一些方面存在差異。

"TCP Segmentation Offload"(TSO) "TCP分段卸載" 或 "TCP分段卸載技術"。這個翻譯表達了TSO技術的基本含義,即將TCP數據包的分段任務卸載到網路適配器上,以減輕主機CPU的負載。

  • TSO 是一種網路性能優化技術,旨在減輕主機CPU的負載。
  • 當主機要發送一個大型TCP數據包時,傳統的做法是將整個數據包構建併發送到網路適配器,然後在適配器上對數據包進行分段以適應網路的最大傳輸單元(MTU)。
  • TSO 將這個任務卸載到網路適配器上,允許適配器在數據包發送之前將大型TCP數據包分割成適應MTU的小數據塊。這減輕了主機CPU的工作負擔,因為CPU不再需要進行數據包分段。
  • TSO 可以提高網路性能,因為它使主機CPU可以更專註於其他任務。

"TCP Segmentation Offload Truncation" "TCP分段卸載截斷" 或 "TCP截斷卸載技術"。反映了TCP截斷卸載技術的特性,即允許網路適配器在傳輸之前截斷大型TCP數據包的一部分,以減小每個數據包的大小。這有助於提高網路的可靠性和性能。

  • TCP截斷卸載是與TSO相關但不同的技術。它關註的是減小數據包的大小,以降低每個數據包的傳輸時間和網路擁塞的風險
  • TCP截斷卸載允許網路適配器在傳輸之前截斷大型TCP數據包的一部分,以降低每個數據包的大小。這可以提高網路的可靠性,因為較小的數據包更容易在網路上傳輸,減少了丟包的可能性。
  • 相比之下,TSO主要關註將大型TCP數據包分割以降低CPU負載。
  • TCP截斷卸載可以減少網路延遲和擁塞,對實時應用程式和延遲敏感的流量特別有益。

綜上所述,TSO和TCP截斷卸載都是用於優化TCP數據包傳輸的技術,但它們的焦點和目標不同。TSO旨在降低主機CPU的負載,而TCP截斷卸載旨在減小數據包的大小以降低網路擁塞的風險。這兩種技術可以在一些情況下協同工作,以提高網路性能和可靠性。但需要註意的是,它們都需要得到支持併在網路適配器上適當配置。

截斷和卸載的含義

  1. 截斷(Truncation):在網路通信中,"截斷" 通常指的是將數據包的一部分或整個部分從數據流中移除或刪除的操作。這可以用於減小數據包的大小或限制傳輸的數據量。在 "TCP截斷卸載" 中,"截斷" 意味著將大型TCP數據包的一部分或整個部分刪除,以降低數據包的大小。
  2. 卸載(Offload):"卸載" 是指將某些任務或處理從一個系統或組件轉移到另一個系統或組件的過程。在網路通信中,"卸載" 通常指的是將數據包處理任務從主機的CPU卸載到網路適配器(NIC)或其他硬體上執行。這可以減輕主機CPU的負載,提高網路性能。

skb_shinfo

#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))

這裡定義了一個巨集(macro),用於訪問 Linux 內核中的網路數據包(skb,Socket Buffer)的共用信息(shared info)。巨集的名稱是 skb_shinfo,它接受一個名為 SKB 的參數,通常是指向網路數據包的指針(skb)。

整個巨集的作用是獲取指向網路數據包共用信息結構的指針,該結構包含了有關 skb 的一些元數據和共用信息,通常用於高性能的數據包處理操作。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當你需要為你的 Go 項目創建一個強大的命令行工具時,你可能會遇到許多挑戰,比如如何定義命令、標誌和參數,如何生成詳細的幫助文檔,如何支持子命令等等。為瞭解決這些問題,github.com/spf13/cobra 就可以派上用場。 github.com/spf13/cobra 是一個用於構建強大的命 ...
  • 1、功能介紹 海量數據操作ORM性能瓶頸在實體轉換上面,並且不能使用常規的Sql去實現 當列越多轉換越慢,SqlSugar將轉換性能做到極致,並且採用資料庫最佳API 操作資料庫達到極限性能,當然你如果不用sqlsugar瞭解一下原理也可以使用其他ORM實現 BulkCopy BulkCopy是一種 ...
  • 支持.Net Core(2.0及以上)與.Net Framework(4.0及以上)(註意:升級了,可以覆蓋到早期的.Net Framework4.0了,而且修複了資料庫欄位為Null時報錯的問題,無敵了!!) 此工具在IDataAccess介面中提供。 已被.Net圈內多家大廠採用! IDataA ...
  • 一:背景 1. 講故事 中秋國慶長假結束,哈哈,在老家拍了很多的短視頻,有興趣的可以上B站觀看:https://space.bilibili.com/409524162 ,今天繼續給大家分享各種奇奇怪怪的.NET生產事故,希望能幫助大家在未來的編程之路上少踩坑。 話不多說,這篇看一個.NET程式集泄 ...
  • 前言 上傳大文件時,原始HTTP文件上傳功能可能會影響使用體驗,此時使用分片上傳功能可以有效避免原始上傳的弊端。由於分片上傳不是HTTP標準的一部分,所以只能自行開發相互配合的服務端和客戶端。文件分片上傳在許多情況時都擁有很多好處,除非已知需要上傳的文件一定非常小。分片上傳可以對上傳的文件進行快速分 ...
  • Debian,作為最受歡迎的 Linux 發行版之一,於 2023 年 6 月 10 日正式發佈了其最新版本 Debian 12,代號“Bookworm”。Debian 12 帶來了許多新特性和改進,其中最引人註目的是 Linux 內核的升級,從之前的 5.10 LTS 升級到了 6.1。 這兩天嘗 ...
  • Css實現瀏覽滾動條效果 前言 也是有大半個月沒有更新文章了,大部分時間都在玩,然後就是入職的事。今天就更新一個小知識,刷抖音的時候看到的,感覺還不錯。 屬性介紹 關鍵屬性animation-timeline:動畫名稱; 用於控制動畫的時間軸。它可以讓你在一個元素上同時播放多個動畫,控制它們的開始時 ...
  • 一、簡介 ssh(secure shell,安全外殼協議),該協議有2個常用的作用:遠程連接、遠程文件傳輸。 協議使用埠號:預設是22。 可以是被修改的,如果需要修改,則需要修改ssh服務的配置文件: #/etc/ssh/ssh_config 埠號可以修改,但是得註意2個事項: a. 註意範圍, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...