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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

Linux網(wǎng)絡協(xié)議棧的實現(xiàn)

望獲Linux ? 來源:jf_20082045 ? 作者:jf_20082045 ? 2024-09-10 09:51 ? 次閱讀

網(wǎng)絡協(xié)議棧是操作系統(tǒng)核心的一個重要組成部分,負責管理網(wǎng)絡通信中的數(shù)據(jù)包處理。在 Linux 操作系統(tǒng)中,網(wǎng)絡協(xié)議棧(Network Stack)負責實現(xiàn) TCP/IP 協(xié)議簇,處理應用程序發(fā)起的網(wǎng)絡請求并與底層的網(wǎng)絡硬件進行交互。本文將深入探討 Linux 網(wǎng)絡協(xié)議棧的架構(gòu)與實現(xiàn),涵蓋數(shù)據(jù)包處理流程、關(guān)鍵模塊、協(xié)議棧層次以及性能優(yōu)化等方面。


網(wǎng)絡協(xié)議棧架構(gòu)

Linux 網(wǎng)絡協(xié)議棧采用分層架構(gòu),與 OSI(Open Systems Interconnection)模型類似,分為以下幾個主要層次:

應用層:應用程序通過系統(tǒng)調(diào)用訪問網(wǎng)絡,如 send() 和 recv()。有些應用層協(xié)議,例如NFS,就在內(nèi)核直接處理了。
傳輸層:處理端到端的通信,如 TCP 和 UDP 協(xié)議以及ICMP協(xié)議。
網(wǎng)絡層:負責路由和數(shù)據(jù)包轉(zhuǎn)發(fā),主要協(xié)議是 IP。
數(shù)據(jù)鏈路層:負責局域網(wǎng)內(nèi)的數(shù)據(jù)傳輸,如 Ethernet 協(xié)議。
物理層:最終數(shù)據(jù)通過網(wǎng)絡接口卡(NIC)發(fā)送到物理介質(zhì)上。

Linux 的網(wǎng)絡協(xié)議棧通過內(nèi)核的多層模塊化設計,實現(xiàn)了對不同網(wǎng)絡協(xié)議的支持。這種模塊化設計不僅提升了系統(tǒng)的靈活性和擴展性,也方便了內(nèi)核開發(fā)者對協(xié)議棧進行維護與擴展。


網(wǎng)絡協(xié)議棧的分層實現(xiàn)

Linux 內(nèi)核通過各個子模塊和協(xié)議棧層之間的相互協(xié)作,完成網(wǎng)絡通信任務:

Socket 層:Socket 是用戶態(tài)與內(nèi)核通信的接口,應用程序通過 Socket API 與網(wǎng)絡協(xié)議棧交互。Socket 實際上是一個抽象層,它將不同協(xié)議的實現(xiàn)封裝起來,向用戶提供統(tǒng)一的接口。

傳輸層(Transport Layer):處理端到端的數(shù)據(jù)傳輸協(xié)議,如 TCP 和 UDP。TCP 協(xié)議提供可靠的字節(jié)流傳輸,而 UDP 則提供無連接的報文傳輸。Linux 通過 net/ipv4目錄下的tcp_ipv4.c和udp.c等文件實現(xiàn)這些協(xié)議。

網(wǎng)絡層(Network Layer):負責 IP 地址的路由和轉(zhuǎn)發(fā),核心實現(xiàn)位于 net/ipv4目錄下的ip_input.c 和 ip_output.c 文件中。IP 層還實現(xiàn)了路由表、ARP 協(xié)議等功能。

數(shù)據(jù)鏈路層(Link Layer):這一層處理硬件接口的通信,負責將數(shù)據(jù)包從網(wǎng)絡協(xié)議層傳遞到物理網(wǎng)絡設備(如以太網(wǎng)卡)。核心文件包括 net/core/dev.c(用于網(wǎng)絡設備管理和網(wǎng)絡設備的抽象和操作)。以及具體的網(wǎng)卡驅(qū)動的文件,例如drivers/net/ethernet/intel/e1000/e1000_main.c。

wKgaombfpT-AeVQcAACjr17dpiQ190.png圖1 Linux網(wǎng)絡協(xié)議棧的分層實現(xiàn)

圖1中,Berkeley Socket Interface就是Socket層即套接字層。Protocal Layer即網(wǎng)絡協(xié)議層,包括了傳輸層和網(wǎng)絡層。圖1自Network Device Driver Interface/Queuing Discipline以下屬于數(shù)據(jù)鏈路層。這里Queuing Discipline的意思是Linux為了實現(xiàn)網(wǎng)絡帶寬管理和控制,對網(wǎng)絡數(shù)據(jù)包按照策略進行排隊處理。


Linux 網(wǎng)絡協(xié)議棧的數(shù)據(jù)包處理流程

網(wǎng)絡數(shù)據(jù)包是網(wǎng)絡通訊的載體。數(shù)據(jù)包處理分為入站和出站兩個方向。


入站數(shù)據(jù)包處理

當一個數(shù)據(jù)包從外部網(wǎng)絡接收到達時,Linux 的網(wǎng)絡協(xié)議棧會按以下流程處理:

網(wǎng)絡接口接收:物理層通過 NIC 硬件設備接收到數(shù)據(jù)包,并通過驅(qū)動程序?qū)?shù)據(jù)包傳遞給 Linux 內(nèi)核。Linux 使用中斷或輪詢機制處理網(wǎng)絡設備的輸入。

數(shù)據(jù)鏈路層處理:數(shù)據(jù)包進入數(shù)據(jù)鏈路層(例如以太網(wǎng)層),協(xié)議棧會解析以太網(wǎng)幀的頭部,判斷數(shù)據(jù)包的類型(如 IPv4、IPv6 等)。數(shù)據(jù)鏈路層還會對數(shù)據(jù)包進行錯誤檢測(如 CRC 校驗)等操作。

網(wǎng)絡層處理:數(shù)據(jù)包進入 IP 層,內(nèi)核解析 IP 頭部,判斷數(shù)據(jù)包是否屬于本機或是否需要轉(zhuǎn)發(fā)。如果數(shù)據(jù)包屬于本機,IP 層會檢查協(xié)議類型(如 TCP、UDP 等),然后將數(shù)據(jù)包傳遞到對應的傳輸層協(xié)議處理模塊。

傳輸層處理:如果數(shù)據(jù)包使用 TCP 協(xié)議,內(nèi)核會檢查 TCP 頭部信息,確認數(shù)據(jù)包是否屬于已建立的連接,并進行流控、重傳等操作。如果是 UDP 數(shù)據(jù)包,則直接傳遞給上層的應用程序。

應用層交付:最終,經(jīng)過傳輸層處理的數(shù)據(jù)被傳遞到應用層。應用程序通過 recv() 等系統(tǒng)調(diào)用接收數(shù)據(jù)。

wKgZombfpVCAY6VYAAS5FnV15EE506.png圖2 內(nèi)核調(diào)試器下觀察入站數(shù)據(jù)包處理

圖2是利用內(nèi)核調(diào)試器觀察的入站數(shù)據(jù)包處理流程,圖2中,沒有數(shù)據(jù)鏈路層的信息,這是因為Linux采用了NAPI機制對網(wǎng)絡數(shù)據(jù)包處理進行了優(yōu)化。在 Linux 網(wǎng)絡協(xié)議棧中,NAPI引入了一種混合中斷和輪詢的方式來處理高負載下的網(wǎng)絡數(shù)據(jù)包。NAPI 數(shù)據(jù)包隊列是該機制的核心部分之一,它用于存儲接收到的網(wǎng)絡數(shù)據(jù)包并等待后續(xù)處理。

出站數(shù)據(jù)包處理

當應用程序需要發(fā)送數(shù)據(jù)時,Linux 網(wǎng)絡協(xié)議棧會按以下流程處理:

應用程序請求:應用程序通過 Socket API 發(fā)送數(shù)據(jù),操作系統(tǒng)通過系統(tǒng)調(diào)用(如 send())進入內(nèi)核。

傳輸層封裝:傳輸層協(xié)議(如 TCP/UDP)對數(shù)據(jù)進行封裝,添加相應的協(xié)議頭部,如 TCP 的源端口、目的端口、序列號等信息。對于 TCP,可能還會進行數(shù)據(jù)的分段與流控。

網(wǎng)絡層路由:封裝好的數(shù)據(jù)傳遞給 IP 層,IP 層會為數(shù)據(jù)包選擇最佳的路由,添加 IP 頭部(如源 IP 地址、目的 IP 地址等),并將數(shù)據(jù)包發(fā)送到合適的網(wǎng)絡接口。

數(shù)據(jù)鏈路層封裝:數(shù)據(jù)鏈路層將 IP 數(shù)據(jù)包封裝成適合硬件傳輸?shù)膸ㄈ缫蕴W(wǎng)幀),并根據(jù) ARP 協(xié)議找到目標 MAC 地址。

硬件發(fā)送:最終,封裝好的數(shù)據(jù)包通過網(wǎng)絡接口卡發(fā)出,數(shù)據(jù)傳遞到物理網(wǎng)絡。

wKgZombfpVyAFWcmAAUZsAm_glg719.png圖3 內(nèi)核調(diào)試器下觀察出站數(shù)據(jù)包處理

圖3是利用內(nèi)核調(diào)試器觀察的出站數(shù)據(jù)包處理流程。tcp開頭的函數(shù)屬于傳輸層協(xié)議處理流程,包含ip的函數(shù)屬于網(wǎng)絡層協(xié)議處理流程,包含neigh的函數(shù)也屬于網(wǎng)絡層處理流程的ARP處理子流程(為了和ipv6統(tǒng)一,Linux使用了network neighbor的概念處理ARP協(xié)議)。包含e1000的函數(shù)屬于數(shù)據(jù)鏈路層協(xié)議處理流程。


核心數(shù)據(jù)結(jié)構(gòu)


sock 結(jié)構(gòu)體

wKgaombfpWqAVzHRAAGH3AoMhS0467.png

sock 結(jié)構(gòu)體是 Linux 網(wǎng)絡協(xié)議棧中的核心數(shù)據(jù)結(jié)構(gòu)之一,它代表了內(nèi)核中每個 Socket 對象,并包含有關(guān)網(wǎng)絡連接的狀態(tài)信息。sock 結(jié)構(gòu)體不僅用于管理應用層的 Socket,還用于管理協(xié)議層的狀態(tài)。


sk_buff 結(jié)構(gòu)體

wKgZombfpXGAO5qIAAFuvevEmLU238.png

sk_buff(Socket Buffer)是 Linux 中用于存儲和處理網(wǎng)絡數(shù)據(jù)包的關(guān)鍵結(jié)構(gòu)體。每個 sk_buff 都包含一個完整的網(wǎng)絡數(shù)據(jù)包,從鏈路層到應用層的數(shù)據(jù)都可以在其中進行存取。
總結(jié)

Linux 網(wǎng)絡協(xié)議棧通過分層的架構(gòu)實現(xiàn)對網(wǎng)絡通信的高效管理。其各層次分別負責處理不同的網(wǎng)絡協(xié)議與功能,從應用層的 Socket 接口到物理層的實際數(shù)據(jù)傳輸。關(guān)鍵的傳輸層協(xié)議如 TCP 和 UDP 在內(nèi)核中實現(xiàn),確保數(shù)據(jù)的可靠傳輸與高效分發(fā)。Linux在事實上已經(jīng)成為TCP/IP網(wǎng)絡協(xié)議最完美的參考實現(xiàn)!

審核編輯 黃宇

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

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207888
  • 網(wǎng)絡協(xié)議
    +關(guān)注

    關(guān)注

    3

    文章

    251

    瀏覽量

    21467
  • 協(xié)議棧
    +關(guān)注

    關(guān)注

    2

    文章

    137

    瀏覽量

    33571
收藏 人收藏

    評論

    相關(guān)推薦

    TCP/IP協(xié)議的設計與實現(xiàn)_中文

    電子發(fā)燒友網(wǎng)站提供《TCP/IP協(xié)議的設計與實現(xiàn)_中文.pdf》資料免費下載
    發(fā)表于 07-03 11:28 ?2次下載

    LwIP協(xié)議源碼詳解—TCP/IP協(xié)議實現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《LwIP協(xié)議源碼詳解—TCP/IP協(xié)議實現(xiàn).pdf》資料免費下載
    發(fā)表于 07-03 11:22 ?1次下載

    基于MM32G5330的FlexCAN實現(xiàn)CANopenNode協(xié)議移植

    本文將介紹如何基于靈動MM32G5330的FlexCAN實現(xiàn)CANopenNode協(xié)議的移植,并使用靈動官方提供的開發(fā)板Mini-G5333進行驗證。
    發(fā)表于 04-12 09:15 ?1140次閱讀
    基于MM32G5330的FlexCAN<b class='flag-5'>實現(xiàn)</b>CANopenNode<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>移植

    PROFINET協(xié)議通信技術(shù)介紹

    PROFINET協(xié)議是PROFINET通信協(xié)議實現(xiàn)基礎,它由多個層次組成,每個層次都有特定的功能和作用。
    的頭像 發(fā)表于 02-03 16:22 ?2205次閱讀

    使用LwIP協(xié)議淺析實戰(zhàn)分析(i.MX RT)

    LWIP協(xié)議網(wǎng)絡分層 LwIP(Light weight IP),是一種輕量化且開源的TCP/IP協(xié)議,它可以在有限的RAM和ROM條件下,實現(xiàn)
    的頭像 發(fā)表于 02-02 17:05 ?1185次閱讀
    使用LwIP<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>淺析實戰(zhàn)分析(i.MX RT)

    通信網(wǎng)絡協(xié)議之UDP協(xié)議技術(shù)解析

    在通常的網(wǎng)絡協(xié)議中,TCP/IP協(xié)議是一個常見的示例,其中UDP和TCP都是傳輸層協(xié)議。傳輸
    發(fā)表于 02-01 11:00 ?675次閱讀
    通信<b class='flag-5'>網(wǎng)絡</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>之UDP<b class='flag-5'>協(xié)議</b>技術(shù)解析

    Linux網(wǎng)絡子系統(tǒng)的實現(xiàn)

    Linux網(wǎng)絡子系統(tǒng)的分層 Linux網(wǎng)絡子系統(tǒng)實現(xiàn)需要: l 支持不同的協(xié)議族 ( INET,
    的頭像 發(fā)表于 11-11 11:25 ?1063次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網(wǎng)絡</b>子系統(tǒng)的<b class='flag-5'>實現(xiàn)</b>

    linux TCP/IP 協(xié)議源碼分析

    一.linux內(nèi)核網(wǎng)絡代碼的準備知識 linux內(nèi)核ipv4網(wǎng)絡部分分層結(jié)構(gòu): BSD socket層: 這一部分處理BSD socket
    的頭像 發(fā)表于 11-09 15:04 ?2074次閱讀
    <b class='flag-5'>linux</b> TCP/IP <b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>源碼分析

    基于BlueZ協(xié)議的藍牙語音接入系統(tǒng)實現(xiàn)與性能分析

    電子發(fā)燒友網(wǎng)站提供《基于BlueZ協(xié)議的藍牙語音接入系統(tǒng)實現(xiàn)與性能分析.pdf》資料免費下載
    發(fā)表于 10-30 11:25 ?0次下載
    基于BlueZ<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>的藍牙語音接入系統(tǒng)<b class='flag-5'>實現(xiàn)</b>與性能分析

    AUTOSAR軟件AVB協(xié)議介紹

    、可靠的音視頻傳輸和同步功能。汽車以太網(wǎng)AVB協(xié)議包含以下功能軟件: AVB協(xié)議實現(xiàn)了AVB網(wǎng)絡的基本
    的頭像 發(fā)表于 10-27 16:44 ?2140次閱讀
    AUTOSAR軟件AVB<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>介紹

    汽車UDS協(xié)議與XCP協(xié)議

    在車輛中進行故障診斷、參數(shù)配置和編程等操作。 UDS協(xié)議通常包含以下功能軟件: 通信層:負責處理UDS協(xié)議的通信,包括CAN總線通信、LIN總線通信等。 診斷服務:實現(xiàn)了UDS
    的頭像 發(fā)表于 10-27 16:35 ?3561次閱讀
    汽車UDS<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>與XCP<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>

    CAN協(xié)議與LIN協(xié)議介紹

    CAN協(xié)議 汽車CAN協(xié)議是一種軟件組件,用于實現(xiàn)汽車電子系統(tǒng)中的CAN總線通信功能。它包含了一系列的功能軟件,用于處理CAN總線的物理
    的頭像 發(fā)表于 10-27 16:16 ?2565次閱讀
    CAN<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>與LIN<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>介紹

    基于ZigBee協(xié)議的無線傳感網(wǎng)絡的建立過程

    電子發(fā)燒友網(wǎng)站提供《基于ZigBee協(xié)議的無線傳感網(wǎng)絡的建立過程.pdf》資料免費下載
    發(fā)表于 10-24 10:32 ?0次下載
    基于ZigBee<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>的無線傳感<b class='flag-5'>網(wǎng)絡</b>的建立過程

    基于PIC單片機的TCP/IP協(xié)議實現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《基于PIC單片機的TCP/IP協(xié)議實現(xiàn).ppt》資料免費下載
    發(fā)表于 10-20 10:03 ?2次下載
    基于PIC單片機的TCP/IP<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>實現(xiàn)</b>

    在帶有以太網(wǎng)口的AT32系列中實現(xiàn)RL-TCPNet網(wǎng)絡協(xié)議

    AT32F407_437_using_RL_TCPNet在帶有以太網(wǎng)口的AT32系列中實現(xiàn)RL-TCPNet網(wǎng)絡協(xié)議。
    發(fā)表于 10-19 07:32