《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 其他 > Linux教學(xué)——如何學(xué)習(xí) Linux 內(nèi)核網(wǎng)絡(luò)協(xié)議棧

Linux教學(xué)——如何學(xué)習(xí) Linux 內(nèi)核網(wǎng)絡(luò)協(xié)議棧

2022-10-26
作者:土豆居士
來(lái)源:電子技術(shù)應(yīng)用專(zhuān)欄作家 一口Linux

  協(xié)議棧的細(xì)節(jié)

  下面將介紹一些內(nèi)核網(wǎng)絡(luò)協(xié)議棧中常常涉及到的概念。

  sk_buff

  內(nèi)核顯然需要一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)表示報(bào)文,這個(gè)結(jié)構(gòu)就是 sk_buff ( socket buffer 的簡(jiǎn)稱(chēng)),它等同于在<TCP/IP詳解 卷2>中描述的 BSD 內(nèi)核中的 mbuf。

  sk_buff 結(jié)構(gòu)自身并不存儲(chǔ)報(bào)文內(nèi)容,它通過(guò)多個(gè)指針指向真正的報(bào)文內(nèi)存空間:

  微信截圖_20221026155705.png

  sk_buff 是一個(gè)貫穿整個(gè)協(xié)議棧層次的結(jié)構(gòu),在各層間傳遞時(shí),內(nèi)核只需要調(diào)整 sk_buff 中的指針位置就行。

  net_device

  內(nèi)核使用 net_device 表示網(wǎng)卡。網(wǎng)卡可以分為物理網(wǎng)卡和虛擬網(wǎng)卡。物理網(wǎng)卡是指真正能把報(bào)文發(fā)出本機(jī)的網(wǎng)卡,包括真實(shí)物理機(jī)的網(wǎng)卡以及VM虛擬機(jī)的網(wǎng)卡,而像 tun/tap,vxlan、veth pair 這樣的則屬于虛擬網(wǎng)卡的范疇。

  如下圖所示,每個(gè)網(wǎng)卡都有兩端,一端是協(xié)議棧(IP、TCP、UDP),另一端則有所區(qū)別,對(duì)物理網(wǎng)卡來(lái)說(shuō),這一端是網(wǎng)卡生產(chǎn)廠商提供的設(shè)備驅(qū)動(dòng)程序,而對(duì)虛擬網(wǎng)卡來(lái)說(shuō)差別就大了,正是由于虛擬網(wǎng)卡的存在,內(nèi)核才能支持各種隧道封裝、容器通信等功能。

  微信截圖_20221026155928.png

  socket & sock

  用戶空間通過(guò) socket()、bind()、listen()、accept() 等庫(kù)函數(shù)進(jìn)行網(wǎng)絡(luò)編程。而這里提到的 socket 和 sock 是內(nèi)核中的兩個(gè)數(shù)據(jù)結(jié)構(gòu),其中 socket 向上面向用戶,而 sock 向下面向協(xié)議棧。

  如下圖所示,這兩個(gè)結(jié)構(gòu)實(shí)際上是一一對(duì)應(yīng)的。

  微信截圖_20221026155951.png

  注意到,這兩個(gè)結(jié)構(gòu)上都有一個(gè)叫 ops 的指針, 但它們的類(lèi)型不同。socket 的 ops 是一個(gè)指向 struct proto_ops 的指針,sock 的 ops 是一個(gè)指向 struct proto 的指針, 它們?cè)诮Y(jié)構(gòu)被創(chuàng)建時(shí)確定。

  回憶網(wǎng)絡(luò)編程中 socket() 函數(shù)的原型:

微信截圖_20221026160045.png

  實(shí)際上, socket->ops 和 sock->ops 由前兩個(gè)參數(shù) socket_family 和 socket_type 共同確定。

  如果 socket_family 是最常用的 PF_INET 協(xié)議簇, 則 socket->ops 和 sock->ops 的取值就記錄在 INET 協(xié)議開(kāi)關(guān)表中:

 微信截圖_20221026160135.png

  L3->L4

  我們知道網(wǎng)絡(luò)協(xié)議棧是分層的,但實(shí)際上,具體到實(shí)現(xiàn),內(nèi)核協(xié)議棧的分層只是邏輯上的,本質(zhì)還是函數(shù)調(diào)用。發(fā)送流程(上層調(diào)用下層)通常是直接調(diào)用(因?yàn)闆](méi)有不確定性,比如TCP知道下面一定IP),但接收過(guò)程不一樣了,比如報(bào)文在 IP 層時(shí),它上面可能是 TCP,也可能是 UDP,或者是 ICMP 等等,所以接收過(guò)程使用的是注冊(cè)-回調(diào)機(jī)制。

  還是以 INET 協(xié)議簇為例,注冊(cè)接口是:

  微信截圖_20221026160156.png

  在內(nèi)核網(wǎng)絡(luò)子系統(tǒng)初始化時(shí),L4 層協(xié)議(如下面的 TCP 和 UDP)會(huì)被注冊(cè):

 微信截圖_20221026160213.png

  而在IP層,查詢(xún)過(guò)路由后,如果該報(bào)文是需要上送本機(jī)的,則會(huì)根據(jù)報(bào)文的 L4 協(xié)議,送給不同的 L4 處理:

 微信截圖_20221026160253.png

  L2->L3

  L2->L3 如出一轍。只不過(guò)注冊(cè)接口變成了:

  微信截圖_20221026160310.png

  誰(shuí)會(huì)注冊(cè)呢?顯然至少 IP 會(huì):

微信截圖_20221026160329.png

  而在報(bào)文接收過(guò)程中,設(shè)備驅(qū)動(dòng)程序會(huì)將報(bào)文的 L3 類(lèi)型設(shè)置到 skb->protocol,然后在內(nèi)核 netif_receive_skb 收包時(shí),會(huì)根據(jù)這個(gè) protocol 調(diào)用不同的回調(diào)函數(shù):

 微信截圖_20221026160346.png

  Netfilter

  Netfilter 是報(bào)文在內(nèi)核協(xié)議棧必然會(huì)通過(guò)的路徑,我們從下面這張圖就可以看到,Netfilter 在內(nèi)核的 5 個(gè)地方設(shè)置了 HOOK 點(diǎn),用戶可以通過(guò)配置 iptables 規(guī)則,在 HOOK 點(diǎn)對(duì)報(bào)文進(jìn)行過(guò)濾、修改等操作。

  微信截圖_20221026160406.png

  在內(nèi)核代碼中,我們時(shí)常可見(jiàn) NF_HOOK 這樣的調(diào)用。我的建議是,如果你暫時(shí)不考慮 Netfilter,那么就直接跳過(guò), 跟蹤 okfn 就行。

  微信截圖_20221026160428.png

  dst_entry

  內(nèi)核需要確定收到的報(bào)文是應(yīng)該本地上送(local deliver)還是轉(zhuǎn)發(fā)(forward),對(duì)本機(jī)發(fā)送(local out)的報(bào)文需要確定是從哪個(gè)網(wǎng)卡發(fā)送出去,這都是內(nèi)核通過(guò)查詢(xún) fib (forward information base, 轉(zhuǎn)發(fā)信息表) 確定。fib 可以理解為一個(gè)數(shù)據(jù)庫(kù),數(shù)據(jù)來(lái)源是用戶配置或者內(nèi)核自動(dòng)生成的路由。

  fib 查詢(xún)的輸入是報(bào)文 sk_buff,輸出是 dst_entry. dst_entry 會(huì)被設(shè)置到 skb 上:

 微信截圖_20221026160448.png

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

  微信截圖_20221026160506.png

微信截圖_20221026160524.png



 更多信息可以來(lái)這里獲取==>>電子技術(shù)應(yīng)用-AET<<

微信圖片_20210517164139.jpg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产一区二区精品久久91| 激情久久五月天| 欧美一级专区| 亚洲综合不卡| 亚洲女女女同性video| 中文一区二区| 亚洲视频第一页| 99v久久综合狠狠综合久久| 亚洲娇小video精品| 亚洲动漫精品| 亚洲高清久久| 亚洲高清在线视频| 亚洲国产高清高潮精品美女| 久久精品亚洲精品| 亚洲第一精品影视| 亚洲国产91| 亚洲三级免费电影| 欧美国产精品人人做人人爱| 久久天堂成人| 鲁鲁狠狠狠7777一区二区| 久久视频国产精品免费视频在线| 久久九九精品99国产精品| 久久精品国产精品| 久久嫩草精品久久久精品一| 亚洲国产成人午夜在线一区| 欧美日韩免费观看一区三区 | 亚洲福利视频一区| 国语自产在线不卡| 精品va天堂亚洲国产| 国产亚洲高清视频| 一区二区三区中文在线观看| 亚洲激情在线激情| av成人动漫| 亚洲免费视频成人| 欧美一区二区三区四区高清| 亚洲高清一区二| 亚洲伦理网站| 亚洲在线视频网站| 欧美在线播放视频| 六月丁香综合| 欧美日韩在线观看视频| 国产精品免费小视频| 国产亚洲一区二区精品| 亚洲风情亚aⅴ在线发布| 亚洲国产高清自拍| 一区二区三区视频在线播放| 午夜宅男久久久| 亚洲国产一区二区三区高清| 亚洲午夜在线视频| 亚洲精品一二三| 一区二区三区日韩欧美精品| 欧美亚洲免费在线| 亚洲人成在线播放网站岛国| 亚洲一级免费视频| 久久久久久久久综合| 欧美精品午夜| 国产欧美日韩综合精品二区| 在线精品视频一区二区| 一本一本久久| 亚洲成人在线视频网站| 亚洲无线视频| 久久久亚洲国产天美传媒修理工 | 亚洲欧洲精品一区二区三区不卡| 99国产精品久久久久久久成人热 | 国产精品久99| 在线精品一区| 日韩午夜电影av| 亚洲第一精品久久忘忧草社区| 一区二区三区四区蜜桃| 久久久亚洲国产美女国产盗摄| 欧美日韩一区二区三区在线观看免| 国产婷婷色一区二区三区在线| 亚洲三级性片| 欧美在线观看一区二区| 亚洲一区二区精品在线观看| 六十路精品视频| 国产日产欧美a一级在线| 日韩天堂av| 亚洲第一主播视频| 亚洲图片欧美一区| 欧美sm视频| 国产久一道中文一区| 亚洲美女视频在线观看| 亚洲高清毛片| 欧美一区二区三区在线视频| 欧美精品在线一区| 极品裸体白嫩激情啪啪国产精品| 亚洲一区3d动漫同人无遮挡| 亚洲理论在线观看| 老妇喷水一区二区三区| 欧美一区二区三区日韩| 亚洲麻豆av| 久久综合久久久| 国产麻豆精品久久一二三| 亚洲国产婷婷香蕉久久久久久99| 欧美一级片在线播放| 亚洲小说欧美另类婷婷| 欧美波霸影院| 激情欧美一区二区三区| 亚洲欧美日韩国产另类专区| 亚洲视频香蕉人妖| 欧美电影免费观看高清| 韩曰欧美视频免费观看| 亚洲欧美成人一区二区三区| 亚洲视频欧美在线| 欧美啪啪一区| 亚洲高清一区二| 亚洲成色www8888| 久久久久久久久久久成人| 国产精品一区二区a| 亚洲视频在线一区| 在线综合欧美| 欧美视频一区二区三区四区| 日韩亚洲在线| 一本色道久久综合亚洲精品婷婷| 欧美国产日本在线| 亚洲激情视频在线播放| 亚洲人成在线播放网站岛国| 另类人畜视频在线| 在线免费日韩片| 亚洲黄色av一区| 欧美91福利在线观看| 在线看一区二区| 亚洲精品乱码久久久久久日本蜜臀 | 欧美在线观看一区二区| 国产精品美女在线| 亚洲视频欧洲视频| 午夜精品久久久久久久久久久久久| 欧美日韩午夜精品| 亚洲婷婷国产精品电影人久久| 午夜欧美大片免费观看| 国产乱子伦一区二区三区国色天香| 亚洲一区二区在线免费观看| 午夜精品国产| 国产欧美日韩一区二区三区| 欧美一级理论片| 老司机成人网| 亚洲黄色高清| 亚洲图片欧美一区| 国产精品免费看片| 欧美亚洲综合另类| 久久一综合视频| 亚洲第一中文字幕| 一区二区三区欧美在线| 欧美性猛交一区二区三区精品| 亚洲午夜高清视频| 久久国产精品电影| 黄色日韩在线| 一道本一区二区| 国产精品福利在线观看网址| 亚洲欧美日韩精品| 久久一区精品| 亚洲精品影视| 欧美亚洲免费| 一区二区三区在线看| 亚洲人午夜精品免费| 欧美日韩久久精品| 亚洲一区二区三区精品在线观看| 久久av一区二区三区| 在线观看视频一区二区| 一区二区三区国产精品| 国产精品综合av一区二区国产馆| 欧美在线啊v一区| 欧美激情第9页| 正在播放亚洲| 免费观看在线综合色| 日韩写真视频在线观看| 久久精品免费看| 亚洲日本激情| 欧美在线不卡| 亚洲精品资源| 久久精品国产成人| 亚洲日本一区二区| 欧美亚洲在线观看| 亚洲第一精品夜夜躁人人爽| 亚洲一区二三| 精品不卡视频| 亚洲欧洲99久久| 亚洲国产成人在线播放| 午夜精品偷拍| 亚洲激情视频| 久久久久久久一区二区三区| 亚洲免费成人| 久久一区二区三区四区| 亚洲午夜激情网站| 美女亚洲精品| 亚洲综合电影一区二区三区| 欧美激情欧美狂野欧美精品| 午夜一级在线看亚洲| 欧美理论电影在线播放| 欧美专区福利在线| 国产精品激情电影| 亚洲精品在线电影| 国产一区91精品张津瑜| 亚洲午夜女主播在线直播| 亚洲第一网站| 久久久人成影片一区二区三区观看 | 一区二区免费在线播放| 裸体女人亚洲精品一区| 亚洲免费中文|