TIM剖析系列之 Linux 網路棧剖析

來源:互聯網
上載者:User

更多TIM文章請訪問: IBM TIM系列




層級: 初級

M. Tim Jones, 顧問工程師, Emulex

2007 年 7 月 16 日

Linux? 作業系統的最大特性之一就是它的網路棧。它最初源於 BSD 的網路棧,具有一套非常乾淨的介面,組織得非常好。其介面範圍從協議無關層(例如通用 socket 層介面或裝置層)到各種網路通訊協定的具體層。本文將從分層角度對 Linux 網路棧的介面進行探索,並介紹其中的一些主要結構。

協議簡介

雖然對於網路的正式介紹一般都參考了 OSI(Open Systems Interconnection)模型,但是本文對 Linux 中基本網路棧的介紹分為四層的 Internet 模型( 1 所示)。


圖 1. 網路棧的 Internet 模型

這個棧的最底部是鏈路層。鏈路層是指提供對物理層訪問的裝置驅動程式,這可以是各種介質,例如串口鏈路或乙太網路裝置。鏈路層上面是網路層,它負責將報文定向到目標位置。再上一層稱為傳輸層,負責端到端的通訊(例如,在一台主機內部)。儘管網路層負責管理主機之間的通訊,但是傳輸層需要負責管理主機內部各端之間的通訊。最後一層是應用程式層,它通常是一個語義層,能夠理解要傳輸的資料。例如,超文字傳輸通訊協定 (HTTP)(HTTP)就負責傳輸伺服器和客戶機之間對 Web 內容的請求與響應。

實際來說,網路棧的各個層次有一些更為人所熟知的名字。在鏈路層上,可以找到乙太網路,這是最常用的一種高速介質。更早的鏈路層協議包括一些串口協議,例如 SLIP(Serial Line Internet Protocol)、CSLIP(Compressed SLIP)和PPP(Point-to-Point Protocol)。最常見的網路層協議是 IP(Internet Protocol),但是網路層中還存在一些滿足其他需求的協議,例如 ICMP(Internet Control Message Protocol)和ARP( Address Resolution Protocol)。在傳輸層上是 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。最後,應用程式層中包含很多大家都非常熟悉的協議,包括標準的 Web 協議 HTTP 和電子郵件協議 SMTP(Simple Mail Transfer Protocol)。




核心網路架構

現在繼續瞭解 Linux 網路棧的架構以及如何?這種 Internet 模型。圖 2 提供了 Linux 網路棧的進階視圖。最上面是使用者空間層,或稱為應用程式層,其中定義了網路棧的使用者。底部是物理裝置,提供了對網路的串連能力(串口或諸如乙太網路之類的高速網路)。中間是核心空間,即網路子系統,也是本文介紹的重點。流經網路棧內部的是 socket 緩衝區(de>sk_buffsde>),它負責在源和匯點之間傳遞報文資料。您很快就將看到 de>sk_buffde> 的結構。


圖 2. Linux 進階網路棧架構

首先,讓我們來快速探索一下 Linux 網路子系統的核心元素,後續章節中會更詳細進行介紹。頂部(請參閱圖 2)是系統調用介面。它簡單地為使用者空間的應用程式提供了一種訪問核心網路子系統的方法。位於其下面的是一個協議無關層,它提供了一種通用方法來使用底層傳輸層協議。然後是實際協議,在 Linux 中包括內嵌的協議 TCP、UDP,當然還有 IP。然後是另外一個協議無關層,提供了與各個裝置驅動程式通訊的通用介面,最下面是裝置驅動程式本身。




系統調用介面

系統調用介面可以從兩個角度進行描述。使用者發起網路調用時,通過系統調用介面進入核心的過程應該是多路的。最後調用 ./net/socket.c 中的 de>sys_socketcallde> 結束該過程,然後進一步將調用分路發送到指定目標。系統調用介面的另一種描述是使用普通檔案操作作為網路 I/O。例如,典型的讀寫操作可以在網路 socket 上執行(socket 使用一個檔案描述符表示,與一個普通檔案一樣)。因此,儘管有很多操作是網路專用的(使用 de>socketde> 調用建立一個 socket,使用 de>connectde> 調用串連一個收信方,等等),但是也有一些標準的檔案操作可以應用於網路對象,就像操作普通檔案一樣。最後,系統調用介面提供了在使用者空間應用程式和核心之間轉移控制的方法。




協議無關介面

socket 層是一個協議無關介面,它提供了一組通用函數來支援各種不同協議。socket 層不但可以支援典型的 TCP 和 UDP 協議,而且還可以支援 IP、裸乙太網路和其他傳輸協議,例如 SCTP(Stream Control Transmission Protocol)。

通過網路棧進行的通訊都需要對 socket 進行操作。Linux 中的 socket 結構是 de>struct sockde>,這個結構是在 linux/include/net/sock.h 中定義的。這個巨大的結構中包含了特定 socket 所需要的所有狀態資訊,其中包括 socket 所使用的特定協議和在 socket 上可以執行的一些操作。

網路子系統可以通過一個定義了自己功能的特殊結構來瞭解可用協議。每個協議都維護了一個名為 de>protode> 的結構(可以在 linux/include/net/sock.h 中找到)。這個結構定義了可以在從 socket 層到傳輸層中執行特定的 socket 操作(例如,如何建立一個 socket,如何使用 socket 建立一個串連,如何關閉一個 socket 等等)。




網路通訊協定

網路通訊協定這一節對一些可用的特定網路通訊協定作出了定義(例如 TCP、UDP 等)。它們都是在 linux/net/ipv4/af_inet.c 檔案中一個名為 de>inet_initde> 的函數中進行初始化的(因為 TCP 和 UDP 都是 de>inetde> 簇協議的一部分)。de> inet_initde> 函數使用 de>proto_registerde> 函數來註冊每個內嵌協議。這個函數是在 linux/net/core/sock.c 中定義的,除了可以將這個協議添加到活動協議列表中之外,如果需要,該函數還可以選擇分配一到多個 slab 緩衝。

通過 linux/net/ipv4/ 目錄中 udp.c 和 raw.c 檔案中的 de>protode> 介面,您可以瞭解各個協議是如何標識自己的。這些協議介面每個都按照類型和協議映射到 de>inetsw_arrayde>,該數組將內嵌協議與操作映射到一起。de>inetsw_arrayde> 結構及其關係 3 所示。最初,會調用 de>inet_initde> 中的 de>inet_register_protoswde> 將這個數組中的每個協議都初始化為 de>inetswde>。函數 de>inet_initde> 也會對各個 de>inetde> 模組進行初始化,例如 ARP、ICMP 和 IP 模組,以及 TCP 和 UDP 模組。


圖 3. 網際網路通訊協定 (IP)數組結構

Socket 協議的相互關係
回想以下在建立 socket 時,需要指定類型和協議,例如de>my_sock = socket( AF_INET, SOCK_STREAM, 0 )de>。de>AF_INETde> 表示一個 網際網路位址簇,它使用的是一個流 socket,定義為 de>SOCK_STREAMde>(如此處的 de>inetsw_arrayde> 所示)。

注意在 圖 3 中,de>protode> 結構定義了傳輸特有的方法,而 de>proto_opsde> 結構則定義了通用的 socket 方法。可以通過調用 de>inet_register_protoswde> 將其他協議加入到 de>inetswde> 協議中。例如,SCTP 就是通過調用 linux/net/sctp/protocol.c 中的 de>sctp_initde> 加入其中的。有關 SCTP 的更多資訊,請參閱 參考資料 一節的內容。

socket 中的資料移動是使用一個所謂的 socket 緩衝區(de>sk_buffde>)的核心結構實現的。de>sk_buffde> 中包含了報文資料,以及涉及協議棧中多個層次的狀態資料。所發送或接收的每個報文都是使用一個 de>sk_buffde> 表示的。de>sk_buffde> 結構是在 linux/include/linux/skbuff.h 中定義的, 4 所示。


圖 4. Socket 緩衝區及其與其他結構的關係

,多個 de>sk_buffde> 可以針對某個給定串連連結在一起。每個 de>sk_buffde> 都在裝置結構(de>net_devicede>)中標識報文發送的目的地,或者接收報文的來源地。由於每個報文都是使用一個 de>sk_buffde> 表示的,因此報文頭都可以通過一組指標(de>thde>、de>iphde> 和 de>macde>[用於 Media Access Control 或者 MAC 頭])方便地進行定位。由於 de>sk_buffde> 是 socket 資料管理的中心,因此建立了很多支援函數來對它們進行管理。其中有些函數用於建立和銷毀 de>sk_buffde> 結構,或對它進行複製或排隊管理。

針對給定的 socket,Socket 緩衝區可以連結在一起,這樣可以包含眾多資訊,包括到協議頭的連結、時間戳記(報文是何時發送或接收的),以及與這個報文相關的裝置。




裝置無關介面

協議層下面是另外一個無關介面層,它將協議與具有很多各種不同功能的硬體裝置串連在一起。這一層提供了一組通用函數供底層網路裝置驅動程式使用,讓它們可以對高層協議棧進行操作。

首先,裝置驅動程式可能會通過調用 de>register_netdevicede> 或 de>unregister_netdevicede> 在核心中進行註冊或登出。調用者首先填寫 de>net_devicede> 結構,然後傳遞這個結構進行註冊。核心調用它的 de>initde>de>sysfsde> 條目,然後將新裝置添加到裝置列表中(核心中的活動裝置鏈表)。在 linux/include/linux/netdevice.h 中可以找到這個 de>net_devicede> 結構。這些函數都是在 linux/net/core/dev.c 中實現的。 函數(如果定義了這種函數),然後執行一組健全性檢查,並建立一個

要從協議層向裝置中發送 de>sk_buffde>,就需要使用 de>dev_queue_xmitde> 函數。這個函數可以對 de>sk_buffde> 進行排隊,從而由底層裝置驅動程式進行最終傳輸(使用 de>sk_buffde> 中引用的 de>net_devicede> 或 de>sk_buff->devde> 所定義的網路裝置)。de>devde> 結構中包含了一個名為 de>hard_start_xmitde> 的方法,其中儲存有發起 de>sk_buffde> 傳輸所使用的驅動程式函數。

報文的接收通常是使用 de>netif_rxde> 執行的。當底層裝置驅動程式接收一個報文(包含在所分配的 de>sk_buffde> 中)時,就會通過調用 de>netif_rxde> 將 de>sk_buffde> 上傳至網路層。然後,這個函數通過 de>netif_rx_schedulede> 將 de>sk_buffde> 在上層協議隊列中進行排隊,供以後進行處理。可以在 linux/net/core/dev.c 中找到 de>dev_queue_xmitde> 和 de>netif_rxde> 函數。

最近,核心中引入了一種新的API(NAPI),該介面允許驅動程式與裝置無關層(de>devde>)進行互動。有些驅動程式使用的是 NAPI,但是大多數驅動程式仍然在使用老式的幀接收介面(比例大約是 6 比 1)。NAPI 在高負載的情況下可以產生更好的效能,它避免了為每個傳入的幀都產生中斷。




裝置驅動程式

網路棧底部是負責管理物理網路裝置的裝置驅動程式。例如,包串口使用的 SLIP 驅動程式以及乙太網路裝置使用的乙太網路驅動程式都是這一層的裝置。

在進行初始化時,裝置驅動程式會分配一個 de>net_devicede> 結構,然後使用必須的程式對其進行初始化。這些程式中有一個是 de>dev->hard_start_xmitde>,它定義了上層應該如何對 de>sk_buffde> 排隊進行傳輸。這個程式的參數為 de>sk_buffde>。這個函數的操作取決於底層硬體,但是通常 de>sk_buffde> 所描述的報文都會被移動到硬體環或隊列中。就像是裝置無關層中所描述的一樣,對於 NAPI 相容的網路驅動程式來說,幀的接收使用了 de>netif_rxde> 和 de>netif_receive_skbde> 介面。NAPI 驅動程式會對底層硬體的能力進行一些限制。有關更詳細的資訊,請參閱 參考資料 一節的內容。

裝置驅動程式在 de>devde> 結構中配置好自己的介面之後,調用 de>register_netdevicede> 便可以使用該配置。在 linux/drivers/net 中可以找出網路裝置專用的驅動程式。




展望

Linux 原始碼是學習有關大多數裝置類型的裝置驅動程式設計最佳方法,包括網路裝置驅動程式。在這裡可以找到的是各種設計的變化以及對可用核心 API 的使用,但是所學到的每一點都會非常有用,都可以作為新裝置驅動程式的起點。除非您需要一種新協議,否則網路棧中的其餘代碼都是通用的,都會非常有用。即使現在,TCP(用於流協議)或 UDP(用於基於訊息的協議)的實現都可以作為開始新開發有用模組使用。

參考資料

學習

  • 您可以參閱本文在 developerWorks 全球網站上的 英文原文。

  • 請查閱 www.linuxjunkies.org 上的 “Introduction to the Internet Protocols” ,獲得有關 TCP/IP、UDP 和 ICMP 的簡要介紹。

  • “使用 Linux 系統調用的核心命令”(developerWorks,2007 年 3 月)介紹了 Linux 系統調用介面,它是 Linux 核心中很重要的一層,GNU C Library(glbic)提供了對使用者空間支援,這樣便可以在使用者空間和核心之間進行函數調用。

  • “使用 /proc 檔案系統來訪問 Linux 核心的內容”(developerWorks,2006 年 3 月)介紹了 /proc 檔案系統,它是一個虛擬檔案系統,為使用者空間的應用程式與核心進行通訊提供了一種創新的方法。這篇文章展示 /proc 的應用,並示範可載入的核心模組。

  • 如果對網路通訊協定感興趣,Linux 是一個非常不錯的作業系統,這一點與 BSD 類似。“使用 SCTP 最佳化網路”(developerWorks,2006 年 2 月)介紹了最有趣的網路通訊協定之一 SCTP,它的操作方式和 TCP 類似,但是卻增加了一些有用的特性,例如訊息、多重主機和多流特性。

  • “Linux slab 分配器詳解”(developerWorks,2007 年 5 月)介紹了 Linux 中記憶體管理的最有趣特性之一:slab 分配器。這種機制源自於 SunOS,但是它在 Linux 核心中找到了一個友好的家園。

  • NAPI 驅動程式與使用老式報文處理架構的驅動程式相比,具有很多優點,從終端管理到報文處理都要好很多。在 OSDL 上的 NAPI 介面和設計 中可以瞭解更多內容。

  • 有關 Linux 使用者空間編程的更多資訊,請參考 Tim 撰寫的 GNU/Linux Application Programming 一書。

  • 在 Tim 撰寫的 BSD Sockets Programming from a Multi-Language Perspective 一書中,可以學習有關使用 BSD socket API 進行 socket 編程的知識。

  • 在 Free Software Foundation Web 網站上學習更多有關自由軟體的內容。由於 Linux 是一個自由軟體,因此任何希望從事相關工作的人都可以裝配和發行自己的發行版。

  • 在 developerWorks Linux 專區 中可找到適合 Linux 開發人員的更多資源,包括 Linux 教程。

  • 隨時關注 developerWorks 技術活動和網路廣播。


獲得產品和技術

  • 定購 Linux SEK,共包含兩張 DVD,其中包含 Linux 最新的 IBM 試用軟體,包括 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere?。

  • 利用可直接從 developerWorks 下載的 IBM 試用軟體 在 Linux 上構建您的下一個開發項目。


討論

  • 通過參與 developerWorks blog 加入 developerWorks 社區。

關於作者

M. Tim Jones 是一名嵌入式軟體工程師,他是 GNU/Linux Application ProgrammingAI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的核心開發到嵌入式架構設計,再到網路通訊協定的開發。Tim 是位於科羅拉多州 Longmont 的 Emulex Corp. 的一名顧問工程師。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.