HTTP深入淺出

鹽酸不是酸發表於2019-04-05

開始:從輸入 URL 到頁面展現中間發生了什麼?

  • 我們可以把大致過程分為:域名解析 ->TCP(3次握手)->建立連線 ->HTTP請求 ->後臺處理請求 ->HTTP響應 ->關閉連線 (4次揮手)->解析HTML ->渲染

1、域名解析

IP地址

  • 網際網路上分佈著數以億計的主機,但是他們是通過什麼方式去準確的建立通訊?答案是IP。每一臺主機都有一個對應的IP地址,通過訪問IP地址就可以準確的和另一臺主機建立通訊了。

域名解析系統

  • 主機之間的通訊建立是通過訪問IP實現的,但是IP的形式類似於(203.208.60.97)。這種數字串不便於我們的記憶。所以,我們通過域名解析系統,自動將類似與(www.baidu.com)的網址解析成對應的IP地址。

域名解析過程

  • 當我們輸入(ww.baidu.com)時,系統首先會在本地瀏覽器檢視對應快取,從快取中查詢,如果沒有搜尋到,會進入
  • 本地快取,也就是我們的host資料夾,如果還沒有查詢到,會進入
  • 本地伺服器,比如你是學校的網路,一般就在學校。如果還沒找到,
  • 首先本地伺服器會向Root Server傳送請求資訊,然後Root Server 會返回一個gTLD(通用頂級域),接下來本地伺服器會訪問gTLD。gTLD會返回Name Server伺服器地址,也就是你註冊網路的伺服器提供商的地址。最後NAME Server會把指定域名的ip傳送給客戶端
  • 這樣域名解析就完成了。

2、TCP三次握手

下面是一張TCP三次握手的過程圖

HTTP深入淺出
接下來是TCP報文
HTTP深入淺出
解釋一下TCP報文中,紅色部分對應(seq)。藍色部分對應(ack)。首先我來解釋一下這張報文,seq是序號欄位、ack是確認號(seq+1),ACK是確認序號有效標識。SYN是同步序號標識,用來發起一個連線。其他的自行百度。

  • seq 序號欄位,每一次傳輸的資料流都有一個序號。當資料到達目的地後,接收端會按照這個序列號把資料重新排列,保證資料的正確性。
  • ack 確認號,它是用來分辨是哪一次傳輸的資料流。因為我們傳輸的資料不僅僅是一次,為了不打亂順序,我們會通過(ack=seq+1)來匹配對應的傳輸資料流。如果一個資料段一直沒有被確認,它將會被要求重發。這樣資料的完整性就得到了保證。
  • ACK 確認序號有效標識。只有當ACK=1時確認號欄位才有效。當ACK=0時,確認號無效。在上圖中其實第一次傳輸時應該加上 ACK=0。
  • SYN 同步序號標誌,用來發起一個連線。SYN=1表示這是一個連線請求或連線接受請求。所以第三次沒有帶上SYN。因為,不需要在連線了。

所以TCP三次連線的過程可以解釋為:

  • 第一次:SYN=1 (請求連線), seq=x(傳輸資料流序號),ACK=0(上圖沒有,應該加上)。因為不需要確認資料流所以沒* 有(ack)
  • 第二次:SYN=1(接受連線) ,ack=x+1(ack=seq+1)確認接受資料流,ACK=1(確認序號),seq=y(傳輸響應資料序號)。
  • 第三次:ack=y+1,ACK=1(確認序號),seq=x+1(因為第一次是x)。沒有SYN,因為SYN這個標誌位只有TCP建立連線時才被置為1。

3、HTTP請求

TCP三次握手相當於建立了一個資料流通道,HTTP請求通過這條資料通道進行傳輸。

HTTP深入淺出
HTTP資料流通過程大致可以通過TCP/IP4層模型來說明:

應用層

應用層直接和應用程式介面(比如,qq,百度),並且提供相應的網路服務,其中就包括了HTTP協議和DNS協議。DNS協議上文已經解釋了,其實DNS域名解析就是存在於這一層。接下來我要說的就是HTTP協議,它是超文字傳輸協議,它定義了資料傳輸的最終形態。以下是一個簡單的請求報文格式:

POST /index.html HTTP/1.1
Connection:keeep-alive
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0

Username=admin&password=admin
複製程式碼

HTTP請求頭部資訊可以分為4部分:

  • 請求行,具體內容包括:動詞 路徑 協議/版本 如上圖中的(GET /psot....)。
  • 請求頭部,具體形式為:Key: value ,如上圖中(Connection:keeep-alive)
  • 空格()
  • 請求資料(Username=admin&password=admin)

下面是一個簡單的響應報文:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <p>this is http response</p>
</body>
</html>
複製程式碼

HTTP響應頭部資訊可以分為4部分:

  • 響應行,具體內容包括:協議/版本號 狀態碼 狀態解釋 如上圖中的(HTTP/1.1 200 OK.)。
  • 響應體,具體形式為:Key: value ,如上圖中(Content-Encoding: gzip) 空格()
  • 響應資料(HTML程式碼)

傳輸層

網路層通過(ip協議)保證了點到點,即主機到主機之間的通訊。而傳輸層,保證了端到端之間的通訊,也就是應用程式之間的通訊。(程式是程式的一次執行。比如每個IE瀏覽器的視窗都是一個程式例項,它們都是IE瀏覽器程式的一次執行。)傳輸層的協議主要有兩種TCP/UDP

  • TCP即傳輸控制協議,是一個可靠的、面向連線的協議。它允許網路間兩臺主機之間無差錯的資訊傳輸。TCP協議還進行流量控制,以避免傳送過快而發生擁塞。
  • UDP即使用者資料包協議,它採用無連線的方式傳送資料,也就是說傳送端不關心傳送的資料是否到達目標主機,資料是否出錯等。收到資料的主機也不會告訴傳送方是否收到了資料,它的可靠性由上層協議來保障。

所以資料流通到傳輸層,會將從應用層得到的資料進行分割成多個小資料包(TCP報文)。同時,標記上序號和埠號。

網路層

資料經過網路層,資料會加上IP地址,這樣資料就能夠實現主機與主機之間的通訊。網路層的作用主要是:

  • 路由的選擇,也就是傳輸路線的選擇,儲存轉發,當客戶端傳輸的資料大於轉發給伺服器資料的時候,可以將資料置於自己的快取中
  • 擁塞控制,當預定的傳輸線路,有故障的時候,可以選擇性的更換傳輸路線。

鏈路層

資料鏈路層在物理提供的服務的基礎上向網路層提供服務,其最基本的服務是將源自網路層來的資料可靠地傳輸到相鄰節點的目標機網路層。(來自百度百科)

4.關閉連線(4次揮手)

HTTP深入淺出
TCP的4次揮手參考TCP報文來理解就是:

  • 第一次,客戶端傳送FIN=1即表示斷開連線請求
  • 第二次,伺服器接收到資訊後傳送ACK=1表示確認收到資訊,同時可能存在伺服器沒有將資料全部傳輸完成所以
  • 第三次,等伺服器將資料傳輸完成後,傳送FIN=1表示可以關閉連線
  • 第四次,客戶端傳送ACK=1表示確認收到資訊,斷開連線。

關於TCP連線為什麼是3次,斷開需要四次

因為在斷開的時候,伺服器需要保證自己的資料傳輸完成,所以,先傳送確認訊號(ACK=1),等到資料傳輸完成才傳送斷開訊號(FIN=1)

參考資源: