《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > Linux教學——如何學習 Linux 內核網絡協議棧

Linux教學——如何學習 Linux 內核網絡協議棧

2022-10-26
作者:土豆居士
來源:電子技術應用專欄作家 一口Linux
關鍵詞: Linux 網絡協議棧

  協議棧的細節

  下面將介紹一些內核網絡協議棧中常常涉及到的概念。

  sk_buff

  內核顯然需要一個數據結構來表示報文,這個結構就是 sk_buff ( socket buffer 的簡稱),它等同于在<TCP/IP詳解 卷2>中描述的 BSD 內核中的 mbuf。

  sk_buff 結構自身并不存儲報文內容,它通過多個指針指向真正的報文內存空間:

  微信截圖_20221026155705.png

  sk_buff 是一個貫穿整個協議棧層次的結構,在各層間傳遞時,內核只需要調整 sk_buff 中的指針位置就行。

  net_device

  內核使用 net_device 表示網卡。網卡可以分為物理網卡和虛擬網卡。物理網卡是指真正能把報文發出本機的網卡,包括真實物理機的網卡以及VM虛擬機的網卡,而像 tun/tap,vxlan、veth pair 這樣的則屬于虛擬網卡的范疇。

  如下圖所示,每個網卡都有兩端,一端是協議棧(IP、TCP、UDP),另一端則有所區別,對物理網卡來說,這一端是網卡生產廠商提供的設備驅動程序,而對虛擬網卡來說差別就大了,正是由于虛擬網卡的存在,內核才能支持各種隧道封裝、容器通信等功能。

  微信截圖_20221026155928.png

  socket & sock

  用戶空間通過 socket()、bind()、listen()、accept() 等庫函數進行網絡編程。而這里提到的 socket 和 sock 是內核中的兩個數據結構,其中 socket 向上面向用戶,而 sock 向下面向協議棧。

  如下圖所示,這兩個結構實際上是一一對應的。

  微信截圖_20221026155951.png

  注意到,這兩個結構上都有一個叫 ops 的指針, 但它們的類型不同。socket 的 ops 是一個指向 struct proto_ops 的指針,sock 的 ops 是一個指向 struct proto 的指針, 它們在結構被創建時確定。

  回憶網絡編程中 socket() 函數的原型:

微信截圖_20221026160045.png

  實際上, socket->ops 和 sock->ops 由前兩個參數 socket_family 和 socket_type 共同確定。

  如果 socket_family 是最常用的 PF_INET 協議簇, 則 socket->ops 和 sock->ops 的取值就記錄在 INET 協議開關表中:

 微信截圖_20221026160135.png

  L3->L4

  我們知道網絡協議棧是分層的,但實際上,具體到實現,內核協議棧的分層只是邏輯上的,本質還是函數調用。發送流程(上層調用下層)通常是直接調用(因為沒有不確定性,比如TCP知道下面一定IP),但接收過程不一樣了,比如報文在 IP 層時,它上面可能是 TCP,也可能是 UDP,或者是 ICMP 等等,所以接收過程使用的是注冊-回調機制。

  還是以 INET 協議簇為例,注冊接口是:

  微信截圖_20221026160156.png

  在內核網絡子系統初始化時,L4 層協議(如下面的 TCP 和 UDP)會被注冊:

 微信截圖_20221026160213.png

  而在IP層,查詢過路由后,如果該報文是需要上送本機的,則會根據報文的 L4 協議,送給不同的 L4 處理:

 微信截圖_20221026160253.png

  L2->L3

  L2->L3 如出一轍。只不過注冊接口變成了:

  微信截圖_20221026160310.png

  誰會注冊呢?顯然至少 IP 會:

微信截圖_20221026160329.png

  而在報文接收過程中,設備驅動程序會將報文的 L3 類型設置到 skb->protocol,然后在內核 netif_receive_skb 收包時,會根據這個 protocol 調用不同的回調函數:

 微信截圖_20221026160346.png

  Netfilter

  Netfilter 是報文在內核協議棧必然會通過的路徑,我們從下面這張圖就可以看到,Netfilter 在內核的 5 個地方設置了 HOOK 點,用戶可以通過配置 iptables 規則,在 HOOK 點對報文進行過濾、修改等操作。

  微信截圖_20221026160406.png

  在內核代碼中,我們時常可見 NF_HOOK 這樣的調用。我的建議是,如果你暫時不考慮 Netfilter,那么就直接跳過, 跟蹤 okfn 就行。

  微信截圖_20221026160428.png

  dst_entry

  內核需要確定收到的報文是應該本地上送(local deliver)還是轉發(forward),對本機發送(local out)的報文需要確定是從哪個網卡發送出去,這都是內核通過查詢 fib (forward information base, 轉發信息表) 確定。fib 可以理解為一個數據庫,數據來源是用戶配置或者內核自動生成的路由。

  fib 查詢的輸入是報文 sk_buff,輸出是 dst_entry. dst_entry 會被設置到 skb 上:

 微信截圖_20221026160448.png

  而 dst_entry 中最重要的是一個 input 指針和 output 指針:

  微信截圖_20221026160506.png

微信截圖_20221026160524.png



 更多信息可以來這里獲取==>>電子技術應用-AET<<

微信圖片_20210517164139.jpg

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:[email protected]
主站蜘蛛池模板: 日韩中文字幕免费 | 91porny九色国产首页在线 | 国产高清视频在线播放 | 中文字幕一区二区三区免费视频 | 中国高清色视频www 中国黄色网址大全 | 国产片在线观看狂喷潮bt天堂 | 国产免费一级片 | 亚洲视频在线视频 | 国产亚洲精品yxsp | 国产一区亚洲欧美成人 | 91精品久久久久久久久网影视 | 欧美一级免费看 | 国产成人aaa在线视频免费观看 | 免费国产高清精品一区在线 | 在线精品视频在线观看高清 | 视频国产91 | 国产三a级日本三级日产三级 | 婷婷丁香花麻豆 | 国产成年视频 | 亚洲欧美精选 | 仑乱高清在线一级播放 | 国产丝袜美腿高跟白浆 | 国产成人精品午夜免费 | 精品国产夜色在线 | 国产成人ay手机在线观看 | 亚洲综合在线另类色区奇米 | 国产精品日韩一区二区三区 | 亚洲精品国产拍拍拍拍拍 | 亚洲精品高清国产一线久久97 | 国产成人精品高清在线观看99 | 成人午夜性a一级毛片美女 成人午夜亚洲影视在线观看 | 女在床上被男的插爽叫视频 | 欧美美女一区二区三区 | 全部精品孕妇色视频在线 | 在线视频第一页 | 亚洲va视频 | 国产精品无码久久av | 国产精品毛片在线更新 | 精品三级国产一区二区三区四区 | 欧美色成人tv在线播放 | 欧美黄色xxx |