click –> 帶着問題學習~
前面介紹了報文的整體結構,這篇重心放在報文的頭部。
1. 報文
用於HTTP協議交互的信息叫做報文
- 請求報文:由客戶端發出的HTTP報文。
- 響應報文:由服務端返回的HTTP報文。
請求報文:
響應報文:
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腳本在頁面自動選擇。 - 透明協商
服務端和客戶端驅動的結合體。由服務端和客戶端各自進行協商的一種方法。