《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > 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;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产一区二区电影在线观看| 亚洲精品影院在线观看| 欧美大色视频| 麻豆av一区二区三区| 久久国产一区二区| 欧美专区日韩视频| 午夜精品视频一区| 欧美一级视频| 久久国产欧美精品| 久久精品免视看| 久久久天天操| 久久美女性网| 男女精品网站| 欧美高清日韩| 欧美人牲a欧美精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲电影一级黄| 在线观看不卡| 91久久精品国产91性色| 日韩午夜电影| 亚洲一区二区三区色| 香蕉亚洲视频| 亚洲国产精品视频一区| 亚洲人成在线免费观看| 一本色道久久综合一区| 亚洲一区在线观看视频| 午夜亚洲性色福利视频| 久久激情视频久久| 欧美超级免费视 在线| 欧美精品成人| 欧美色大人视频| 国产精品私人影院| 黄色成人免费观看| 亚洲日本一区二区三区| 一区二区三区国产精华| 午夜久久久久久久久久一区二区| 久久国产精品久久久久久| 最新成人av网站| 宅男精品导航| 久久成人18免费网站| 噜噜噜在线观看免费视频日韩| 欧美激情中文字幕乱码免费| 国产精品vvv| 国产一区二区三区在线观看网站| 亚洲国产精品久久91精品| 一本色道久久99精品综合| 性欧美暴力猛交69hd| 亚洲日本va午夜在线电影| 亚洲伊人观看| 免费久久精品视频| 欧美视频在线观看免费网址| 国产网站欧美日韩免费精品在线观看 | 一本不卡影院| 欧美专区亚洲专区| 欧美激情国产精品| 亚洲人成网站在线观看播放| 久久婷婷色综合| 女生裸体视频一区二区三区| 欧美视频不卡| 韩曰欧美视频免费观看| 日韩视频二区| 久久激情婷婷| 亚洲自拍偷拍麻豆| 免费看精品久久片| 国产伦精品一区二区三区照片91| 最新亚洲一区| 欧美在线观看一区二区| 亚洲小说区图片区| 免费不卡在线视频| 国产欧美日韩高清| 亚洲靠逼com| 亚洲第一主播视频| 香蕉久久a毛片| 欧美精品首页| 一区一区视频| 午夜亚洲激情| 亚洲综合清纯丝袜自拍| 欧美精品麻豆| 永久免费毛片在线播放不卡| 亚洲在线电影| 亚洲视频电影在线| 欧美国产高清| 国色天香一区二区| 亚洲欧美日韩国产中文| 一本色道久久精品| 欧美风情在线| 精品电影一区| 欧美在线|欧美| 午夜欧美精品久久久久久久| 欧美人与禽猛交乱配| 影音先锋另类| 欧美一区二区私人影院日本| 亚洲在线国产日韩欧美| 欧美精品日韩一本| 一区二区在线视频播放| 性欧美精品高清| 午夜宅男久久久| 国产精品九九久久久久久久| 亚洲精品一区在线观看| 亚洲欧洲在线免费| 久久综合免费视频影院| 国产一区二区三区黄视频| 午夜日韩视频| 欧美在线观看视频一区二区| 国产精品久久久久天堂| 中文成人激情娱乐网| 在线一区二区三区做爰视频网站| 欧美激情1区| 最新热久久免费视频| 亚洲精品欧美日韩| 欧美丰满少妇xxxbbb| 亚洲国产高清一区| 亚洲国内欧美| 欧美高清一区| 亚洲青色在线| 一区二区三区久久| 欧美日韩国语| 一区二区欧美在线| 亚洲网站在线观看| 欧美性猛交99久久久久99按摩| 99精品热视频只有精品10| 亚洲无吗在线| 国产精品免费视频xxxx| 亚洲图片激情小说| 午夜综合激情| 国产一区再线| 亚洲第一在线视频| 欧美国产另类| 日韩视频三区| 亚洲欧美日韩精品久久久久| 国产精品久久久久三级| 午夜精品久久久久久99热软件 | 欧美一区二区视频在线观看| 国产欧美一区二区精品秋霞影院| 欧美一区二区三区在线看| 快she精品国产999| 亚洲日本va午夜在线影院| 亚洲午夜激情网页| 国产欧美一区二区色老头| 久久成人18免费观看| 欧美成人免费在线观看| 日韩一区二区精品| 欧美一区二区在线看| 红桃视频一区| 99亚洲视频| 国产精品美女久久久久久久| 性欧美videos另类喷潮| 蜜乳av另类精品一区二区| 亚洲精品美女在线| 亚洲欧美激情精品一区二区| 国产色产综合产在线视频| 亚洲人被黑人高潮完整版| 欧美日韩一二三区| 欧美一区二区在线观看| 欧美大片免费观看| 亚洲视频一二区| 久久久之久亚州精品露出| 91久久极品少妇xxxxⅹ软件| 亚洲欧美日韩在线| 在线播放豆国产99亚洲| 亚洲一区二区在线免费观看| 国产真实久久| 一本色道久久精品| 国产亚洲欧美日韩一区二区| 亚洲精品日韩在线| 国产精品亚洲片夜色在线| 亚洲级视频在线观看免费1级| 欧美性大战xxxxx久久久| 久久精品成人一区二区三区| 欧美日韩1080p| 午夜在线一区二区| 欧美日韩激情小视频| 欧美在线播放| 欧美色欧美亚洲另类二区| 欧美在线免费观看| 欧美系列精品| 亚洲黄色成人久久久| 国产精品久久国产愉拍 | 亚洲日本激情| 国产欧美日韩亚洲| 一区二区三区欧美亚洲| 韩日视频一区| 亚洲欧美日本国产有色| 亚洲国产精品久久久久婷婷884 | 亚洲福利专区| 国产毛片久久| 在线亚洲精品| 极品少妇一区二区三区精品视频| 亚洲一区中文| 亚洲区第一页| 免费美女久久99| 欧美伊人久久久久久久久影院| 欧美视频免费看| 亚洲日韩欧美视频| 国产亚洲欧美中文| 亚洲女人av| 99国产一区二区三精品乱码| 欧美www在线| 欧美在线观看视频一区二区| 国产精品都在这里|