顛覆你對作業系統的認知-Linux發行版概述
不管你是資深的程式設計師還是初學者,不管你是使用Windows或macOS的用戶,如果你對電腦作業系統有一定了解,那麼Linux這個名字肯定不會陌生。但是,你了解的可能只是Linux這個作業系統的皮毛。實際上,Linux有眾多的發行版,它們各自擁有獨特的特色和應用場景。下面,我們將為大家介紹幾種常見的Linux發行版,帶你顛覆關於作業系統的傳統認知。
為了使得多種設備能透過網路相互通信,和為了解決各種不同設備在網路互聯中的相容性問題,國際標標準化組織制定了開放式系統互聯通訊參考模型(open System Interconnection Reference Model) ,也就是OSI 網路模型,此模型主要有7 層,分別是應用層、表示層、會話層、傳輸層、網路層、資料鏈結層、實體層。
#
每一層負責的職能都不同,如下:
•應用層,負責提供應用程式統一的介面;
•表示層,負責把資料轉換成相容於另一個系統能辨識的格式;
•會話層,負責建立、管理和終止表示層實體之間的通訊會話;
•傳輸層,負責端對端的資料傳輸;
•網路層,負責資料的路由、轉送、分片;
•資料鏈結層,負責資料的封幀和錯誤偵測,以及 MAC 尋址;
•物理層,負責在實體網路中傳輸資料幀;
由於 OSI 模型實在太複雜,提出的只是概念理論上的分層,並沒有提供具體的實現方案。事實上,我們比較常見,也比較實用的是四層模型,也就是 TCP/IP 網路模型,Linux 系統正是依照這套網路模型來實現網路協定棧的。
TCP/IP 網路模型共有 4 層,分別是應用層、傳輸層、網路層和網路介面層,每一層負責的功能如下:
•應用程式層,負責提供使用者一組應用程序,例如 HTTP、DNS、FTP 等;
•傳輸層,負責端對端的通信,如 TCP、UDP 等;
•網路層,負責網路套件的封裝、分片、路由、轉發,如 IP、ICMP 等;
•網路介面層,負責網路封包在實體網路中的傳輸,例如網路封包的封包、 MAC 位址、錯誤偵測,以及透過網路卡傳輸網路封包等;
TCP/IP 網路模型相比 OSI 網路模型簡化了不少,也更加易記,它們之間的關係如下圖:
#
不過,我們常說的七層和四層負載平衡,是用 OSI 網路模型來描述的,七層對應的是應用層,四層對應的是傳輸層。
Linux 網路協定堆疊
我們可以把自己的身體比喻為應用層中的數據,打底衣服比喻為傳輸層中的TCP 頭,外套比喻為網路層中IP 頭,帽子和鞋子分別比喻為網路介面層的幀頭和幀尾。
在冬天這個季節,當我們要從家裡出去玩的時候,自然要先穿個打底衣服,再套上保暖外套,最後穿上帽子和鞋子才出門,這個過程就好像我們把TCP 協議通訊的網路包發出去的時候,會把應用層的資料依照網路協定棧層封裝處理。
你從下面這張圖可以看到,應用層資料在每一層的封裝格式。
#
其中:
•傳輸層,為應用程式資料前面增加了 TCP 頭;
•網路層,為 TCP 封包前面增加了 IP 頭;
•網路介面層,給 IP 封包前後分別增加了幀頭和幀尾;
這些新增和頭部和尾部,都有各自的作用,也都是按照特定的協議格式填充,這每一層都增加了各自的協議頭,那自然網絡包的大小就增大了,但實體連結並不能傳輸任意大小的資料包,所以在乙太網路中,規定了最大傳輸單元(MTU)是1500 位元組,也就是規定了單次傳輸的最大IP 包大小。
當網路套件超過MTU 的大小,就會在網路層分片,以確保分片後的IP 套件不會超過MTU 大小,如果MTU 越小,需要的分包就越多,那麼網路吞吐能力就越差,相反的,如果MTU 越大,需要的分包就越小,那麼網路吞吐能力就越好。
知道了 TCP/IP 網路模型,以及網路套件的封裝原理後,那麼 Linux 網路協定棧的樣子,你想必猜到了大概,它其實就類似於 TCP/IP 的四層結構:
#
從上圖的的網路協定棧,你可以看到:
•應用程式需要透過系統調用,來跟 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 傳送網路套件的流程
#如上圖的有半部分,發送網路包的流程正好和接收流程相反。
首先,應用程式會調用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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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