HTTP協議詳解

FrankTiao發表於2020-07-21

1. HTTP與SPDY協議

  HTTP協議簡單是來說就是一種基於應用層的通訊規範,雙方要進行通訊,就要遵守的一種規範。HTTP協議從伺服器傳輸超文字到本地瀏覽器,可以使瀏覽器更加高效。HTTP協議不僅保證了超文字文件的快速和安全的傳輸,還能確定文件中哪一部分先傳輸,或者哪些部分優先顯示。

1.1 HTTP協議

  HTTP協議是一個應用層的通訊規範,由請求和響應構成,是一個客戶端伺服器模型。HTTP協議承載於TCP協議之上,有時也承載於SSL、TLS協議之上(SSL、TLS也承載於TCP),這時就變成了我們常說的HTTPS。HTTP協議的預設埠是80,HTTPS是443。
  HTTP協議的模型就是由客戶端發起請求,服務端回送響應。HTTP協議是一個無狀態的協議,一個客戶端的兩次請求沒有任何對應關係。這屬於典型的一問一答式互動,這種方式很多不足,例如服務端主動向客戶端push等。

1.2 SPDY協議

  SPDY協議的出現主要是為了彌補HTTP協議的不足,SPDY協議支援流複用、主動發起請求、強制SSL傳輸等特性。SPDY協議是由google設計推廣的一種協議,目前在最新版本的Chrome和火狐等瀏覽器中都可以使用。

2. HTTP協議如何工作

  瀏覽網頁是HTTP協議的主要作用,但是並不是全部作用。例如騰訊QQ、迅雷等都有使用HTTP協議。HTTP的主工作流程主要分為以下4步。

2.1 建立連線

  客戶端與服務端建立連線。使用者點選一個超連結,HTTP協議開始工作。

2.2 發起請求

  客戶端向服務端發起請求。請求內容格式如下:

統一資源識別符號(URLHTTP協議版本號 請求MIME資訊(包含許可權修飾符、客戶端資訊等)
2.3 響應請求

  服務端接收到請求處理完畢後向客戶端回送響應,響應格式為:

狀態行(包含協議版本號,成功或失敗的狀態) MIME資訊(包含伺服器資訊、響應實體等)
2.4 斷開連線

  客戶端顯示響應後連線斷開。

3. HTTP協議中的主要概念

3.1 連線

  首先需要說明的是,三次握手和四次揮手不屬於HTTP協議的部分,它們屬於TCP協議,但是上文有講到過:HTTP是基於TCP的應用層協議,所以,HTTP在連線和斷開時也要經過三次握手和四次揮手的過程。

3.1.1 TCP三次握手

  首先看一張圖片

  1. 第一次握手
      客戶端向伺服器發出連線報文,同時隨機生成一個初始序列號,這時客戶端處於同步已傳送狀態。TCP協議規定,SYN=1報文段中不能攜帶資料,但需要消耗一個序號。這是三次握手的開始,表示客戶端向想要和伺服器建立連線

  2. 第二次握手
      伺服器收到連線請求後如果同意連線,則會發出ACK=1,SYN=1,確認號是ack=client_jsn+1,同時為自己初始化一個序列號server_jsn。此時伺服器進入SYN-RCVD(同步收到)狀態,此階段同樣不能攜帶資料,也要消耗一個序號。這是第二次握手,表示伺服器已同意並準備好連線,詢問客戶端是否準備完成。

  3. 第三次握手
      客戶端收到確認後向服務端發出報文ACK=1,ack=server_jsn+1表示已準備好,此時連線建立完成。

3.1.2 TCP四次揮手

  1. 第一次揮手
      客戶端向服務端傳送FIN報文,表示請求斷開連線。此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。

  2. 第二次揮手
      服務端收到FIN返回ACK表示已經確認。此時服務端處於CLOSE-WAIT(關閉等待)狀態,即伺服器已經知道客戶端沒有資料要傳送了,但是如果客戶端又傳送了資料服務端依然要接收。

  3. 第三次揮手
      服務端傳送FIN到客戶端,表示已經關閉連線。此時伺服器進入LAST-ACK(最後確認)狀態,等待客戶端的確認。

  4. 第四次揮手
      客戶端傳送ACK(確認)報文,注意此時TCP連線還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
    伺服器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連線。可以看到,伺服器結束TCP連線的時間要比客戶端早一些。

3.2 請求

  HTTP協議的請求中主要包含:請求行、請求主體、請求正文, 請求行以請求方法符開頭,以空格分開,具體格式如下:

Method Request-URI HTTP-Version CRLF
POST /index.php/action/login HTTP/1.1

  上述格式引數說明

引數 說明
Method 請求方法
Request-URI 請求資源統一識別符號
HTTP-Version 協議版本號
CRLF 一個回車和換行 CR和LF不可單獨出現,僅可作為結尾

  請求方法說明(大寫)

方法名 說明
GET 請求URI所標識的資源
POST 在URI所標識的資源後附加資源
DELETE 請求伺服器刪除URI所標識的資源
PUT 請求伺服器儲存一個資源,使用URI作為標識
HEAD 請求獲取由URI所標識的資源的響應報頭
TRACE 請求伺服器回送收到的請求資訊,主要用於測試或診斷
CONNECT 保留已備將來使用
OPTIONS 請求查詢伺服器效能或者與URI所標識的資源相關的選項和需求
##### 3.3 響應
  在接收到客戶端的請求後,服務端處理完成後對該請求回送響應。響應主要又狀態行、響應報頭、響應正文組成。
  狀態行的格式如下:
```
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP/1.1 302 Moved Temporarily
```
上述格式引數說明
引數 說明
HTTP-Version 協議版本號
Status-Code 響應狀態碼
Reason-Phrase 狀態碼的文字描述
CRLF 一個回車和換行 CR和LF不可單獨出現,僅可作為結尾

  響應狀態碼由三位數字組成,分別代表了不同含義,可取值如下:

可取值 說明
1xx 提示資訊。請求已接收,正在處理
2xx 成功。請求已被成功接收、理解、接收
3xx 重定向。要完成的請求需要更進一步的操作
4xx 客戶端錯誤。請求有語法錯誤或者請求無法實現
5xx 服務端錯誤。伺服器未能實現合法的請求
關於狀態碼還有更細的劃分,本文不做贅述。
3.4 報頭

  HTTP訊息報頭主要包括普通報頭、請求報頭、響應報頭、實體報頭,報頭的格式如下:

名字+:+空格+值
Content-Length: 89
3.4.1 普通報頭

  普通報頭中有少數報頭用於所有的請求和響應訊息。但並不被用於傳輸實體,只用於傳輸訊息,如快取控制、連線控制等。

3.4.2 請求報頭

  請求報頭允許客戶端傳輸請求的附加資訊和自身的資訊,如UA頭、Accept頭等。

3.4.3 響應報頭

  響應報頭用於伺服器傳輸在狀態行中不能傳輸的附加響應資訊,以及伺服器自身資訊,和對所標識的資源的下一步的操作資訊,如location等。

3.4.4 重要報頭說明

  

報頭 說明
Connection 如何處理長連線。在HTTP 1.1協議中client和server都預設對方支援長連結。
host 指定所請求的資源的Internet主機和埠資訊。HTTP 1.1版本必須包含host頭。
User-Agent 發出請求的使用者資訊。
Accept 客戶端可接受的檔案格式。
Cookie 客戶端向服務端傳輸的某些資訊。
Set-Cookie 服務端向客戶端傳輸的資訊。只能包含一個value值,且需要設定path等。
Cache-Control 指定請求和響應遵循的快取機制。
Referer 客戶端指定的URL的來源,常用於生成退連結串列等。
Content-Lenth 內容長度(位元組)。
Content-Range 響應的資源範圍。可在每次請求中標記請求範圍,實現斷點傳輸等功能。
Accept-Encodeing 指定可接受的編碼格式。
自定義報頭 可使用協議中未正式啟用或其他報頭。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章