1. 程式人生 > >【網路協議】網路分層的真實含義是什麼?

【網路協議】網路分層的真實含義是什麼?

最近學習了極客時間,劉超老師的課程,記錄下課程中的重點部分。

一、網路為什麼要分層?

  因為,是個複雜的程式都要分層,分層可以更好的明確每一層的職責。
  理解計算機網路中的概念,一個很好的角度是,想象網路包就是一段Buffer,或者一塊記憶體,是有格式的。同時想象自己是一個處理網路包的程式,而且這個程式可以跑在電腦上,可以跑在伺服器上,可以跑在交換機上,也可以跑在路由器上。你想象自己有很多網口,從某個口拿進一個網路包來,用自己的程式處理一下,再從另一個網口傳送出去。

二、程式是如何工作的

這裡寫圖片描述
  當一個網路包從一個網口經過的時候,你看到了,首先先看看要不要請進來,處理一下。有的網口配置了混雜模式,凡是經過的,全部拿進來。
  拿進來之後,就要交給一段程式來處理。於是,你呼叫process_layer2(buffer)

.當然這是一個假的函式。但是你明白其中的意思,知道肯定是有這麼個函式的。那這個函式是幹什麼的?從Buffer中,摘掉二層的頭,看一看,應該根據頭裡面的內容做什麼操作。
  假設你發現這個包的MAC地址和你的相符,那說明就是發給你的,於是需要呼叫process_layer3(buffer)。這個時候Buffer裡面往往就沒有二層的頭了,因為已經在上層的一個函式的處理中拿掉了。或者將開始的偏移量移動一下。在這個函式裡面,摘掉第三層的頭,看著到底是傳送給自己的,還是希望自己轉發出去的。
  怎麼判斷呢?如果IP地址不是自己的,那就應該轉發出去;如果IP地址是自己的,那就是發給自己的。根據IP頭裡面的標識,拿掉三層的頭,進行下一層的處理,到底是呼叫process_tcp(buffer)
呢,還是呼叫process_udp(buffer)呢?
  假設這個地址是TCP的,則會呼叫process_tcp(buffer)。這時候,Buffer裡面沒有三層的頭,就需要檢視四層的頭。看著是一個發起,還是一個應答,又或者是一個正常的資料包,然後分別由不同的邏輯進行處理。如果是發起或者應答,接下來可能要傳送一個回覆包;如果是一個正常的資料包,就需要上交給上層了。交給誰呢?是不是有process_http(buffer)函式呢?
沒有的,如果你是一個網路包處理程式,你不需要有process_http(buffer),而是應該交給應用去處理。交給哪個應用呢?在四層的頭裡面有埠號,不同的應用監聽不同的埠號。如果發現瀏覽器應用在監聽這個埠,那你發給瀏覽器就行了。置於瀏覽器怎麼處理,和你沒有關係。
  瀏覽器自然是解析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地址。這樣就完成了一個程式的任務。

要記住一點:只要是在網路上跑的包,都是完整的。可以有下層沒上層,絕對不可能有上層沒下層。