iT邦幫忙

2024 iThome 鐵人賽

DAY 1
0

大家好,這次是我第二次參加鐵人賽拉,上次參加是兩年前寫的《教練我想玩eBPF 系列》,記錄了我初學 eBPF 的學習筆記,並花了不少篇幅解說 BCC 專案的範例程式碼。時隔兩年,我又要參加這個比賽來挑戰自我。這次的鐵人賽目標是探索 Linux Kernel 的原始碼,特別是了解與網路相關系統的運作原理!

過去一年多的時間裡,我偶爾會翻閱一些 Linux 網路系統的原始碼,但始終沒有將這些內容整理成筆記,結果常常忘記已經學習過的東西。因此,我希望透過這次機會,將過去探索的內容記錄下來,以便未來查閱,也分享給有相同興趣的讀者。

Linux 網路系統的抽象架構


Linux 的網路系統是一個非常複雜的架構,我們通常會透過一些簡化和抽象的方式來了解並操作它。例如,我們可能會把 Linux 網路系統簡單地抽象為從最底層的驅動程式開始,往上連結到 Linux 的網路堆疊,最後再到我們的應用程式。
https://ithelp.ithome.com.tw/upload/images/20240915/20152703OBcCAqUfUE.png

另一種常見的比喻是將 Linux 的 bridge 模擬為一個虛擬交換機,虛擬的網路介面(例如 veth)則被看作是實體網卡,接入這個虛擬交換機。不過,這些虛擬介面和 bridge 在 Linux Kernel 內部是如何運作的?

此外,我們常用的 ip 指令非常強大,能夠用來建立介面、修改 IP、或調整路由表。那麼,具體來說,ip 指令到底是如何與 Linux kernel 互動,從而達成這些功能的呢?再如,我們經常使用的 veth 介面,通常會被描述為像是一條網路線,兩端可以接到不同的網路命名空間(Network Namespace),讓它們像兩臺獨立的電腦一樣連接起來。但實際上,所有這些仍然是在同一個Kernel內部運轉的,那麼,veth 是如何實現這種連接的呢?

還有許多類似 VXLAN 的隧道協議,我們在使用 VXLAN 時,會在 Linux 上建立一個新的介面,封包被路由到該介面後就會進行封裝並發送,外部的封包也可以透過這個介面接收並解封。那麼,這些封包在不同介面之間究竟是如何流動的?

此外,網路加速技術,如 OVS-DPDK、XDP 等技術的實現方式也值得深入探討。

在使用虛擬機時,封包如何在 Host 系統和虛擬機之間傳輸?

這些問題在我們日常使用 Linux 時經常會出現,而這次,我希望可以探索並解答這些問題,讓大家對 Linux Kernel 的網路系統有更具體的程式碼層次理解。

探索範圍

https://ithelp.ithome.com.tw/upload/images/20240915/201527034tscZLF8eu.png

上圖展示了我暫定的探索範圍。我將 Linux Kernel 的程式碼依結構與模組大致劃分,並不完全按照linux kernel的命名和切割方式,主要會聚焦在底層的驅動程式、Kernel 的網路設備管理,以及應用程式如何與這些底層系統進行溝通。相較於探索 Proctocal Stack 和 Routing,我將會更關注底層網路系統的管理與運作機制。
本系列暫時沒有每天的大綱,確切能寫多少還不太確定,如果時間足夠的話,才會去聊到網路加速技術,如 OVS-DPDK、XDP還有虛擬機的部分。

不過,因為 Linux Kernel 的內容龐大,加上時間有限,介紹的內容可能不會非常完整。此外,隨著我對原始碼的進一步追蹤,可能會偶然探討其他相關領域(例如 VFS),所以這些還是會隨著時間和我看的內容動態調整。

Kernel 原始碼

我將使用 Linux Kernel 6.6.47 版本來進行探索。為了便於閱讀,我會對原始碼進行一定的修改與刪減,刪除一些 error handling 和非必要的分支路線,使重點更為集中。

結語

最後,這個系列文章也是我個人學習與追蹤原始碼的紀錄。如果有任何我解釋錯誤的地方,歡迎大家勘誤。鐵人賽結束後,我可能會重新整理這些內容,並放到個人部落格進行分享, Louis Li's Blog (louisif.me)。期待大家的指教!


下一篇
小試身手 - Double Linked List
系列文
Linux Kernel 網路巡禮30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言