03 前端HTTP協議(圖解HTTP) 之 HTTP報文內的HTTP資訊

zhaoyezi發表於2018-09-04

1. HTTP 報文

用於HTTP協議互動的資訊被稱為HTTP報文。請求端的叫請求報文,服務端的叫響應報文。是由多行(CR+LF作為換行符)資料構成的字串文字

HTTP報文= 報文首部 + 報文主體(非必要)
複製程式碼
  • 請求行: 包含請求的方法,請求的URI, HTTP 版本
  • 響應行: 響應結果的狀態碼,原因短語,HTTP 版本
  • 首部欄位: 包含表示請求和響應的各種條件和屬性的各類首部(通用首部,響應首部,請求首部和實體首部)
  • 其他:可能包含HTTP的RFC(Request For Comments,徵求意見稿)裡未定義的首部(Cookie等)

03 前端HTTP協議(圖解HTTP) 之 HTTP報文內的HTTP資訊

2. 報文主體和實體主體

報文(message): 是HTTP通訊基本單位,由8位組位元組流組成,通過HTTP通訊傳輸
實體(entity): 作為請求和響應的有效載荷資料(補充項)被傳輸,其內容由實體首部+實體主體組成。

  • HTTP報文的主體:用於傳輸請求和響應的實體主體。
  • 報文主體通常等於實體主體,如果傳輸過程中進行了編碼操作,實體內容發生變化,才回導致和報文主體產生差異

3. 壓縮傳輸的內容編碼

內容編碼:實體內容上的編碼格式,並儲存實體資訊原樣壓縮。內容編碼後的實體由客戶端接收並負責解碼。

  • gzip(GNU zip)
  • compress(UNIX 系統的標準壓縮)
  • deflate(zlib)
  • identify(不進行編碼)

03 前端HTTP協議(圖解HTTP) 之 HTTP報文內的HTTP資訊

4. 分割傳送的分塊傳輸編碼

分塊傳輸編碼(Chuncked Transfer Coding): 在HTTP通訊中,請求的編碼實體為全部傳輸完畢之前,頁面時無法顯示的。因此在傳遞大容量資料時,將資料分割為多塊,每一塊都會使用十六進位制進行標記塊大小,最後一塊實體主體使用0(CR+LF)標記,客戶端負責接收解碼,恢復編碼前的實體主體,讓瀏覽器逐步顯示。

03 前端HTTP協議(圖解HTTP) 之 HTTP報文內的HTTP資訊

5. 傳送多種資料的多部分物件集合(Multipart)

多部分物件集合(Multipart): 容納多份不同型別的資料,傳送的一份報文主體內科含有多型別實體。通常在圖片或文字檔案等上傳時使用。
相關首部欄位是Content-type,多部分物件集合包含的物件如下:

  • multipart/form-data: 在Web表單上傳時使用
  • multipart/byteranges: 狀態碼 206(Partial Content, 部分內容) 響應報文包含了多個範圍的內容時使用

6. 獲取部分內容的範圍請求

範圍請求(Range Request):如果下載一個較大的資源,但是到中途中斷,需要一種恢復機制,從之前的下載中斷處恢復下載。要實現該功能,需要指定下載的實體範圍。
例如請求一個10000位元組的圖片,分範圍獲取:

03 前端HTTP協議(圖解HTTP) 之 HTTP報文內的HTTP資訊

// 請求:
// 表示圖片的50001 - 10000 位元組( 5001- :表示5001到最後, -5000: 表示開始到5000位元組)
Range: bytes=5001-10000

// 響應:對於多重範圍的範圍請求, 響應會在首部欄位 ContentType 標明 multipart/byteranges 後返回響應報文
複製程式碼

7. 內容協商返回最合適的內容

內容協商機制(Content Negotiation):當一個Web網站存在多分相同內容的頁面(英文版和中文版),當瀏覽器預設語言為英文,則會顯示英文版。
內容協商會以響應資源的語言、字符集、編碼方式等作為基準。包含在請求報文中的某些欄位就是判斷基準:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

內容協商技術有三種方式:

  • 伺服器驅動協商:以請求的首部欄位為參考,在服務端自動處理(對於使用者來說,是以瀏覽器傳送的資訊為基準,不一定是最優的)
  • 客戶端驅動協商:使用者從瀏覽器顯示的可選擇列表中自動選擇。 還可以利用 JavaScript 指令碼在 Web 頁面上自動進行上述選 擇。
  • 透明協商:服務端驅動和客戶端啟動結合,由服務端可客戶端各自進行內容協商的一種方法

相關文章