淺談網絡協議(二) 網絡分層的含義

做開發的朋友肯定知道,越是複雜的程序,往往越是需要分得越細。即使是剛剛入門的程序員,也知道MVC等分層結構。複雜的程序都要分層。

爲什麼網絡要分層

因爲不同的層次之間有不同的溝通方式,溝通使用的協議不同。與程序相似的,網絡也是一個非常複雜的系統,如果不進行分層處理,那麼不同層次之間的交流會變得非常困難和混亂。
而且分層之後也有顯而易見的好處。

  • 每層容易形成統一的標準,即使是不同的網絡廠商也可以交流
  • 每層只需要專注自己的事情,減少了這一層的複雜度
  • 整體容易形成統一的規範,有助於計算機網絡的發展

很多人聽過 TCP 建立連接的三次握手協議,也會把它當知識點背誦。那你知道 TCP 在進行三次握手的時候,IP 層和 MAC 層對應都有什麼操作嗎?

分層之後也有一些壞處,比如分層之後,由於單層更加專注,導致一些學習者會分層的進行學習,但是經常會忘記層與層之間的關聯。

學習第三層網絡層的時候會提到,IP 協議裏面包含目標地址和源地址。第三層裏往往還會學習路由協議。路由就像中轉站,我們從原始地址 A 到目標地址 D,中間經過兩個中轉站 A->B->C->D,是通過路由轉發的。

那麼問題來了。A 知道自己的下一個中轉站是 B,那從 A 發出來的包,應該把 B 的 IP 地址放在哪裏呢?B 知道自己的下一個中轉站是 C,從 B 發出來的包,應該把 C 的 IP 地址放在哪裏呢?如果放在 IP 協議中的目標地址,那包到了中轉站,怎麼知道最終的目的地址是 D 呢?

教科書不會通過場景化的例子,將網絡包的生命週期講出來,所以你就會很困惑,不知道這些協議實際的應用場景是什麼。

你一定聽過二層設備、三層設備。二層設備處理的通常是 MAC 層的東西。如果發送一個 HTTP 的包,那麼應該是在第七層工作的,那是不是不需要經過二層設備?或者即便經過了,二層設備也不處理?或者換一種問法,二層設備處理的包裏,有沒有 HTTP 層的內容呢?

你能詳細的說出來你在網絡上的某一個行爲,例如購物、通過ftp上傳文件、下載一個遊戲等經過了哪些過程嗎?知道具體通過了哪些協議嗎?

儘管對每一層都很熟悉,但是估計很多人會答不上來。因爲無法把這些內容串聯到一起。

程序是如何工作的? 把自己想象成一個程序,看看“你”這個程序是如何進行工作的。

18

當一個網絡包從一個網口經過時,首先先看看要不要放進來。有的網口配置了混雜模式,凡是經過的,全部拿進來。

拿進來以後,就要交給一段程序來處理。於是,你調用process_layer2(buffer)。procrss_layer2是從 Buffer 中摘掉二層的頭的函數,看一看,應該根據頭裏面的內容做什麼操作。以下process_layer3是摘掉第三層的頭函數。

如果這個包的 MAC 地址和你的相符,那說明就是發給你的,於是需要調用process_layer3(buffer)。這個時候,Buffer 裏面往往就沒有二層的頭了,因爲已經在上一個函數的處理過程中拿掉了,或者將開始的偏移量移動了一下。在這個函數裏面,摘掉三層的頭,看看到底是發送給自己的,還是希望自己轉發出去的。如果 IP 地址不是自己的,那就應該轉發出去;如果 IP 地址是自己的,那就是發給自己的。

到第四層的時候,就要根據地址是TCP的還是UDP的來調用不同的procrss程序來處理。傳輸層需要查看四層的頭來判斷數據包是一個發起,還是一個應答,還是普通的數據傳輸包,分別交給不同的邏輯處理。發起或者應答的話,就要發送一個回覆包,正常的數據包就需要交給上層處理了。

到了第五層應用層,往往沒有直接的相應的處理頭的procrss,而是直接通過第四層頭裏的端口號,將數據包交給對應監聽端口的進程去處理。

瀏覽器通過解析 HTML 來顯示頁面。用戶點擊鼠標,點擊鼠標的動作被瀏覽器捕獲之後發起另一個 HTTP 請求,於是使用端口號,將請求發給了你。

瀏覽器這裏調用send_tcp(buffer)。Buffer 裏面就是 HTTP 請求的內容。在這個函數裏面加一個 TCP 的頭,記錄下源端口號。瀏覽器會給你目的端口號,一般爲 80 端口。

然後調用send_layer3(buffer)。Buffer 裏面已經有了 HTTP 的頭和內容,以及 TCP 的頭。在這個函數裏面加一個 IP 的頭,記錄下源 IP 的地址和目標 IP 的地址。

然後調用send_layer2(buffer)。Buffer 裏面已經有了 HTTP 的頭和內容、TCP 的頭,以及 IP 的頭。這個函數裏面要加一下 MAC 的頭,記錄下源 MAC 地址,得到的就是本機器的 MAC 地址和目標的 MAC 地址。不過,這個還要看當前知道不知道,知道就直接加上;不知道的話,就要通過一定的協議處理過程,找到 MAC 地址。反正要填一個,不能空着。

萬事俱備,只要 Buffer 裏面的內容完整,就可以從網口發出去了,一個程序的任務就算告一段落了。

那 TCP 在三次握手的時候,IP 層和 MAC 層在做什麼呢?

TCP 發送每一個消息,都會帶着上 IP 層和 MAC 層了。因此,TCP 每發送一個消息,IP 層和 MAC 層的所有機制都要運行一遍。。

只要是在網絡上跑的包,都是完整的。可以有下層沒上層,絕對不可能有上層沒下層。所以如果一個 HTTP 協議的包跑在網絡上,它一定是完整的。無論這個包經過哪些設備,它都是完整的。

所以,對 TCP 協議來說,三次握手也好,重試也好,只要想發出去包,就要有 IP 層和 MAC 層,不然是發不出去的。

那麼上一講的問題:當網絡包到達一個城市城關的時候,可以直接通過路由得到達下一個網關的IP地址,直接通過IP地址找就可以了,爲什麼還要通過本地的MAC地址呢?這裏的關鍵就是,沒有 MAC 地址消息是發不出去的。

所謂的二層設備、三層設備,都是這些設備上跑的程序不同而已。一個 HTTP 協議的包經過一個二層設備,二層設備收進去的是整個網絡包。這裏面 HTTP、TCP、 IP、 MAC 都有。什麼叫二層設備呀,就是隻把 MAC 頭摘下來,看看到底是丟棄、轉發,還是自己留着。那什麼叫三層設備呢?就是把 MAC 頭摘下來之後,再把 IP 頭摘下來,看看到底是丟棄、轉發,還是自己留着。

小結 如何理解網絡協議的工作模式:

理解清楚計算機是如何拿到網絡包,如何根據規則進行處理,如何發出去; 始終牢記一個原則:只要是在網絡上跑的包,都是完整的。可以有下層沒上層,絕對不可能有上層沒下層。

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