運維工程師技能樹-基礎知識之操作系統篇(網絡)

本節主要介紹操作系統是如何處理網絡請求的。當一個網絡包到達時,操作系統如何把這個網絡包傳遞給應用程序;應用程序GET,POST一個請求的時候,操作系統如何將這個請求打包發送出去。

首先網絡是典型的分層模型,從操作系統的角度來看,可以簡化爲數據鏈路層,IP層,傳輸層,應用層4層。這裏的層級不要與OSI的7層模型混淆。這裏是另外一個簡化模型。對於各層簡要介紹一下:

數據鏈路層:這層的數據叫做幀,每個幀都有固定的頭部標誌和尾部標誌,操作系統通過判斷首尾標誌來從比特流中區分出一個一個的幀。幀的頭部有源MAC地址和目的MAC地址,幀的路由方式依據這兩個MAC地址來進行。網卡看到一個幀到來時,如果該幀的目的MAC地址與自己相符,則處理這個幀,否則丟棄。

網絡層:網絡層是數據鏈路層的載荷,數據鏈路層不關心網絡層的內容是什麼,幀解包以後剩下的內容就是網絡層的內容,目前網絡層使用最多的協議是IP協議,ICMP協議等,由於IP協議用途很廣,我們就IP協議來介紹,IP層有一個比數據鏈路層更復雜的包頭,裏面包含了這個包的信息,包括源地址,目的地址,頭部長度,總長度等等,操作系統通過閱讀頭部來了解這個數據包的信息,從而解包和路由。值得注意的是,IP層的一個完整的包可能包括多個分片,一次網絡發送不一定能夠發送完一個完整的IP包,因此每個IP包的頭部會包含自己的分片ID和分片偏移,操作系統根據這個將這些分片再組裝成一個完整的IP數據包後再交付上層或者轉發。

傳輸層:傳輸層是IP層的數據,裏面包含了源端口和目的端口的信息。所有的IP數據包到達操作系統後並不能立即交給應用程序,操作系統需要通過端口號來對進程進行區分,然後將包分發給不同的進程。

應用層:這裏就進入用戶空間了,是具體的程序邏輯,操作系統剝離了傳輸層的包頭後,將最終的內容交給用戶的程序。如果你是直接操作socket的,那麼socket通過read()讀到的數據就是這部分了。如果你是通過http這樣的協議來通信,那麼還需要對傳輸層的內容再進行解包,獲取最終的信息。

數據包發送的過程則是和上面的解包過程相反。

深入到內核部分,再來看這些過程,這裏最重要的一個數據結構就是sk_buff,一個sk_buff對應了一個幀。操作系統見到的最原始的數據就是這個sk_buff了。這個數據結構裏包含了mac頭部長度,網絡層頭部長度,傳輸層頭部長度等。操作系統收到一個sk_buff對象後,參考這些頭部長度來進行解包,爲了性能起見,操作系統解包通過移動指針的方式進行,而非真正的刪除包頭。sk_buff是操作系統網絡部分最核心的數據結構,操作系統協議棧的各層處理實際上就是操作這個結構,可以說是網絡子系統的基石。所有的sk_buff被組織成一個隊列,實現上是一個雙向鏈表。當一個數據包到來時,經過協議棧的層層處理,最終會被拷貝到用戶空間,被read 返回。發送數據包時,過程相反。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章