Linux性能優化實戰學習筆記:第三十三講

1、上節回顧

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

因爲網絡處理的流程最複雜,跟咱們前面講到的進程調度、中斷處理、內存管理以及 I/O等都密不可分,因此,我把網絡模塊做爲最後一個資源模塊來說解。bash

同 CPU、內存以及 I/O 同樣,網絡也是 Linux 系統最核心的功能。網絡是一種把不一樣計算機或網絡設備鏈接到一塊兒的技術,它本質上是一種進程間通訊方式,特別是跨系統的進程
間通訊,必需要經過網絡才能進行。隨着高併發、分佈式、雲計算、微服務等技術的普及,網絡的性能也變得愈來愈重要。服務器

那麼:網絡

一、Linux 網絡又是怎麼工做的呢?數據結構

二、又有哪些指標衡量網絡的性能呢?併發

接下來的兩篇文章,我將帶你一塊兒學習 Linux 網絡的工做原理和性能指標。負載均衡

2、網絡模型

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

一、OSI 網絡模型

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

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

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

二、TCP/IP 模型

可是 OSI 模型仍是太複雜了,也沒能提供一個可實現的方法。因此,在 Linux 中,咱們實際上使用的是另外一個更實用的四層模型,即 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 詳解》的卷一和卷二,或者學習極客時間
出品的《 趣談網絡協議》專欄。

3、Linux 網絡棧

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

固然,網絡包在每一層的處理邏輯,都取決於各層採用的網絡協議。好比在應用層,一個提供 REST API 的應用,可使用 HTTP 協議,把它須要傳輸的 JSON 數據封裝到 HTTP
協議中,而後向下傳遞給 TCP 層。

一、封裝

而封裝作的事情就很簡單了,只是在原來的負載先後,增長固定格式的元數據,原始的負載數據並不會被修改。

好比,以經過 TCP 協議通訊的網絡包爲例,經過下面這張圖,咱們能夠看到,應用程序數據在每一個層的封裝格式

其中:

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

這些新增的頭部和尾部,都按照特定的協議格式填充,想了解具體格式,你能夠查看協議的文檔。 好比,你能夠查看這裏,瞭解 TCP 頭的格

二、什麼是MTU?Linux MTU默認值是多少

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

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

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

圖:

 

 

 


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

三、網卡設備

咱們從上到下來看這個網絡棧,你能夠發現,

一、最上層的應用程序,須要經過系統調用,來跟套接字接口進行交互;套接字的下面,就是咱們前面提到的傳輸層、網絡層和網絡接口層;

二、最底層,則是網卡驅動程序以及物理網卡設備。

這裏我簡單說一下網卡:

一、網卡是發送和接收網絡包的基本設備。

二、在系統啓動過程當中,網卡經過內核中的網卡驅動程序註冊到系統中。

三、而在網絡收發過程當中,內核經過中斷跟網卡進行交互。

再結合前面提到的 Linux 網絡棧,能夠看出,網絡包的處理很是複雜。因此,網卡硬中斷只處理最核心的網卡數據讀取或發送,而協議棧中的大部分邏輯,都會放到軟中斷中處理

4、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 ,從發包隊列中讀出網絡幀,並經過物理網卡把它發送出去。

 5、小結

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

多臺服務器經過網卡、交換機、路由器等網絡設備鏈接到一塊兒,構成了相互鏈接的網絡。因爲網絡設備的異構性和網絡協議的複雜性,國際標準化組織定義了一個七層的 OSI 網絡
模型,可是這個模型過於複雜,實際工做中的事實標準,是更爲實用的 TCP/IP 模型。

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

一、應用程序經過套接字接口發送數據包,先要在網絡協議棧中從上到下進行逐層處理,最終再送到網卡發送出去。

二、而接收時,一樣先通過網絡棧從下到上的逐層處理,最終纔會送到應用程序。

瞭解了 Linux 網絡的基本原理和收發流程後,你確定火燒眉毛想知道,如何去觀察網絡的性能狀況。那麼,具體來講,哪些指標能夠衡量 Linux 的網絡性能呢?別急,我將在下一節中爲你詳細講解。

相關文章
相關標籤/搜索