互聯網世界中,網絡協議的重要性不言而喻。不少人都知道,網絡協議中的五層模型或者七層模型,這些在操做系統中,那都是「必考題」。上學的時候,不管是死記硬背,仍是各類小抄,總得把下面這個圖記下來。踏入工做,走進 web 開發「不歸路」,發現仍是不能落下它。html
HTTP 協議:web
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 請求,而後纔有上面那串返回的東西。服務器
瀏覽器顯然按照協議商定好的作了,才能將網頁呈如今你面前。網絡
咱們面試的時候常常會被問到這樣一個問題:socket
在瀏覽器輸入一個地址,而後點擊回車,此時到頁面加載出來,這個過程發生了什麼?
咱們就用打開博客的過程,看看互聯網世界運行過程當中,都使用了哪些網絡協議。網站
當在瀏覽器裏輸入 「http://blog.muzixizao.com」,這是一個 URL,而瀏覽器知道它的名字是 blog.muzixizao.com,可是不知道具體的地點,因此瀏覽器不知道如何訪問。加密
因而,它打開地址簿去查找。在這個過程當中,咱們通常使用地址簿協議-DNS,還可使用另外一種更加精準的地址簿查找協議-HTTPDNS。
不管使用哪種方法查找,最終均可以獲得這個地址:47.106.81.116。這個是 IP 地址,能夠把它當作是互聯網世界的「門牌號」。
知道了目標地址,瀏覽器就開始打包它的請求。對於普通的 HTTP 請求,通常會使用 HTTP 協議,可是若是對於購物的請求,每每會進行加密傳輸,於是會使用 HTTPS 協議。不管是什麼協議,裏面都會寫明「我要看哪篇博文」。
DNS、HTTP、HTTPS 所在的層咱們成爲應用層。通過應用層封裝後,瀏覽器會將應用層的包交給下一層去完成,經過 socket 編程來實現。下一層是傳輸層。傳輸層有兩種協議,一種是無鏈接的協議 UDP,一種是面向鏈接的協議 TCP。而所謂的面向鏈接就是,TCP 會保證這個包可以到達目的地,若是不能到達,就會從新發送,直至到達。
TCP 協議裏面會有兩個端口。一個是瀏覽器監聽的端口,一個是博客服務器監聽的端口。操做系統每每經過端口來判斷,它獲得的包應該給哪一個 進程。
傳輸層封裝完畢後,瀏覽器會將包交給操做系統的網絡層。網絡層的協議是 IP 協議。在 IP 協議裏面會有源 IP 地址和目標 IP 地址,也就是瀏覽器所在機器的 IP 地址和博客網站所在服務器的 IP 地址。
操做系統既然知道了目標 IP 地址,下一步就是根據這個 IP 找到目標機器。它首先會判斷,這個目標 IP 是本地人仍是外地人。從 IP 很明顯就能看出來,博客服務器不在本地。
操做系統知道了,要到目標機器,就要要離開本地去遠方。那如何去遠方呢?這個時候就能夠拿出國旅遊做類比。咱們要去國外,就要通過海關。一樣的,操做系統要去遠方,也要通過網關。而操做系統啓動的時候,就會被 DHCP 協議配置 IP 地址,以及默認的網關 IP 地址:192.168.1.1。
操做系統如何將 IP 地址發給網關呢?在本地通訊基本靠吼,因而操做系統大吼一聲,誰是 192.168.1.1 ?網關會回答它,我就是,個人本地地址在村東頭。這個本地地址就是 MAC 地址,而大吼的那一聲就是 ARP 協議。
操做系統拿到了 MAC 地址,就將 IP 包交給了下一層:MAC 層。網卡再將這個包含 MAC 地址的包發出去。因爲這個包裏面有網關的 MAC 地址,於是它可以到達網關。
網關收到包以後,會根據本身的知識,判斷下一步應該怎麼走。網關每每是一個路由器,到某個 IP 地址應該怎麼走,這個叫作路由表。
路由器有點像玄奘西行路過的一個個國家的城關。每一個城關鏈接着兩個國家,每一個國家至關於一個局域網,在每一個國家內部,均可以使用本地的地址 MAC 進行通訊。
一旦跨越城關,就須要拿出 IP 頭來,裏面寫着貧僧來自東土大唐(源 IP 地址),想去西天(目標 IP 地址)拜佛求經。路過此地,借宿一晚,明日啓行。請問接下來該怎麼走?
城關每每是知道這些「知識」的,由於城關和臨近的城關也會常常溝通。到哪裏應該怎麼走,這種溝通的協議稱爲路由協議,經常使用的有 OSPF 和 BGP。
城關與城關之間是一個國家,當網絡包知道了下一步去哪一個城關,仍是要使用國家內部的 MAC 地址,經過下一個城關的 MAC 地址,找到下一個城關,而後再問下一步的路怎麼走,一直到走出最後一個城關。
最後一個城關知道這個網絡包要去的地方,因而,就對着這個國家吼一聲(ARP協議),誰是目標 IP ?目標服務器就會回覆一個 MAC 地址。網絡包過關後,經過這個 MAC 地址就能找到目標服務器。
目標服務器發現 MAC 地址對上了,取下 MAC 頭來,而後發送給操做系統的網絡層。網絡層發現 IP 也對上了,就取下 IP 頭。 IP 頭裏會寫上一層封裝的是 TCP 協議,而後將其交給傳輸層,即 TCP 層。
在這一層裏,對於收到的每一個包,都會有一個回覆的包說明收到了。這個回覆的包不是此次請求的結果,而僅僅是 TCP 層的一個收到回覆。這個回覆會沿着剛纔來的方向走回去,報個平安。
若是過一段時間,發送端的 TCP 層沒有收到平安回覆,就會從新發送這個包,重複上面的過程,直到收到平安到達的回覆爲止。這個重試不是瀏覽器從新進行請求,對於瀏覽器而言,只發送一次請求,而 TCP 層在沒有收到平安回覆時,不斷悶頭重試。除非 TCP 層出了問題,好比鏈接斷了,才須要瀏覽器的應用層從新發送請求。
當網絡包平安到達 TCP 層後,TCP 頭中有目標端口號,經過這個端口號,能夠找到博客網站的進程正在監聽這個端口號,假設是 Nginx,因而就將這個包發給 Nginx,進行相關業務處理。處理完成後,將相關數據打包,而後回覆給瀏覽器,顯示出博文頁。
下圖就是整個HTTP 請求中可能用到的協議。後續會經過從底層到上層的順序來一一分享。
參考: