天天看點

第3章 HTTP封包内的HTTP資訊(1)封包頭部、壓縮傳輸的内容編碼、Multipart

click –> 帶着問題學習~

前面介紹了封包的整體結構,這篇重心放在封包的頭部。

1. 封包

用于HTTP協定互動的資訊叫做封包
  • 請求封包:由用戶端發出的HTTP封包。
  • 響應封包:由服務端傳回的HTTP封包。

請求封包:

第3章 HTTP封包内的HTTP資訊(1)封包頭部、壓縮傳輸的内容編碼、Multipart

響應封包:

第3章 HTTP封包内的HTTP資訊(1)封包頭部、壓縮傳輸的内容編碼、Multipart

2. 請求封包和響應封包的頭部内容組成

  • 請求行:方法名、協定、協定版本、狀态碼、簡短的解釋語。
  • 響應行:協定、協定版本、狀态碼、簡短的解釋語。
  • 頭部字段
  • 其他:可能包含HTTP RFC 裡維定義的頭部。(

    cookie

3.編碼提升傳輸速率

  • 封包主體和實體主體的差異

    HTTP封包的主體用于請求傳輸和響應的實體主體。

    通常封包主體等于實體主體。隻有當傳輸中進行編碼操作時,實體主體才會發生響應的變化,導緻兩者産生差異。

    (1)什麼是封包主體(message)?

    封包主體就是HTTP傳輸資訊中的主體部分,是HTTP通信的基本機關,由8位組位元組流組成。通過HTTP通信傳輸。

    (2)什麼是實體主體(entity)?

    實體主體作為請求和響應的有效載荷資料被傳輸。

4.壓縮傳輸的内容編碼

(1)什麼是内容編碼?

内容編碼指明應用在實體内容上的編碼格式,并把實體内容原樣壓縮。内容編碼後的實體由用戶端接收負責解碼。
           

(2)常用的編碼格式

- gzip (GUN zip)
- compress (UNIX 系統的标準壓縮)
- deflate (zlib)
- identity (不進行編碼)
           

(3)分塊傳輸編碼

  • 由于請求的編碼實體資源未全部接收完成之前,浏覽器不會顯示請求的頁面。在請求大量資料時,将資料分塊傳輸,能夠讓浏覽器逐漸的顯示頁面。這種把實體分塊的編碼叫做分塊傳輸編碼。
  • 分塊傳輸編碼會将實體主體分為多塊,每塊用16進制來标記塊的大小,結尾用

    0+ 換行

    标記。
  • 使用分塊傳輸編碼會在用戶端對實體主體進行解碼。

5.發送多種資料的多部分對象集合

發送一份封包可以包含多類型實體。多用于檔案的上傳。
           

多部分集合包含的對象如下;

  • multipart/form-data
    web表單上傳時使用
               
  • multipart/byteranges
    響應封包包含了多個範圍時使用
               

6.擷取部分内容的範圍請求

斷點續傳

要實作該功能需要制定下載下傳的實體範圍,這種制定範圍發送請求叫做範圍請求。
針對範圍請求,伺服器會傳回狀态碼為206的封包,多重範圍請求 響應會在頭部 Content-Type 表明 multipart-byteranges 傳回封包主體。如果服務端不支援範圍請求則傳回狀态碼200 OK并将所有封包一并傳回。
執行範圍時會使用頭部字段 Range 來指定資源 byte 的範圍。
Range格式:
5001-10000位元組
Range : byte = 5001-10000
5000之後的
Range : byte = 5001-
0-3000位元組,5001-10000位元組
Range : byte=-3000,5001-10000
           

7.内容協商傳回最合适的内容(類似于 Android 的國際化)

實作内容協商有三種方式:

  • 伺服器啟動協商

    以請求的頭部字段作為參考在服務端自動處理

    頭部字段
    Accpet
    Accpet-Charset
    Accpet-Encoding
    Accpet-Language
    Conent-Language
               
  • 用戶端驅動協商

    使用者從浏覽器的可選清單中手動選擇,還可以用JavaScript腳本在頁面自動選擇。

  • 透明協商

    服務端和用戶端驅動的結合體。由服務端和用戶端各自進行協商的一種方法。