HTTP報文與實體
報文:HTTP通信的基本單位,由字節流組成
實體:請求或者響應的有效載荷數據,由實體首部和實體主題組成。
一般來說,實體主體作爲HTTP報文的主體進行傳輸。
內容編碼
在實體進行傳輸前,先將實體進行編碼,然後在進行傳輸。常見的內容編碼有:
- gzip(GNU zip)
- compress(UNIX系統的標準壓縮)
- deflate(zlib)
- identity(不進行編碼)
- 在實體首部字段中,Content-Encoding會告知客戶端服務器對實體的主體部分選用的編碼方式
- 對實體進行內容編碼傳輸時,不能再使用Content-Length首部字段
傳輸編碼
在HTTP通信過程中,請求的編碼實體資源尚未全部傳輸完成之前,瀏覽器無法顯示請求頁面。在傳輸大量數據時,通過把數據分割成多塊,能夠讓瀏覽器逐步顯示頁面。這種把實體主題分塊的功能稱爲分塊傳輸編碼。
- 用於服務器動態創建內容,無法知道主體的大小,通過分塊來判斷是否傳輸完畢。
- 分塊傳輸編碼會將實體分爲多個部分(塊)。每一塊都會用十六進制來標記塊的大小,而實體的最後一塊會使用“0(CR+LF)”來標記。
- 首部字段Transfer-Encoding規定了傳輸報文主體時採用的編碼方式。HTTP/1.1的傳輸編碼方式僅對分塊編碼有效。
- Trailer會事先說明在報文主體後(分塊長度爲0)記錄了哪些首部字段,應用於分塊編碼時。
總結
- 內容編碼是在傳輸前進行的,一般是爲了對實體主體進行壓縮
- 傳輸編碼是在傳輸的過程中進行編碼,在內容編碼的基礎上,可以繼續對實體主體進行傳輸編碼,使其可以分塊傳輸,也可以不進行分塊傳輸編碼直接一次性進行完整傳輸
在網上看到一個回答非常好,粘貼到此處幫助讀者更好地去理解http內容編碼和傳輸編碼的區別和作用?
參考文獻
-
《圖解HTTP》