日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

33 | 关于 Linux 网络,你必须知道这些(上)

發布時間:2024/9/3 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 33 | 关于 Linux 网络,你必须知道这些(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前幾節,我們一起學習了文件系統和磁盤 I/O 的工作原理,以及相應的性能分析和優化方法。接下來,我們將進入下一個重要模塊—— Linux 的網絡子系統。

由于網絡處理的流程最復雜,跟我們前面講到的進程調度、中斷處理、內存管理以及 I/O 等都密不可分,所以,我把網絡模塊作為最后一個資源模塊來講解。

同 CPU、內存以及 I/O 一樣,網絡也是 Linux 系統最核心的功能。網絡是一種把不同計算機或網絡設備連接到一起的技術,它本質上是一種進程間通信方式,特別是跨系統的進程間通信,必須要通過網絡才能進行。隨著高并發、分布式、云計算、微服務等技術的普及,網絡的性能也變得越來越重要。

那么,Linux 網絡又是怎么工作的呢?又有哪些指標衡量網絡的性能呢?接下來的兩篇文章,我將帶你一起學習 Linux 網絡的工作原理和性能指標。

網絡模型

說到網絡,我想你肯定經常提起七層負載均衡、四層負載均衡,或者三層設備、二層設備等等。那么,這里說的二層、三層、四層、七層又都是什么意思呢?

實際上,這些層都來自國際標準化組織制定的開放式系統互聯通信參考模型(Open System Interconnection Reference Model),簡稱為 OSI 網絡模型。

OSI 網絡模型

為了解決網絡互聯中異構設備的兼容性問題,并解耦復雜的網絡包處理流程,OSI 模型把網絡互聯的框架分為應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層以及物理層等七層,每個層負責不同的功能。其中,

  • 應用層,負責為應用程序提供統一的接口。
  • 表示層,負責把數據轉換成兼容接收系統的格式。
  • 會話層,負責維護計算機之間的通信連接。
  • 傳輸層,負責為數據加上傳輸表頭,形成數據包。
  • 網絡層,負責數據的路由和轉發。
  • 數據鏈路層,負責 MAC 尋址、錯誤偵測和改錯。
  • 物理層,負責在物理網絡中傳輸數據幀。

但是 OSI 模型還是太復雜了,也沒能提供一個可實現的方法。所以,在 Linux 中,我們實際上使用的是另一個更實用的四層模型,即 TCP/IP 網絡模型。

TCP/IP 模型

TCP/IP 模型,把網絡互聯的框架分為應用層、傳輸層、網絡層、網絡接口層等四層,其中,

  • 應用層,負責向用戶提供一組應用程序,比如 HTTP、FTP、DNS 等。
  • 傳輸層,負責端到端的通信,比如 TCP、UDP 等。
  • 網絡層,負責網絡包的封裝、尋址和路由,比如 IP、ICMP 等。
  • 網絡接口層,負責網絡包在物理網絡中的傳輸,比如 MAC 尋址、錯誤偵測以及通過網卡傳輸網絡幀等。

為了幫你更形象理解 TCP/IP 與 OSI 模型的關系,我畫了一張圖,如下所示:

當然了,雖說 Linux 實際按照 TCP/IP 模型,實現了網絡協議棧,但在平時的學習交流中,我們習慣上還是用 OSI 七層模型來描述。比如,說到七層和四層負載均衡,對應的分別是 OSI 模型中的應用層和傳輸層(而它們對應到 TCP/IP 模型中,實際上是四層和三層)。

TCP/IP 模型包括了大量的網絡協議,這些協議的原理,也是我們每個人必須掌握的核心基礎知識。如果你不太熟練,推薦你去學《TCP/IP 詳解》的卷一和卷二,或者學習極客時間出品的《趣談網絡協議》專欄。

Linux 網絡棧

有了 TCP/IP 模型后,在進行網絡傳輸時,數據包就會按照協議棧,對上一層發來的數據進行逐層處理;然后封裝上該層的協議頭,再發送給下一層。

當然,網絡包在每一層的處理邏輯,都取決于各層采用的網絡協議。比如在應用層,一個提供 REST API 的應用,可以使用 HTTP 協議,把它需要傳輸的 JSON 數據封裝到 HTTP 協議中,然后向下傳遞給 TCP 層。

而封裝做的事情就很簡單了,只是在原來的負載前后,增加固定格式的元數據,原始的負載數據并不會被修改。

比如,以通過 TCP 協議通信的網絡包為例,通過下面這張圖,我們可以看到,應用程序數據在每個層的封裝格式。

其中:

  • 傳輸層在應用程序數據前面增加了 TCP 頭;
  • 網絡層在 TCP 數據包前增加了 IP 頭;
  • 而網絡接口層,又在 IP 數據包前后分別增加了幀頭和幀尾。

這些新增的頭部和尾部,都按照特定的協議格式填充,想了解具體格式,你可以查看協議的文檔。 比如,你可以查看這里,了解 TCP 頭的格式。

這些新增的頭部和尾部,增加了網絡包的大小,但我們都知道,物理鏈路中并不能傳輸任意大小的數據包。網絡接口配置的最大傳輸單元(MTU),就規定了最大的 IP 包大小。在我們最常用的以太網中,MTU 默認值是 1500(這也是 Linux 的默認值)。

一旦網絡包超過 MTU 的大小,就會在網絡層分片,以保證分片后的 IP 包不大于 MTU 值。顯然,MTU 越大,需要的分包也就越少,自然,網絡吞吐能力就越好。

理解了 TCP/IP 網絡模型和網絡包的封裝原理后,你很容易能想到,Linux 內核中的網絡棧,其實也類似于 TCP/IP 的四層結構。如下圖所示,就是 Linux 通用 IP 網絡棧的示意圖:

(圖片參考《性能之巔》圖 10.7 通用 IP 網絡棧繪制)

我們從上到下來看這個網絡棧,你可以發現,

  • 最上層的應用程序,需要通過系統調用,來跟套接字接口進行交互;
  • 套接字的下面,就是我們前面提到的傳輸層、網絡層和網絡接口層;
  • 最底層,則是網卡驅動程序以及物理網卡設備。

這里我簡單說一下網卡。網卡是發送和接收網絡包的基本設備。在系統啟動過程中,網卡通過內核中的網卡驅動程序注冊到系統中。而在網絡收發過程中,內核通過中斷跟網卡進行交互。

再結合前面提到的 Linux 網絡棧,可以看出,網絡包的處理非常復雜。所以,網卡硬中斷只處理最核心的網卡數據讀取或發送,而協議棧中的大部分邏輯,都會放到軟中斷中處理。

Linux 網絡收發流程

了解了 Linux 網絡棧后,我們再來看看, Linux 到底是怎么收發網絡包的。

注意,以下內容都以物理網卡為例。事實上,Linux 還支持眾多的虛擬網絡設備,而它們的網絡收發流程會有一些差別。

網絡包的接收流程

我們先來看網絡包的接收流程。

當一個網絡幀到達網卡后,網卡會通過 DMA 方式,把這個網絡包放到收包隊列中;然后通過硬中斷,告訴中斷處理程序已經收到了網絡包。

接著,網卡中斷處理程序會為網絡幀分配內核數據結構(sk_buff),并將其拷貝到 sk_buff 緩沖區中;然后再通過軟中斷,通知內核收到了新的網絡幀。

接下來,內核協議棧從緩沖區中取出網絡幀,并通過網絡協議棧,從下到上逐層處理這個網絡幀。比如,

  • 在鏈路層檢查報文的合法性,找出上層協議的類型(比如 IPv4 還是 IPv6),再去掉幀頭、幀尾,然后交給網絡層。
  • 網絡層取出 IP 頭,判斷網絡包下一步的走向,比如是交給上層處理還是轉發。當網絡層確認這個包是要發送到本機后,就會取出上層協議的類型(比如 TCP 還是 UDP),去掉 IP 頭,再交給傳輸層處理。
  • 傳輸層取出 TCP 頭或者 UDP 頭后,根據 < 源 IP、源端口、目的 IP、目的端口 > 四元組作為標識,找出對應的 Socket,并把數據拷貝到 Socket 的接收緩存中。

最后,應用程序就可以使用 Socket 接口,讀取到新接收到的數據了。

為了更清晰表示這個流程,我畫了一張圖,這張圖的左半部分表示接收流程,而圖中的粉色箭頭則表示網絡包的處理路徑。

網絡包的發送流程

了解網絡包的接收流程后,就很容易理解網絡包的發送流程。網絡包的發送流程就是上圖的右半部分,很容易發現,網絡包的發送方向,正好跟接收方向相反。

首先,應用程序調用 Socket API(比如 sendmsg)發送網絡包。

由于這是一個系統調用,所以會陷入到內核態的套接字層中。套接字層會把數據包放到 Socket 發送緩沖區中。

接下來,網絡協議棧從 Socket 發送緩沖區中,取出數據包;再按照 TCP/IP 棧,從上到下逐層處理。比如,傳輸層和網絡層,分別為其增加 TCP 頭和 IP 頭,執行路由查找確認下一跳的 IP,并按照 MTU 大小進行分片。

分片后的網絡包,再送到網絡接口層,進行物理地址尋址,以找到下一跳的 MAC 地址。然后添加幀頭和幀尾,放到發包隊列中。這一切完成后,會有軟中斷通知驅動程序:發包隊列中有新的網絡幀需要發送。

最后,驅動程序通過 DMA ,從發包隊列中讀出網絡幀,并通過物理網卡把它發送出去。

小結

在今天的文章中,我帶你一起梳理了 Linux 網絡的工作原理。

多臺服務器通過網卡、交換機、路由器等網絡設備連接到一起,構成了相互連接的網絡。由于網絡設備的異構性和網絡協議的復雜性,國際標準化組織定義了一個七層的 OSI 網絡模型,但是這個模型過于復雜,實際工作中的事實標準,是更為實用的 TCP/IP 模型。

TCP/IP 模型,把網絡互聯的框架,分為應用層、傳輸層、網絡層、網絡接口層等四層,這也是 Linux 網絡棧最核心的構成部分。

  • 應用程序通過套接字接口發送數據包,先要在網絡協議棧中從上到下進行逐層處理,最終再送到網卡發送出去。
  • 而接收時,同樣先經過網絡棧從下到上的逐層處理,最終才會送到應用程序。

了解了 Linux 網絡的基本原理和收發流程后,你肯定迫不及待想知道,如何去觀察網絡的性能情況。那么,具體來說,哪些指標可以衡量 Linux 的網絡性能呢?別急,我將在下一節中為你詳細講解。

思考

最后,我想請你來聊聊你所理解的 Linux 網絡。你碰到過哪些網絡相關的性能瓶頸?你又是怎么樣來分析它們的呢?你可以結合今天學到的網絡知識,提出自己的觀點。

歡迎在留言區和我討論,也歡迎你把這篇文章分享給你的同事、朋友。我們一起在實戰中演練,在交流中進步。

總結

以上是生活随笔為你收集整理的33 | 关于 Linux 网络,你必须知道这些(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。