RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)述Linux系統(tǒng)收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包的過(guò)程

dyquk4xk2p3d ? 來(lái)源:碼農(nóng)猿星球 ? 2023-05-05 10:04 ? 次閱讀

Linux 服務(wù)器收到網(wǎng)絡(luò)數(shù)據(jù)包,需要經(jīng)過(guò)哪些處理,一步步將數(shù)據(jù)傳給應(yīng)用進(jìn)程的呢?應(yīng)用進(jìn)程發(fā)送數(shù)據(jù)包時(shí),Linux 又是如何操作將數(shù)據(jù)包發(fā)送出去的呢?今天我們就來(lái)聊聊這個(gè)話題

在準(zhǔn)備好接收網(wǎng)絡(luò)數(shù)據(jù)包之前,Linux需要做很多準(zhǔn)備工作,例如:網(wǎng)絡(luò)子系統(tǒng)的初始化、協(xié)議棧的注冊(cè)、網(wǎng)卡驅(qū)動(dòng)的初始化、啟動(dòng)網(wǎng)卡等等,只有這些都準(zhǔn)備好了之后,才能真正開(kāi)始接收網(wǎng)絡(luò)包。

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

在介紹Linux收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包之前,我們先來(lái)了解一下Linux網(wǎng)絡(luò)協(xié)議棧。

國(guó)際標(biāo)準(zhǔn)化組織制定了開(kāi)放式系統(tǒng)互聯(lián)通信參考模型(Open System Interconnection Reference Model),也就是 OSI 網(wǎng)絡(luò)模型,該模型主要有 7 層,分別是應(yīng)用層、表示層、會(huì)話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層以及物理層。

由于 OSI 模型太復(fù)雜,提出的只是存在于概念和理論上的一種模型,分層太多,增加了網(wǎng)絡(luò)工作的復(fù)雜性,所以沒(méi)有大規(guī)模應(yīng)用。 我們比較常見(jiàn)是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é)的職能如下:

1、應(yīng)用層 對(duì)應(yīng)于OSI參考模型的高層,為用戶提供所需要的各種服務(wù),例如:FTP、Telnet、DNS、SMTP等.

2、傳輸層 對(duì)應(yīng)于OSI參考模型的傳輸層,為應(yīng)用層實(shí)體提供端到端的通信功能,保證了數(shù)據(jù)包的順序傳送及數(shù)據(jù)的完整性。該層定義了兩個(gè)主要的協(xié)議:傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報(bào)協(xié)議(UDP).

3、網(wǎng)絡(luò)層 對(duì)應(yīng)于OSI參考模型的網(wǎng)絡(luò)層,主要解決主機(jī)到主機(jī)的通信問(wèn)題。它所包含的協(xié)議設(shè)計(jì)數(shù)據(jù)包在整個(gè)網(wǎng)絡(luò)上的邏輯傳輸。注重重新賦予主機(jī)一個(gè)IP地址來(lái)完成對(duì)主機(jī)的尋址,它還負(fù)責(zé)數(shù)據(jù)包在多種網(wǎng)絡(luò)中的路由。該層有三個(gè)主要協(xié)議:網(wǎng)際協(xié)議(IP)、互聯(lián)網(wǎng)組管理協(xié)議(IGMP)和互聯(lián)網(wǎng)控制報(bào)文協(xié)議(ICMP)。

4、網(wǎng)絡(luò)接口層 與OSI參考模型中的物理層和數(shù)據(jù)鏈路層相對(duì)應(yīng)。它負(fù)責(zé)監(jiān)視數(shù)據(jù)在主機(jī)和網(wǎng)絡(luò)之間的交換。事實(shí)上,TCP/IP本身并未定義該層的協(xié)議,而由參與互連的各網(wǎng)絡(luò)使用自己的物理層和數(shù)據(jù)鏈路層協(xié)議,然后與TCP/IP的網(wǎng)絡(luò)接入層進(jìn)行連接。地址解析協(xié)議(ARP)工作在此層,即OSI參考模型的數(shù)據(jù)鏈路層。

87070764-ea68-11ed-90ce-dac502259ad0.png

接收網(wǎng)絡(luò)數(shù)據(jù)包

8717db8e-ea68-11ed-90ce-dac502259ad0.png

網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)網(wǎng)卡后,按照FIFO順序被存入網(wǎng)卡的接收隊(duì)列,網(wǎng)卡通過(guò) DMA 技術(shù),將網(wǎng)絡(luò)包寫入到指定的內(nèi)存地址(Ring Buffer)。

Ring Buffer是在網(wǎng)卡驅(qū)動(dòng)程序啟動(dòng)時(shí)創(chuàng)建和初始化的,存儲(chǔ)的是sk_buff緩沖區(qū)的描述符(物理地址和大小等)。

當(dāng)網(wǎng)絡(luò)包到達(dá)時(shí),從Ring Buffer獲取指向的sk_buff描述符,通過(guò)DMA將數(shù)據(jù)寫入該地址。等sk_buff中的數(shù)據(jù)交由上層協(xié)議棧處理后,Ring Buffer中的描述更新為新分配的sk_buff。

接著網(wǎng)卡向 CPU 發(fā)起硬件中斷,當(dāng) CPU 收到硬件中斷請(qǐng)求后,根據(jù)中斷注冊(cè)表,找到注冊(cè)的中斷處理函數(shù)。

硬件中斷處理函數(shù)會(huì)做如下的事情:

1、屏蔽網(wǎng)卡的中斷

目的是避免CPU被頻繁中斷而無(wú)法處理其他任務(wù),屏蔽中斷是告訴網(wǎng)卡已經(jīng)知道內(nèi)存中有數(shù)據(jù)了,下次再收到數(shù)據(jù)包直接寫內(nèi)存就可以了,不要再通知 CPU 了。

2、發(fā)起軟中斷,恢復(fù)剛才屏蔽的中斷

內(nèi)核中的 ksoftirqd 線程收到軟中斷后,就會(huì)調(diào)用相應(yīng)軟中斷的處理函數(shù)來(lái)輪詢處理數(shù)據(jù),即:從Ring Buffer 中獲取一個(gè)數(shù)據(jù)幀,用 sk_buff 表示,作為一個(gè)網(wǎng)絡(luò)包交給網(wǎng)絡(luò)協(xié)議棧從下到上進(jìn)行逐層處理。

網(wǎng)絡(luò)協(xié)議棧對(duì)網(wǎng)絡(luò)包的處理流程如下:

1、網(wǎng)絡(luò)接口層

首先,網(wǎng)絡(luò)接口層檢查報(bào)文的合法性和正確性,如果不合法或報(bào)文校驗(yàn)不正確則丟棄,否則找出上層協(xié)議的類型(IPv4還是IPv6),去掉幀頭、幀尾,然后交給上層即網(wǎng)絡(luò)層處理。

2、網(wǎng)絡(luò)層

網(wǎng)絡(luò)層取出IP頭,判斷網(wǎng)絡(luò)包下一步的走向,是轉(zhuǎn)發(fā)還是交給上層。當(dāng)確認(rèn)網(wǎng)絡(luò)包是要發(fā)送給本機(jī)后,就取出上層協(xié)議的類型(比如TCP或UDP),去掉IP頭,然后交給傳輸層處理。

3、傳輸層

傳輸層取出 TCP 頭或者 UDP 頭后,根據(jù)四元組【 源 IP、源端口、目的 IP、目的端口 】,找出對(duì)應(yīng)的 Socket,并把數(shù)據(jù)拷貝到 Socket 的接收緩沖區(qū)。

4、應(yīng)用層

最后,應(yīng)用層程序調(diào)用 Socket 接口,將內(nèi)核的 Socket 接收緩沖區(qū)的數(shù)據(jù)拷貝到應(yīng)用層的緩沖區(qū)。

到這里,一個(gè)網(wǎng)絡(luò)包的接收過(guò)程就結(jié)束了。

發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包

我們了解了網(wǎng)絡(luò)包的接收流程后,就很容易理解網(wǎng)絡(luò)包的發(fā)送流程了。網(wǎng)絡(luò)包的發(fā)送方向,正好跟接收方向相反。

首先,應(yīng)用程序調(diào)用 Socket 發(fā)送網(wǎng)絡(luò)包的接口。這是一個(gè)系統(tǒng)調(diào)用,會(huì)從用戶態(tài)陷入到內(nèi)核態(tài)的套接字層中。

套接字層會(huì)申請(qǐng)一個(gè)內(nèi)核態(tài)的 sk_buff 內(nèi)存,將用戶待發(fā)送的數(shù)據(jù)拷貝到 sk_buff 內(nèi)存,并將其加入到Socket發(fā)送緩沖區(qū)等待網(wǎng)絡(luò)協(xié)議棧的處理。

由于網(wǎng)絡(luò)數(shù)據(jù)包從應(yīng)用程序傳到內(nèi)核時(shí)是原始數(shù)據(jù),協(xié)議棧要在原始數(shù)據(jù)中加入通信約定才能保證數(shù)據(jù)到達(dá)服務(wù)端能被正確識(shí)別。網(wǎng)絡(luò)協(xié)議棧從 Socket 發(fā)送緩沖區(qū)中,取出數(shù)據(jù)包,然后按照 TCP/IP 棧的分層(傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層),從上到下逐層進(jìn)行處理,各層將協(xié)議的頭信息不斷插入到數(shù)據(jù)包中。

協(xié)議棧對(duì)發(fā)送數(shù)據(jù)包的處理流程如下:

1、傳輸層

在傳輸層,會(huì)為器添加TCP頭,同時(shí)拷貝一個(gè)新的 sk_buff 副本,這是因?yàn)?sk_buff 在到達(dá)網(wǎng)卡發(fā)送完成的時(shí)候,會(huì)被釋放掉,而TCP 協(xié)議是支持重傳的,為確保網(wǎng)絡(luò)包可靠傳輸,在收到對(duì)方的 ACK 之前,這個(gè) sk_buff 不能被刪除。

2、網(wǎng)絡(luò)層

在網(wǎng)絡(luò)層,主要會(huì)做這些工作:選取路由(確認(rèn)下一跳的 IP)、填充 IP 頭、netfilter 過(guò)濾、對(duì)超過(guò) MTU 大小的數(shù)據(jù)包進(jìn)行分片。處理完這些工作后會(huì)交給網(wǎng)絡(luò)接口層處理。

3、網(wǎng)絡(luò)接口層

網(wǎng)絡(luò)接口層會(huì)進(jìn)行物理地址尋址,以找到下一跳的 MAC 地址,填充幀頭和幀尾,將其放到發(fā)送隊(duì)列中。然后觸發(fā)軟中斷告訴網(wǎng)卡驅(qū)動(dòng)程序:隊(duì)列中有新的網(wǎng)絡(luò)包需要發(fā)送。驅(qū)動(dòng)程序收到通知會(huì)通過(guò) DMA ,從發(fā)送包隊(duì)列中讀出網(wǎng)絡(luò)幀,并通過(guò)DMA將數(shù)據(jù)寫入網(wǎng)卡的FIFO發(fā)送隊(duì)列。

4、網(wǎng)卡設(shè)備

網(wǎng)卡設(shè)備從FIFO發(fā)送隊(duì)列中取出數(shù)據(jù)包,將其發(fā)送到網(wǎng)絡(luò);當(dāng)發(fā)送完成的時(shí)候,網(wǎng)卡設(shè)備會(huì)觸發(fā)一個(gè)硬中斷來(lái)釋放內(nèi)存,主要是釋放 sk_buff內(nèi)存和清理 RingBuffer 內(nèi)存。最后,當(dāng)收到這個(gè) TCP 報(bào)文的 ACK 應(yīng)答時(shí),傳輸層就會(huì)釋放原始的 sk_buff。

至此,一個(gè)網(wǎng)絡(luò)包的發(fā)送流程就結(jié)束了。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209322
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    593

    瀏覽量

    27392
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1353

    瀏覽量

    79055
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    260

    瀏覽量

    24385
  • 網(wǎng)絡(luò)層
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    10294

原文標(biāo)題:簡(jiǎn)述Linux系統(tǒng)收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包的過(guò)程

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux系統(tǒng)收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包的工作過(guò)程

    Linux 服務(wù)器收到網(wǎng)絡(luò)數(shù)據(jù)包,需要經(jīng)過(guò)哪些處理,一步步將數(shù)據(jù)傳給應(yīng)用進(jìn)程的呢?應(yīng)用進(jìn)程發(fā)送數(shù)據(jù)包時(shí),
    發(fā)表于 06-08 12:34 ?534次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)收發(fā)網(wǎng)絡(luò)</b><b class='flag-5'>數(shù)據(jù)包</b>的工作<b class='flag-5'>過(guò)程</b>

    Linux場(chǎng)景下數(shù)據(jù)包是如何在協(xié)議層傳輸?shù)?/a>

    數(shù)據(jù) 應(yīng)用層發(fā)送數(shù)據(jù)過(guò)程大致如下: 我們把上述處理過(guò)程的區(qū)域大致分為: User區(qū)域 Kernel 區(qū)域 Device區(qū)域 在user和kernel區(qū)域的任務(wù)都是由本機(jī)cpu執(zhí)行,這
    的頭像 發(fā)表于 11-11 11:33 ?1112次閱讀
    <b class='flag-5'>Linux</b>場(chǎng)景下<b class='flag-5'>數(shù)據(jù)包</b>是如何在協(xié)議層傳輸?shù)? />    </a>
</div>                            <div   id=

    基于uC/OS-II和Libpcap的嵌入式數(shù)據(jù)包嗅探器的設(shè)

    本文應(yīng)用嵌入式技術(shù)設(shè)計(jì)了一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包嗅探器的軟硬件系統(tǒng),研究了把主要用于UNIX/Linux 平臺(tái)上捕獲網(wǎng)絡(luò)
    發(fā)表于 06-20 10:10 ?11次下載

    以太網(wǎng)數(shù)據(jù)包捕獲與轉(zhuǎn)發(fā)技術(shù)

    數(shù)據(jù)包捕獲技術(shù)在網(wǎng)絡(luò)安全領(lǐng)域中應(yīng)用十分廣泛,網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)、協(xié)議分析軟件、防火墻等都需要捕獲數(shù)據(jù)包。本文研究了
    發(fā)表于 07-30 11:19 ?63次下載

    網(wǎng)絡(luò)數(shù)據(jù)包捕獲機(jī)制研究

    網(wǎng)絡(luò)數(shù)據(jù)包捕獲技術(shù),是實(shí)現(xiàn)入侵檢測(cè)、網(wǎng)絡(luò)安全審計(jì)的關(guān)鍵技術(shù)。本文改進(jìn)了國(guó)外傳統(tǒng)的數(shù)據(jù)包捕獲函數(shù)庫(kù)Libpcap 捕獲數(shù)據(jù)包的方案。原方案在網(wǎng)
    發(fā)表于 09-01 10:09 ?9次下載

    Linux網(wǎng)絡(luò)防火墻Netfilter的數(shù)據(jù)包傳輸過(guò)濾原理

    給出了Linux網(wǎng)絡(luò)防火墻Netfilter在IPV4網(wǎng)絡(luò)環(huán)境下,Netfilter框架掛接點(diǎn)結(jié)構(gòu)及數(shù)據(jù)包的傳輸流程,并描述了在該流程中進(jìn)行數(shù)據(jù)包
    發(fā)表于 02-27 11:33 ?22次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>網(wǎng)絡(luò)</b>防火墻Netfilter的<b class='flag-5'>數(shù)據(jù)包</b>傳輸過(guò)濾原理

    你知道Linux網(wǎng)絡(luò)數(shù)據(jù)包的接收過(guò)程

    網(wǎng)卡需要有驅(qū)動(dòng)才能工作,驅(qū)動(dòng)是加載到內(nèi)核中的模塊,負(fù)責(zé)銜接網(wǎng)卡和內(nèi)核的網(wǎng)絡(luò)模塊,驅(qū)動(dòng)在加載的時(shí)候?qū)⒆约鹤?cè)進(jìn)網(wǎng)絡(luò)模塊,當(dāng)相應(yīng)的網(wǎng)卡收到數(shù)據(jù)包時(shí),網(wǎng)絡(luò)模塊會(huì)調(diào)用相應(yīng)的驅(qū)動(dòng)程序處理
    發(fā)表于 04-22 17:29 ?552次閱讀

    Linux網(wǎng)絡(luò)接收過(guò)程的監(jiān)控與調(diào)優(yōu)

    上一篇文章中《圖解Linux網(wǎng)絡(luò)接收過(guò)程》,我們梳理了在Linux系統(tǒng)下一個(gè)
    的頭像 發(fā)表于 11-10 14:50 ?1673次閱讀

    網(wǎng)絡(luò)數(shù)據(jù)包分析軟件wireshark的基本使用

    Wireshark(前稱Ethereal)是一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包分析軟件。網(wǎng)絡(luò)數(shù)據(jù)包分析軟件的功能是截取網(wǎng)絡(luò)數(shù)
    的頭像 發(fā)表于 09-29 14:48 ?3029次閱讀

    wireshark導(dǎo)入數(shù)據(jù)包進(jìn)行分析

    linux的tcpdump命令主要用于網(wǎng)絡(luò)問(wèn)題的調(diào)試中,通過(guò)抓取傳輸過(guò)程數(shù)據(jù)包進(jìn)行分析和調(diào)試。而wireshark則是一款功能強(qiáng)大,使用方便的數(shù)據(jù)
    的頭像 發(fā)表于 12-27 09:37 ?2113次閱讀

    如何使用家庭總線系統(tǒng)兼容收發(fā)器傳輸U(kuò)ART數(shù)據(jù)包

    Maxim Integrated首款兼容家庭總線系統(tǒng)(HBS)的收發(fā)器MAX22088提高了惡劣工業(yè)環(huán)境的性能。MAX22088設(shè)計(jì)用于家庭總線系統(tǒng),不限于這些網(wǎng)絡(luò)。本應(yīng)用筆記演示了使
    的頭像 發(fā)表于 01-12 11:50 ?1835次閱讀
    如何使用家庭總線<b class='flag-5'>系統(tǒng)</b>兼容<b class='flag-5'>收發(fā)</b>器傳輸U(kuò)ART<b class='flag-5'>數(shù)據(jù)包</b>

    Linux優(yōu)化實(shí)戰(zhàn):如何分析網(wǎng)絡(luò)的問(wèn)題

    所謂丟,是指在網(wǎng)絡(luò)數(shù)據(jù)收發(fā)過(guò)程中,由于種種原因,數(shù)據(jù)包還沒(méi)傳輸?shù)綉?yīng)用程序中,就被丟棄了。
    發(fā)表于 01-13 13:57 ?969次閱讀

    Wireshark網(wǎng)絡(luò)數(shù)據(jù)包分析軟件簡(jiǎn)介

    wireshark是一個(gè)免費(fèi)開(kāi)源的網(wǎng)絡(luò)數(shù)據(jù)包分析軟件,功能十分強(qiáng)大??梢越厝「鞣N網(wǎng)絡(luò)數(shù)據(jù)包,顯示網(wǎng)絡(luò)數(shù)據(jù)
    的頭像 發(fā)表于 04-26 09:52 ?2800次閱讀
    Wireshark<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>數(shù)據(jù)包</b>分析軟件簡(jiǎn)介

    Linux如何操作將數(shù)據(jù)包發(fā)送出去

    數(shù)據(jù)包之前,Linux需要做很多準(zhǔn)備工作,例如:網(wǎng)絡(luò)子系統(tǒng)的初始化、協(xié)議棧的注冊(cè)、網(wǎng)卡驅(qū)動(dòng)的初始化、啟動(dòng)網(wǎng)卡等等,只有這些都準(zhǔn)備好了之后,才能真正開(kāi)始接收網(wǎng)絡(luò)
    的頭像 發(fā)表于 06-17 16:00 ?1034次閱讀
    <b class='flag-5'>Linux</b>如何操作將<b class='flag-5'>數(shù)據(jù)包</b>發(fā)送出去

    請(qǐng)問(wèn)高端網(wǎng)絡(luò)芯片如何處理數(shù)據(jù)包呢?

    隨著網(wǎng)絡(luò)芯片帶寬的持續(xù)提升,其內(nèi)部數(shù)據(jù)包處理單元的工作負(fù)載也隨之增加。然而,如果處理單元無(wú)法與網(wǎng)絡(luò)接口的傳入速率相匹配,將無(wú)法及時(shí)處理數(shù)據(jù)包,這不僅會(huì)導(dǎo)致
    的頭像 發(fā)表于 04-02 16:36 ?621次閱讀
    請(qǐng)問(wèn)高端<b class='flag-5'>網(wǎng)絡(luò)</b>芯片如何處理<b class='flag-5'>數(shù)據(jù)包</b>呢?
    RM新时代网站-首页