網路協議 1 - 概述

北國丶風光發表於2019-03-05

網際網路世界中,網路協議的重要性不言而喻。很多人都知道,網路協議中的五層模型或者七層模型,這些在作業系統中,那都是“必考題”。上學的時候,無論是死記硬背,還是各種小抄,總得把下面這個圖記下來。踏入工作,走進 web 開發“不歸路”,發現還是不能落下它。

網路協議 1 - 概述

協議三要素

  • 語法,就是一段內容要符合一定的規則和格式。例如,括號要成對,結束要使用分號等。
  • 語義,就是這段內容要代表某種意義。例如,數字相減是有意義的,而數字減去文字一般來說就沒有意義。
  • 順序,就是規定先幹什麼,後幹什麼。就像我們常做的,先加某個數值,再減去某個數值等。

HTTP 協議:

HTTP/1.1 200 OK
Date: Thu, 25 Oct 2018 01:56:12 GMT
Content-Type: 
Content-Language:

<!DOCTYPE html>
<html>
<head>
<base href="http://blog.muzixizao.com/" />
<meta charset="utf-8"/> <title>木子與西早的部落格屋 </title>
複製程式碼

我們來看看上面的 HTTP 協議是否符合協議的三要素。

首先,符合語法,也就是說,只有按照上面那個格式來,瀏覽器才能解析。例如,上面是狀態,然後是首部,最後是內容。

其次,符合語義,就是要按照約定的意思來。例如,狀態 200,表示網頁成功返回。如果不成功,就是常見的 404。

最後,符合順序,點選瀏覽器,就是傳送一個 HTTP 請求,然後才有上面那串返回的東西。

瀏覽器顯然按照協議商定好的做了,才能將網頁呈現在你面前。

常用的網路協議

我們面試的時候經常會被問到這樣一個問題:

在瀏覽器輸入一個地址,然後點選回車,此時到頁面載入出來,這個過程發生了什麼?

我們就用開啟部落格的過程,看看網際網路世界執行過程中,都使用了哪些網路協議。

當在瀏覽器裡輸入 “http://blog.muzixizao.com”,這是一個 URL,而瀏覽器知道它的名字是 blog.muzixizao.com,但是不知道具體的地點,所以瀏覽器不知道如何訪問。

於是,它開啟地址簿去查詢。在這個過程中,我們一般使用***地址簿協議-DNS***,還可以使用另一種更加精準的地址簿查詢協議-HTTPDNS

無論使用哪一種方法查詢,最終都可以得到這個地址:47.106.81.116。這個是 IP 地址,可以把它當做是網際網路世界的“門牌號”。

知道了目標地址,瀏覽器就開始打包它的請求。對於普通的 HTTP 請求,一般會使用 HTTP 協議,但是如果對於購物的請求,往往會進行加密傳輸,因而會使用 HTTPS 協議。無論是什麼協議,裡面都會寫明“我要看哪篇博文”。

網路協議 1 - 概述

DNS、HTTP、HTTPS 所在的層我們成為***應用層***。經過應用層封裝後,瀏覽器會將應用層的包交給下一層去完成,通過 socket 程式設計來實現。下一層是***傳輸層***。傳輸層有兩種協議,一種是無連線的協議 UDP,一種是面向連線的協議 TCP。而所謂的面向連線就是,TCP 會保證這個包能夠到達目的地,如果不能到達,就會重新傳送,直至到達。

TCP 協議裡面會有兩個埠。一個是瀏覽器監聽的埠,一個是部落格伺服器監聽的埠。作業系統往往通過埠來判斷,它得到的包應該給哪個 程式。

網路協議 1 - 概述

傳輸層封裝完畢後,瀏覽器會將包交給作業系統的***網路層***。網路層的協議是 IP 協議。在 IP 協議裡面會有源 IP 地址和目標 IP 地址,也就是瀏覽器所在機器的 IP 地址和部落格網站所在伺服器的 IP 地址。

網路協議 1 - 概述

作業系統既然知道了目標 IP 地址,下一步就是根據這個 IP 找到目標機器。它首先會判斷,這個目標 IP 是本地人還是外地人。從 IP 很明顯就能看出來,部落格伺服器不在本地。

作業系統知道了,要到目標機器,就要要離開本地去遠方。那如何去遠方呢?這個時候就可以拿出國旅遊作類比。我們要去國外,就要經過海關。同樣的,作業系統要去遠方,也要經過***閘道器***。而作業系統啟動的時候,就會被 DHCP 協議配置 IP 地址,以及預設的閘道器 IP 地址:192.168.1.1。

作業系統如何將 IP 地址發給閘道器呢?在本地通訊基本靠吼,於是作業系統大吼一聲,誰是 192.168.1.1 ?閘道器會回答它,我就是,我的本地地址在村東頭。這個本地地址就是 MAC 地址,而大吼的那一聲就是 ARP 協議

網路協議 1 - 概述

作業系統拿到了 MAC 地址,就將 IP 包交給了下一層:MAC 層。網路卡再將這個包含 MAC 地址的包發出去。由於這個包裡面有閘道器的 MAC 地址,因而它能夠到達閘道器。

閘道器收到包之後,會根據自己的知識,判斷下一步應該怎麼走。閘道器往往是一個路由器,到某個 IP 地址應該怎麼走,這個叫做***路由表***。

路由器有點像玄奘西行路過的一個個國家的城關。每個城關連線著兩個國家,每個國家相當於一個區域網,在每個國家內部,都可以使用本地的地址 MAC 進行通訊。

一旦跨越城關,就需要拿出 IP 頭來,裡面寫著貧僧來自東土大唐(源 IP 地址),想去西天(目標 IP 地址)拜佛求經。路過此地,借宿一晚,明日啟行。請問接下來該怎麼走?

網路協議 1 - 概述

城關往往是知道這些“知識”的,因為城關和臨近的城關也會經常溝通。到哪裡應該怎麼走,這種溝通的協議稱為***路由協議***,常用的有 OSPF 和 BGP。

城關與城關之間是一個國家,當網路包知道了下一步去哪個城關,還是要使用國家內部的 MAC 地址,通過下一個城關的 MAC 地址,找到下一個城關,然後再問下一步的路怎麼走,一直到走出最後一個城關。

最後一個城關知道這個網路包要去的地方,於是,就對著這個國家吼一聲(ARP協議),誰是目標 IP ?目標伺服器就會回覆一個 MAC 地址。網路包過關後,通過這個 MAC 地址就能找到目標伺服器。

目標伺服器發現 MAC 地址對上了,取下 MAC 頭來,然後傳送給作業系統的網路層。網路層發現 IP 也對上了,就取下 IP 頭。 IP 頭裡會寫上一層封裝的是 TCP 協議,然後將其交給傳輸層,即 TCP 層。

在這一層裡,對於收到的每個包,都會有一個回覆的包說明收到了。這個回覆的包不是這次請求的結果,而僅僅是 TCP 層的一個收到回覆。這個回覆會沿著剛才來的方向走回去,報個平安。

如果過一段時間,傳送端的 TCP 層沒有收到平安回覆,就會重新傳送這個包,重複上面的過程,直到收到平安到達的回覆為止。這個重試不是瀏覽器重新進行請求,對於瀏覽器而言,只傳送一次請求,而 TCP 層在沒有收到平安回覆時,不斷悶頭重試。除非 TCP 層出了問題,比如連線斷了,才需要瀏覽器的應用層重新傳送請求。

當網路包平安到達 TCP 層後,TCP 頭中有目標埠號,通過這個埠號,可以找到部落格網站的程式正在監聽這個埠號,假設是 Nginx,於是就將這個包發給 Nginx,進行相關業務處理。處理完成後,將相關資料打包,然後回覆給瀏覽器,顯示出博文頁。

下圖就是整個HTTP 請求中可能用到的協議。後續會通過從底層到上層的順序來一一分享。

網路協議 1 - 概述

相關文章