網絡協議 1 - 概述


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

協議三要素

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

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 協議。無論是什么協議,里面都會寫明“我要看哪篇博文”。

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 請求中可能用到的協議。后續會通過從底層到上層的順序來一一分享。

參考:

  1. 劉超-趣談網絡協議系列課;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM