計算機網絡詳解

一、網絡爲什麼要分層?

  我連網絡分層都沒有聽說過,你卻問我爲什麼分層,先搞清楚網絡是如何分層的,有一張圖片講述了網絡分層,以及每一層所用到的部分網絡協議:

 網絡爲什麼要分層,因爲但凡複雜的程序都是需要分層的,理解計算機網絡中的概念,一個很好的切入點就是:想象網絡包就是一段Buffer,或者一塊內存,是有格式的,同時,想象自己是處理網絡包的一段程序,而且這段程序,可以跑在電腦上,可以跑在服務器上,可以跑在交換機上,可以跑在路由器上,你想象自己有很多的網口,從某個口拿進一個網絡包來,用自己的程序處理一下,在從另一個網口發送出去,複雜的程序都要分層,這是程序設計的要求。

二、程序是如何工作的?

在專欄中有一張圖很形象的講述了程序工作的大概過程:

 文字解析:

(1)當一個網絡包網口經過的時候,你看到了,首先先看看要不要請進來,處理一把。有的網口配置了混雜模式,凡是經過的,全部拿上來。

(2)拿進來之後,就要交給一段程序來處理,於是你調用process_layer2(buffer),當然,這是一個假的函數,但是,其實真實存在着這麼一個函數,它的作用就是從buffer中摘掉二層的頭,看一看,根據頭裏面的內容做什麼操作。

(3)假設你發現這個包的MAC地址跟你的相符,那就是發給你的,於是需要調用process_layer3(buffer),這個時候Buffer中就沒有二層的頭了,因爲已經在上一個函數在處理過程中拿掉了,或者將開始的偏移量移動了一下,在這個函數裏面,摘掉三層的頭,看看是發給自己的,還是希望轉發出去的,如何判斷呢?如果IP地址不是自己的,那就應該轉發出去,如果IP地址是自己的,那就是發給自己的,根據IP頭裏面的標示,拿掉三層的頭,進行下一層處理,到底是調用process_tcp(buffer)?還是調用process_udp(buffer)

(4)假設這個地址是TCP的,則會調用process_tcp(buffer),這時候Buffer裏面沒有三層的頭,就需要查看四層的頭,看這是一個發起,還是一個應答,又或者是一個正常的數據包,然後分別由不同的邏輯進行處理,如果是發起或者是應答,接下來可能要發送一個回覆包;如果是一個正常的數據包,就需要交給上層了,交給應用去處理了,在四層的頭裏面,有端口號,不同的應用監聽不同的端口號,如果發現瀏覽器在監聽這個端口,那就發給瀏覽器處理就好了,至於瀏覽器怎麼處理,就與你無關了。

(5)瀏覽器解析HTML,顯示出頁面來,電腦的主人,看到頁面,點擊鼠標,點擊鼠標的動作被瀏覽器捕獲,發起另一個HTTP 請求了,於是使用端口號,將請求發送給你(你現在是處理buffer數據包的程序)

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

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

(8)然後調用send_layer2(buffer),Buffer裏面已經有了HTTP的頭和內容,TCP的頭,以及IP的頭。這個函數裏面要加一個MAC的頭,記錄下源MAC地址,得到的是本機器的MAC地址和目標MAC地址,這個是必須要添加的MAC地址。

這樣,只要Buffer裏面的內容完整,就可以從網口發出去了,你作爲一個程序的任務就告一段落了。

三、層與層之間有什麼關係?

劃重點:只要是在網絡上跑的包,都是完整的,可以有下層沒上層,絕對不可能沒有下層有上層。

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

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

 

發佈了87 篇原創文章 · 獲贊 213 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章