《電子技術(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亚洲国产精品_日韩亚洲一区二区
亚洲人成77777在线观看网| 一区二区电影免费观看| 亚洲国产精品999| 国产一区二区三区奇米久涩| 欧美色图一区二区三区| 欧美精品一区二区视频 | 亚洲人成7777| 亚洲国产精品福利| 久久国产精品一区二区三区四区| 亚洲欧美影音先锋| 亚洲欧美日韩另类| 亚洲欧美国产日韩天堂区| 亚洲一区二区精品| 亚洲一区二区在线| 亚洲香蕉网站| 亚洲欧美日韩国产成人| 亚洲永久免费av| 亚洲免费人成在线视频观看| 亚洲综合成人婷婷小说| 亚洲欧美在线看| 欧美一区二区三区在线看| 欧美在线视频一区二区| 欧美在线视频免费播放| 欧美综合二区| 久久精品国产一区二区三| 久久精品五月| 在线观看国产精品网站| 欧美激情免费在线| 欧美激情国产精品| 欧美激情按摩| 欧美日韩午夜在线| 国产精品久久久久一区二区三区共 | 国产精品美女久久久久aⅴ国产馆| 欧美日韩在线观看视频| 国产精品99一区二区| 国产精品入口66mio| 国产欧美日韩综合| 国外精品视频| 亚洲国产成人精品视频| 一本色道久久综合亚洲精品不卡| 在线一区视频| 午夜一区二区三视频在线观看| 亚洲成人自拍视频| 亚洲美女视频在线免费观看| 亚洲图片欧美日产| 欧美在线观看一区| 欧美+亚洲+精品+三区| 欧美精品在线免费观看| 欧美日韩在线亚洲一区蜜芽| 国产精品丝袜91| 国内精品久久久久久久影视蜜臀| 韩国一区二区三区在线观看| 91久久国产精品91久久性色| 亚洲五月婷婷| 久久黄色网页| 一区二区三区产品免费精品久久75 | 99国产精品久久久久老师| 亚洲午夜成aⅴ人片| 欧美在线观看你懂的| 欧美成人久久| 国产精品伦一区| 精品51国产黑色丝袜高跟鞋| 亚洲免费观看| 午夜久久一区| 亚洲精品一二区| 欧美一级欧美一级在线播放| 欧美成人第一页| 国产精品一区二区久久| 亚洲福利一区| 亚洲欧美激情视频在线观看一区二区三区 | 国自产拍偷拍福利精品免费一| 日韩一区二区精品在线观看| 午夜亚洲福利在线老司机| 亚洲免费大片| 久久久精品国产99久久精品芒果| 欧美日韩精品系列| 国产字幕视频一区二区| 99在线精品视频在线观看| 亚洲第一视频网站| 先锋影院在线亚洲| 欧美精品激情| 亚洲欧美日韩区| 国产精品美女久久久浪潮软件 | 99精品国产在热久久婷婷| 欧美一区二区女人| 欧美极品色图| 国产自产v一区二区三区c| 一区二区三区.www| 亚洲福利小视频| 欧美一级午夜免费电影| 欧美日本在线一区| 狠狠网亚洲精品| 亚洲一区二区三区影院| 夜夜爽www精品| 免费观看在线综合色| 国产日韩一区二区三区| 一区二区三区欧美在线| 亚洲精品视频免费观看| 久久亚洲风情| 国产精品自拍一区| 一区二区高清视频| 99国内精品久久久久久久软件| 久久综合九色欧美综合狠狠| 国产日韩欧美在线播放不卡| 宅男噜噜噜66一区二区| 一本色道久久88综合亚洲精品ⅰ | 欧美激情精品久久久久久变态| 激情久久久久久| 亚洲欧美日韩在线一区| 亚洲尤物在线视频观看| 欧美日韩精品高清| 亚洲国产精品一区制服丝袜 | 亚洲女同精品视频| 中日韩美女免费视频网址在线观看| 蜜臀91精品一区二区三区| 国产亚洲精品资源在线26u| 亚洲午夜激情网站| 一区二区三区欧美在线| 欧美精品综合| 亚洲黄色高清| 日韩视频在线一区| 欧美激情一区二区三区全黄| 亚洲国产人成综合网站| 亚洲欧洲在线一区| 欧美高清视频一区二区| 亚洲国产午夜| 亚洲狼人精品一区二区三区| 欧美成人午夜剧场免费观看| 亚洲国产欧美国产综合一区| 亚洲人午夜精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产精品亚洲第一区在线暖暖韩国| 亚洲午夜高清视频| 亚洲欧美第一页| 国产噜噜噜噜噜久久久久久久久| 午夜精品久久| 久久久亚洲人| 一区二区在线看| 亚洲人精品午夜| 欧美日韩18| 在线一区二区三区四区五区| 午夜天堂精品久久久久| 国产色爱av资源综合区| 欧美在线一级va免费观看| 久热综合在线亚洲精品| 亚洲国产欧洲综合997久久| 一区二区精品国产| 国产精品xxxav免费视频| 亚洲女人小视频在线观看| 久久久久免费视频| 在线色欧美三级视频| 欧美三级在线播放| 日韩视频在线观看一区二区| 亚洲视频中文| 国产麻豆精品久久一二三| 欧美一级电影久久| 老牛影视一区二区三区| 在线欧美一区| 一本一本a久久| 国产精品国产自产拍高清av| 亚洲欧美国产精品桃花| 美女久久网站| 日韩视频一区二区三区在线播放| 亚洲欧美在线观看| 精品动漫3d一区二区三区| av成人毛片| 国产日本精品| 亚洲全部视频| 国产精品精品视频| 久久精品成人一区二区三区蜜臀| 免费在线国产精品| 中文一区二区在线观看| 久久久久成人精品| 最新日韩精品| 久久成人18免费网站| 亚洲国产美女精品久久久久∴| 亚洲欧美成人综合| 在线观看日韩国产| 亚洲专区在线视频| 曰本成人黄色| 午夜国产精品视频免费体验区| 一区免费视频| 亚洲欧美一区二区原创| 伊人久久大香线| 中文国产亚洲喷潮| 好吊妞这里只有精品| 在线中文字幕一区| 国产视频综合在线| 夜夜嗨av一区二区三区四区| 国产一区99| 亚洲深夜福利| 在线观看国产成人av片| 午夜精品www| 亚洲人成网站精品片在线观看| 欧美在线观看网址综合| 洋洋av久久久久久久一区| 美女国内精品自产拍在线播放| 亚洲伊人一本大道中文字幕| 欧美精品一区二区蜜臀亚洲| 久久精品亚洲一区二区三区浴池 |