日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 小林coding
[導(dǎo)讀]為了使得多種設(shè)備能通過(guò)網(wǎng)絡(luò)相互通信,和為了解決各種不同設(shè)備在網(wǎng)絡(luò)互聯(lián)中的兼容性問(wèn)題,國(guó)際標(biāo)標(biāo)準(zhǔn)化組織制定了開(kāi)放式系統(tǒng)互聯(lián)通信參考模型(pen System Interconnection Reference Model),也就是OSI網(wǎng)絡(luò)模型,該模型主要有7層,分別是應(yīng)用層、表示層、會(huì)話(huà)層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層以及物理層。

前言

這次,就圍繞一個(gè)問(wèn)題來(lái)說(shuō)。

Linux 系統(tǒng)是如何收發(fā)網(wǎng)絡(luò)包的?


正文

網(wǎng)絡(luò)模型

為了使得多種設(shè)備能通過(guò)網(wǎng)絡(luò)相互通信,和為了解決各種不同設(shè)備在網(wǎng)絡(luò)互聯(lián)中的兼容性問(wèn)題,國(guó)際標(biāo)標(biāo)準(zhǔn)化組織制定了開(kāi)放式系統(tǒng)互聯(lián)通信參考模型(pen System Interconnection Reference Model),也就是 OSI 網(wǎng)絡(luò)模型,該模型主要有 7 層,分別是應(yīng)用層、表示層、會(huì)話(huà)層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層以及物理層。

每一層負(fù)責(zé)的職能都不同,如下:

  • 應(yīng)用層,負(fù)責(zé)給應(yīng)用程序提供統(tǒng)一的接口;

  • 表示層,負(fù)責(zé)把數(shù)據(jù)轉(zhuǎn)換成兼容另一個(gè)系統(tǒng)能識(shí)別的格式;

  • 會(huì)話(huà)層,負(fù)責(zé)建立、管理和終止表示層實(shí)體之間的通信會(huì)話(huà);

  • 傳輸層,負(fù)責(zé)端到端的數(shù)據(jù)傳輸;

  • 網(wǎng)絡(luò)層,負(fù)責(zé)數(shù)據(jù)的路由、轉(zhuǎn)發(fā)、分片;

  • 數(shù)據(jù)鏈路層,負(fù)責(zé)數(shù)據(jù)的封幀和差錯(cuò)檢測(cè),以及 MAC 尋址;

  • 物理層,負(fù)責(zé)在物理網(wǎng)絡(luò)中傳輸數(shù)據(jù)幀;

由于 OSI 模型實(shí)在太復(fù)雜,提出的也只是概念理論上的分層,并沒(méi)有提供具體的實(shí)現(xiàn)方案。事實(shí)上,我們比較常見(jiàn),也比較實(shí)用的是四層模型,即 TCP/IP 網(wǎng)絡(luò)模型,Linux 系統(tǒng)正是按照這套網(wǎng)絡(luò)模型來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議棧的。

TCP/IP 網(wǎng)絡(luò)模型共有 4 層,分別是應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層,每一層負(fù)責(zé)的職能如下:

  • 應(yīng)用層,負(fù)責(zé)向用戶(hù)提供一組應(yīng)用程序,比如 HTTP、DNS、FTP 等;

  • 傳輸層,負(fù)責(zé)端到端的通信,比如 TCP、UDP 等;

  • 網(wǎng)絡(luò)層,負(fù)責(zé)網(wǎng)絡(luò)包的封裝、分片、路由、轉(zhuǎn)發(fā),比如 IP、ICMP 等;

  • 網(wǎng)絡(luò)接口層,負(fù)責(zé)網(wǎng)絡(luò)包在物理網(wǎng)絡(luò)中的傳輸,比如網(wǎng)絡(luò)包的封幀、 MAC 尋址、差錯(cuò)檢測(cè),以及通過(guò)網(wǎng)卡傳輸網(wǎng)絡(luò)幀等;

TCP/IP 網(wǎng)絡(luò)模型相比 OSI 網(wǎng)絡(luò)模型簡(jiǎn)化了不少,也更加易記,它們之間的關(guān)系如下圖:

不過(guò),我們常說(shuō)的七層和四層負(fù)載均衡,是用 OSI 網(wǎng)絡(luò)模型來(lái)描述的,七層對(duì)應(yīng)的是應(yīng)用層,四層對(duì)應(yīng)的是傳輸層。


Linux 網(wǎng)絡(luò)協(xié)議棧

我們可以把自己的身體比作應(yīng)用層中的數(shù)據(jù),打底衣服比作傳輸層中的 TCP 頭,外套比作網(wǎng)絡(luò)層中 IP 頭,帽子和鞋子分別比作網(wǎng)絡(luò)接口層的幀頭和幀尾。

在冬天這個(gè)季節(jié),當(dāng)我們要從家里出去玩的時(shí)候,自然要先穿個(gè)打底衣服,再套上保暖外套,最后穿上帽子和鞋子才出門(mén),這個(gè)過(guò)程就好像我們把 TCP 協(xié)議通信的網(wǎng)絡(luò)包發(fā)出去的時(shí)候,會(huì)把應(yīng)用層的數(shù)據(jù)按照網(wǎng)絡(luò)協(xié)議棧層層封裝和處理。

你從下面這張圖可以看到,應(yīng)用層數(shù)據(jù)在每一層的封裝格式。

其中:

  • 傳輸層,給應(yīng)用數(shù)據(jù)前面增加了 TCP ?頭;

  • 網(wǎng)絡(luò)層,給 TCP 數(shù)據(jù)包前面增加了 IP ?頭;

  • 網(wǎng)絡(luò)接口層,給 IP 數(shù)據(jù)包前后分別增加了幀頭和幀尾;

這些新增和頭部和尾部,都有各自的作用,也都是按照特定的協(xié)議格式填充,這每一層都增加了各自的協(xié)議頭,那自然網(wǎng)絡(luò)包的大小就增大了,但物理鏈路并不能傳輸任意大小的數(shù)據(jù)包,所以在以太網(wǎng)中,規(guī)定了最大傳輸單元(MTU)是 1500 字節(jié),也就是規(guī)定了單次傳輸?shù)淖畲?IP 包大小。

當(dāng)網(wǎng)絡(luò)包超過(guò) MTU 的大小,就會(huì)在網(wǎng)絡(luò)層分片,以確保分片后的 IP 包不會(huì)超過(guò) MTU 大小,如果 MTU 越小,需要的分包就越多,那么網(wǎng)絡(luò)吞吐能力就越差,相反的,如果 MTU 越大,需要的分包就越小,那么網(wǎng)絡(luò)吞吐能力就越好。

知道了 TCP/IP 網(wǎng)絡(luò)模型,以及網(wǎng)絡(luò)包的封裝原理后,那么 Linux 網(wǎng)絡(luò)協(xié)議棧的樣子,你想必猜到了大概,它其實(shí)就類(lèi)似于 TCP/IP 的四層結(jié)構(gòu):

從上圖的的網(wǎng)絡(luò)協(xié)議棧,你可以看到:

  • 應(yīng)用程序需要通過(guò)系統(tǒng)調(diào)用,來(lái)跟 Socket 層進(jìn)行數(shù)據(jù)交互;

  • Socket 層的下面就是傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層;

  • 最下面的一層,則是網(wǎng)卡驅(qū)動(dòng)程序和硬件網(wǎng)卡設(shè)備;


Linux 接收網(wǎng)絡(luò)包的流程

網(wǎng)卡是計(jì)算機(jī)里的一個(gè)硬件,專(zhuān)門(mén)負(fù)責(zé)接收和發(fā)送網(wǎng)絡(luò)包,當(dāng)網(wǎng)卡接收到一個(gè)網(wǎng)絡(luò)包后,會(huì)通過(guò) DMA 技術(shù),將網(wǎng)絡(luò)包放入到 Ring Buffer,這個(gè)是一個(gè)環(huán)形緩沖區(qū)。

那接收到網(wǎng)絡(luò)包后,應(yīng)該怎么告訴操作系統(tǒng)這個(gè)網(wǎng)絡(luò)包已經(jīng)到達(dá)了呢?

最簡(jiǎn)單的一種方式就是觸發(fā)中斷,也就是每當(dāng)網(wǎng)卡收到一個(gè)網(wǎng)絡(luò)包,就觸發(fā)一個(gè)中斷告訴操作系統(tǒng)。

但是,這存在一個(gè)問(wèn)題,在高性能網(wǎng)絡(luò)場(chǎng)景下,網(wǎng)絡(luò)包的數(shù)量會(huì)非常多,那么就會(huì)觸發(fā)非常多的中斷,要知道當(dāng) CPU ?收到了中斷,就會(huì)停下手里的事情,而去處理這些網(wǎng)絡(luò)包,處理完畢后,才會(huì)回去繼續(xù)其他事情,那么頻繁地觸發(fā)中斷,則會(huì)導(dǎo)致 CPU 一直沒(méi)玩沒(méi)了的處理中斷,而導(dǎo)致其他任務(wù)可能無(wú)法繼續(xù)前進(jìn),從而影響系統(tǒng)的整體效率。

所以為了解決頻繁中斷帶來(lái)的性能開(kāi)銷(xiāo),Linux 內(nèi)核在 2.6 版本中引入了 NAPI 機(jī)制,它是混合「中斷和輪詢(xún)」的方式來(lái)接收網(wǎng)絡(luò)包,它的核心概念就是不采用中斷的方式讀取數(shù)據(jù),而是首先采用中斷喚醒數(shù)據(jù)接收的服務(wù)程序,然后 poll 的方法來(lái)輪詢(xún)數(shù)據(jù)。

比如,當(dāng)有網(wǎng)絡(luò)包到達(dá)時(shí),網(wǎng)卡發(fā)起硬件中斷,于是會(huì)執(zhí)行網(wǎng)卡硬件中斷處理函數(shù),中斷處理函數(shù)處理完需要「暫時(shí)屏蔽中斷」,然后喚醒「軟中斷」來(lái)輪詢(xún)處理數(shù)據(jù),直到?jīng)]有新數(shù)據(jù)時(shí)才恢復(fù)中斷,這樣一次中斷處理多個(gè)網(wǎng)絡(luò)包,于是就可以降低網(wǎng)卡中斷帶來(lái)的性能開(kāi)銷(xiāo)。

那軟中斷是怎么處理網(wǎng)絡(luò)包的呢?它會(huì)從 Ring Buffer 中拷貝數(shù)據(jù)到內(nèi)核 struct sk_buff 緩沖區(qū)中,從而可以作為一個(gè)網(wǎng)絡(luò)包交給網(wǎng)絡(luò)協(xié)議棧進(jìn)行逐層處理。

首先,會(huì)先進(jìn)入到網(wǎng)絡(luò)接口層,在這一層會(huì)檢查報(bào)文的合法性,如果不合法則丟棄,合法則會(huì)找出該網(wǎng)絡(luò)包的上層協(xié)議的類(lèi)型,比如是 IPv4,還是 IPv6,接著再去掉幀頭和幀尾,然后交給網(wǎng)絡(luò)層。

到了網(wǎng)絡(luò)層,則取出 IP 包,判斷網(wǎng)絡(luò)包下一步的走向,比如是交給上層處理還是轉(zhuǎn)發(fā)出去。當(dāng)確認(rèn)這個(gè)網(wǎng)絡(luò)包要發(fā)送給本機(jī)后,就會(huì)從 IP 頭里看看上一層協(xié)議的類(lèi)型是 TCP 還是 UDP,接著去掉 IP 頭,然后交給傳輸層。

傳輸層取出 TCP 頭或 UDP 頭,根據(jù)四元組「源 IP、源端口、目的 IP、目的端口」 作為標(biāo)識(shí),找出對(duì)應(yīng)的 Socket,并把數(shù)據(jù)拷貝到 Socket 的接收緩沖區(qū)。

最后,應(yīng)用層程序調(diào)用 Socket 接口,從內(nèi)核的 Socket 接收緩沖區(qū)讀取新到來(lái)的數(shù)據(jù)到應(yīng)用層。

至此,一個(gè)網(wǎng)絡(luò)包的接收過(guò)程就已經(jīng)結(jié)束了,你也可以從下圖左邊部分看到網(wǎng)絡(luò)包接收的流程,右邊部分剛好反過(guò)來(lái),它是網(wǎng)絡(luò)包發(fā)送的流程。


Linux 發(fā)送網(wǎng)絡(luò)包的流程

如上圖的有半部分,發(fā)送網(wǎng)絡(luò)包的流程正好和接收流程相反。

首先,應(yīng)用程序會(huì)調(diào)用 Socket 發(fā)送數(shù)據(jù)包的接口,由于這個(gè)是系統(tǒng)調(diào)用,所以會(huì)從用戶(hù)態(tài)陷入到內(nèi)核態(tài)中的 Socket 層,Socket 層會(huì)將應(yīng)用層數(shù)據(jù)拷貝到 Socket 發(fā)送緩沖區(qū)中。

接下來(lái),網(wǎng)絡(luò)協(xié)議棧從 Socket 發(fā)送緩沖區(qū)中取出數(shù)據(jù)包,并按照 TCP/IP 協(xié)議棧從上到下逐層處理。

如果使用的是 TCP 傳輸協(xié)議發(fā)送數(shù)據(jù),那么會(huì)在傳輸層增加 TCP 包頭,然后交給網(wǎng)絡(luò)層,網(wǎng)絡(luò)層會(huì)給數(shù)據(jù)包增加 IP 包,然后通過(guò)查詢(xún)路由表確認(rèn)下一跳的 IP,并按照 MTU 大小進(jìn)行分片。

分片后的網(wǎng)絡(luò)包,就會(huì)被送到網(wǎng)絡(luò)接口層,在這里會(huì)通過(guò) ARP 協(xié)議獲得下一跳的 MAC 地址,然后增加幀頭和幀尾,放到發(fā)包隊(duì)列中。

這一些準(zhǔn)備好后,會(huì)觸發(fā)軟中斷告訴網(wǎng)卡驅(qū)動(dòng)程序,這里有新的網(wǎng)絡(luò)包需要發(fā)送,最后驅(qū)動(dòng)程序通過(guò) DMA,從發(fā)包隊(duì)列中讀取網(wǎng)絡(luò)包,將其放入到硬件網(wǎng)卡的隊(duì)列中,隨后物理網(wǎng)卡再將它發(fā)送出去。


總結(jié)

電腦與電腦之間通常都是通話(huà)網(wǎng)卡、交換機(jī)、路由器等網(wǎng)絡(luò)設(shè)備連接到一起,那由于網(wǎng)絡(luò)設(shè)備的異構(gòu)性,國(guó)際標(biāo)準(zhǔn)化組織定義了一個(gè)七層的 OSI 網(wǎng)絡(luò)模型,但是這個(gè)模型由于比較復(fù)雜,實(shí)際應(yīng)用中并沒(méi)有采用,而是采用了更為簡(jiǎn)化的 TCP/IP 模型,Linux 網(wǎng)絡(luò)協(xié)議棧就是按照了該模型來(lái)實(shí)現(xiàn)的。

TCP/IP 模型主要分為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層四層,每一層負(fù)責(zé)的職責(zé)都不同,這也是 Linux 網(wǎng)絡(luò)協(xié)議棧主要構(gòu)成部分。

當(dāng)應(yīng)用程序通過(guò) Socket 接口發(fā)送數(shù)據(jù)包,數(shù)據(jù)包會(huì)被網(wǎng)絡(luò)協(xié)議棧從上到下進(jìn)行逐層處理后,才會(huì)被送到網(wǎng)卡隊(duì)列中,隨后由網(wǎng)卡將網(wǎng)絡(luò)包發(fā)送出去。

而在接收網(wǎng)絡(luò)包時(shí),同樣也要先經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧從下到上的逐層處理,最后才會(huì)被送到應(yīng)用程序。


哈嘍,我是小林,就愛(ài)圖解計(jì)算機(jī)基礎(chǔ),如果覺(jué)得文章對(duì)你有幫助,歡迎分享給你的朋友,也給小林點(diǎn)個(gè)「在看」,這對(duì)小林非常重要,謝謝你們,給各位小姐姐小哥哥們抱拳了,我們下次見(jiàn)!


推薦閱讀

探究!一個(gè)數(shù)據(jù)包在網(wǎng)絡(luò)中的心路歷程

原來(lái) 8 張圖,就可以搞懂「零拷貝」了

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉