首頁 系統教程 Linux 顛覆你對作業系統的認知-Linux發行版概述

顛覆你對作業系統的認知-Linux發行版概述

Feb 13, 2024 pm 09:15 PM
linux linux教程 linux系統 linux指令 shell腳本 網路卡驅動 嵌入式linux linux入門 linux學習

不管你是資深的程式設計師還是初學者,不管你是使用Windows或macOS的用戶,如果你對電腦作業系統有一定了解,那麼Linux這個名字肯定不會陌生。但是,你了解的可能只是Linux這個作業系統的皮毛。實際上,Linux有眾多的發行版,它們各自擁有獨特的特色和應用場景。下面,我們將為大家介紹幾種常見的Linux發行版,帶你顛覆關於作業系統的傳統認知。

為了使得多種設備能透過網路相互通信,和為了解決各種不同設備在網路互聯中的相容性問題,國際標標準化組織制定了開放式系統互聯通訊參考模型(open System Interconnection Reference Model) ,也就是OSI 網路模型,此模型主要有7 層,分別是應用層、表示層、會話層、傳輸層、網路層、資料鏈結層、實體層。

顛覆你對作業系統的認知-Linux發行版概述
# 每一層負責的職能都不同,如下:

•應用層,負責提供應用程式統一的介面;

•表示層,負責把資料轉換成相容於另一個系統能辨識的格式;

•會話層,負責建立、管理和終止表示層實體之間的通訊會話;

•傳輸層,負責端對端的資料傳輸;

•網路層,負責資料的路由、轉送、分片;

•資料鏈結層,負責資料的封幀和錯誤偵測,以及 MAC 尋址;

•物理層,負責在實體網路中傳輸資料幀;

由於 OSI 模型實在太複雜,提出的只是概念理論上的分層,並沒有提供具體的實現方案。事實上,我們比較常見,也比較實用的是四層模型,也就是 TCP/IP 網路模型,Linux 系統正是依照這套網路模型來實現網路協定棧的。

TCP/IP 網路模型共有 4 層,分別是應用層、傳輸層、網路層和網路介面層,每一層負責的功能如下:

•應用程式層,負責提供使用者一組應用程序,例如 HTTP、DNS、FTP 等;

•傳輸層,負責端對端的通信,如 TCP、UDP 等;

•網路層,負責網路套件的封裝、分片、路由、轉發,如 IP、ICMP 等;

•網路介面層,負責網路封包在實體網路中的傳輸,例如網路封包的封包、 MAC 位址、錯誤偵測,以及透過網路卡傳輸網路封包等;

TCP/IP 網路模型相比 OSI 網路模型簡化了不少,也更加易記,它們之間的關係如下圖:

顛覆你對作業系統的認知-Linux發行版概述
# 不過,我們常說的七層和四層負載平衡,是用 OSI 網路模型來描述的,七層對應的是應用層,四層對應的是傳輸層。

Linux 網路協定堆疊

我們可以把自己的身體比喻為應用層中的數據,打底衣服比喻為傳輸層中的TCP 頭,外套比喻為網路層中IP 頭,帽子和鞋子分別比喻為網路介面層的幀頭和幀尾。

在冬天這個季節,當我們要從家裡出去玩的時候,自然要先穿個打底衣服,再套上保暖外套,最後穿上帽子和鞋子才出門,這個過程就好像我們把TCP 協議通訊的網路包發出去的時候,會把應用層的資料依照網路協定棧層封裝處理。

你從下面這張圖可以看到,應用層資料在每一層的封裝格式。

顛覆你對作業系統的認知-Linux發行版概述
# 其中:

•傳輸層,為應用程式資料前面增加了 TCP 頭;

•網路層,為 TCP 封包前面增加了 IP 頭;

•網路介面層,給 IP 封包前後分別增加了幀頭和幀尾;

這些新增和頭部和尾部,都有各自的作用,也都是按照特定的協議格式填充,這每一層都增加了各自的協議頭,那自然網絡包的大小就增大了,但實體連結並不能傳輸任意大小的資料包,所以在乙太網路中,規定了最大傳輸單元(MTU)是1500 位元組,也就是規定了單次傳輸的最大IP 包大小。

當網路套件超過MTU 的大小,就會在網路層分片,以確保分片後的IP 套件不會超過MTU 大小,如果MTU 越小,需要的分包就越多,那麼網路吞吐能力就越差,相反的,如果MTU 越大,需要的分包就越小,那麼網路吞吐能力就越好。

知道了 TCP/IP 網路模型,以及網路套件的封裝原理後,那麼 Linux 網路協定棧的樣子,你想必猜到了大概,它其實就類似於 TCP/IP 的四層結構:

顛覆你對作業系統的認知-Linux發行版概述
# 從上圖的的網路協定棧,你可以看到:

•應用程式需要透過系統調用,來跟 Socket 層進行資料交互;

•Socket 層的下面是傳輸層、網路層和網路介面層;

•最下面的一層,則是網卡驅動程式和硬體網卡設備;

Linux 接收網路套件的流程

網卡是電腦裡的一個硬件,專門負責接收和發送網路包,當網卡接收到一個網路包後,會透過DMA 技術,將網路包放入到Ring Buffer,這個是一個環形緩衝區,該緩衝區在核心記憶體中的網路卡驅動裡。

那接收到網路套件後,該怎麼告訴作業系統這個網路套件已經到達了呢?

最簡單的一種方式就是觸發中斷,也就是每當網路卡收到一個網路包,就會觸發一個中斷告訴作業系統。

但是,這存在一個問題,在高效能網路場景下,網路包的數量會非常多,那麼就會觸發非常多的中斷,要知道當CPU 收到了中斷,就會停下手裡的事情,而去處理這些網路包,處理完畢後,才會回去繼續其他事情,那麼頻繁地觸發中斷,則會導致CPU 一直沒玩沒了的處理中斷,而導致其他任務可能無法繼續前進,從而影響系統的整體效率。

所以為了解決頻繁中斷帶來的效能開銷,Linux 核心在2.6 版本中引入了NAPI 機制,它是混合「中斷和輪詢」的方式來接收網路包,它的核心概念就是不採用中斷的方式讀取數據,而是首先採用中斷喚醒數據接收的服務程序,然後poll 的方法來輪詢數據。

例如,當有網路包到達時,網卡發起硬體中斷,於是會執行網卡硬體中斷處理函數,中斷處理函數處理完需要「暫時屏蔽中斷」,然後喚醒「軟中斷」來輪詢處理數據,直到沒有新資料時才恢復中斷,這樣一次中斷處理多個網路包,於是就可以降低網卡中斷帶來的效能開銷。

那軟中斷是怎麼處理網路包的呢?它會從 Ring Buffer 中拷貝資料到內核 struct sk_buff 緩衝區中,從而可以作為一個網路包交給網路協定棧進行逐層處理。

首先,會先進入到網路介面層,在這一層會檢查封包的合法性,如果不合法則丟棄,合法則會找出該網路套件的上層協定的類型,例如是IPv4,還是IPv6 ,接著再去掉幀頭和幀尾,然後交給網路層。

到了網路層,則取出 IP 包,判斷網路包下一步的走向,例如交給上層處理還是轉送出去。當確認這個網路包要傳送給本機後,就會從 IP 頭上看看上一層協定的類型是 TCP 還是 UDP,接著去掉 IP 頭,然後交給傳輸層。

傳輸層取出 TCP 頭或 UDP 頭,依照四元群組「來源 IP、來源連接埠、目的 IP、目的連接埠」 作為標識,找出對應的 Socket,並將資料拷貝到 Socket 的接收緩衝區。

最後,應用層程式呼叫 Socket 接口,從內核的 Socket 接收緩衝區讀取新到來的資料到應用層。

至此,一個網路包的接收過程就已經結束了,你也可以從下圖左邊部分看到網路包接收的流程,右邊部分剛好反過來,它是網路包發送的流程。

顛覆你對作業系統的認知-Linux發行版概述

Linux 傳送網路套件的流程

#如上圖的有半部分,發送網路包的流程正好和接收流程相反。

首先,應用程式會調用Socket 發送封包的接口,由於這個是系統調用,所以會從用戶態陷入到內核態中的Socket 層,Socket 層會將應用層資料拷貝到Socket 發送緩衝區中。

接下來,網路協定堆疊從 Socket 傳送緩衝區中取出封包,並依照 TCP/IP 協定堆疊從上到下逐層處理。

如果使用的是TCP 傳輸協定發送數據,那麼會在傳輸層增加TCP 包頭,然後交給網絡層,網絡層會給數據包增加IP 包,然後通過查詢路由表確認下一跳的IP,並依照MTU 大小進行分片。

分片後的網路包,就會送到網路介面層,在這裡會透過 ARP 協定獲得下一跳的 MAC 位址,然後增加訊框頭和訊框尾,放到發包佇列中。

這一些準備好後,會觸發軟中斷告訴網卡驅動程序,這裡有新的網絡包需要發送,最後驅動程序通過DMA,從發包隊列中讀取網絡包,將其放入到硬體網卡的隊列中,隨後實體網卡再將它送出去。

總結

電腦與電腦之間通常都是通話網卡、交換器、路由器等網路設備連接到一起,那由於網路設備的異質性,國際標準化組織定義了一個七層的OSI 網路模型,但是這個模型由於比較複雜,實際應用中並沒有採用,而是採用了更簡化的TCP/IP 模型,Linux 網路協定棧就是依照了這個模型來實現的。

TCP/IP 模型主要分為應用層、傳輸層、網路層、網路介面層四層,每一層負責的職責都不同,這也是 Linux 網路協定堆疊主要組成部分。

當應用程式透過 Socket 介面傳送封包,封包會被網路協定堆疊從上到下進行逐層處理後,才會被送到網卡佇列中,隨後由網路卡將網路封包傳送出去。

而在接收網路套件時,同樣也要先經過網路協定堆疊從下到上的逐層處理,最後才會被送到應用程式。

總而言之,Linux作為一種自由開放原始碼的作業系統,已經在科技領域嶄露頭角並且廣泛應用。無論你是資深的程式設計師還是普通用戶,選擇適合自己的Linux發行版真的可以帶來許多意想不到的好處。相信這篇文章能夠幫助你更了解Linux發行版,也希望你能在自己的電腦上親身體驗Linux的魅力。

以上是顛覆你對作業系統的認知-Linux發行版概述的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

web.xml怎麼打開 web.xml怎麼打開 Apr 03, 2025 am 06:51 AM

要打開 web.xml 文件,可以使用以下方法:使用文本編輯器(如記事本或 TextEdit)使用集成開發環境(如 Eclipse 或 NetBeans)使用命令行編輯命令(Windows:notepad web.xml;Mac/Linux:open -a TextEdit web.xml)

c語言多線程的四種實現方式 c語言多線程的四種實現方式 Apr 03, 2025 pm 03:00 PM

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

Linux最好使用的是什麼? Linux最好使用的是什麼? Apr 03, 2025 am 12:11 AM

Linux最適合用作服務器管理、嵌入式系統和桌面環境。 1)在服務器管理中,Linux用於託管網站、數據庫和應用程序,提供穩定性和可靠性。 2)在嵌入式系統中,Linux因其靈活性和穩定性被廣泛應用於智能家居和汽車電子系統。 3)在桌面環境中,Linux提供了豐富的應用和高效的性能。

無法以 root 身份登錄 mysql 無法以 root 身份登錄 mysql Apr 08, 2025 pm 04:54 PM

無法以 root 身份登錄 MySQL 的原因主要在於權限問題、配置文件錯誤、密碼不符、socket 文件問題或防火牆攔截。解決方法包括:檢查配置文件中 bind-address 參數是否正確配置。查看 root 用戶權限是否被修改或刪除,並進行重置。驗證密碼是否準確無誤,包括大小寫和特殊字符。檢查 socket 文件權限設置和路徑。檢查防火牆是否阻止了 MySQL 服務器的連接。

libv是兩個 libv是兩個 Apr 03, 2025 pm 08:03 PM

我開發了一個名為Lua-Libuv的項目,並樂於分享我的經驗。項目初衷是探索如何利用Libuv(一個用C語言編寫的異步I/O庫)構建簡單的HTTP服務器,而無需深入掌握C語言。借助ChatGPT的輔助,我完成了HTTP.C的基礎代碼。在處理持久連接時,我成功實現了在適當的時機關閉連接並釋放資源。起初,我嘗試創建一個簡單的服務器,通過關閉連接來結束主程序,但遇到了一些問題。我嘗試過使用流式傳輸發送數據塊,雖然有效,但這會阻塞主線程。最終,我決定放棄這個方法,因為我的目標並非深入學習C語言。最終,我

C語言條件編譯:新手入門到實戰應用的詳盡指南 C語言條件編譯:新手入門到實戰應用的詳盡指南 Apr 04, 2025 am 10:48 AM

C語言條件編譯是一種根據編譯時條件選擇性編譯代碼塊的機制,入門方法有:使用#if和#else指令根據條件選擇代碼塊。常用條件表達式包括STDC、_WIN32和linux。實戰案例:根據操作系統打印不同消息。根據系統位數使用不同的數據類型。根據編譯器支持不同的頭文件。條件編譯增強了代碼的可移植性和靈活性,使其適應編譯器、操作系統和CPU架構變化。

【Rust自學】簡介 【Rust自學】簡介 Apr 04, 2025 am 08:03 AM

1.0.1前言這個項目(包括代碼和註釋)是在我自學Rust的過程中記錄的。可能有不准確或表述不清的地方,還請大家諒解。如果您從中受益,那就更好了。 1.0.2為什麼使用RustRust可靠且高效。 Rust可以取代C和C,性能相似但安全性更高,並且不需要像C和C那樣頻繁重新編譯來檢查錯誤。主要優點包括:內存安全(防止空指針取消引用、懸空指針和數據爭用)。線程安全(確保多線程代碼在執行前是安全的)。避免未定義的行為(例如,數組越界、未初始化的變量或訪問已釋放的內存)。 Rust提供現代語言功能(例如泛型

mysql 無法啟動怎麼解決 mysql 無法啟動怎麼解決 Apr 08, 2025 pm 02:21 PM

MySQL啟動失敗的原因有多種,可以通過檢查錯誤日誌進行診斷。常見原因包括端口衝突(檢查端口占用情況並修改配置)、權限問題(檢查服務運行用戶權限)、配置文件錯誤(檢查參數設置)、數據目錄損壞(恢復數據或重建表空間)、InnoDB表空間問題(檢查ibdata1文件)、插件加載失敗(檢查錯誤日誌)。解決問題時應根據錯誤日誌進行分析,找到問題的根源,並養成定期備份數據的習慣,以預防和解決問題。

See all articles