HTTP實體和編碼

實體和編碼

每天都有數以億計的各種媒體對象經由HTTP傳送,如圖像,文本,影片以及軟件程序等。HTTP會確保它的報文被正確的傳送,識別,提前以及適當的處理,則需要滿足以下條件。
1. 可以被正確的識別(通過Content-Type首部說明媒體格式,Content-Language首部說明語言),以便瀏覽器和其他客戶端能夠正確的處理內容
2. 可以被正確的解包(通過Content-Length首部和Content-Encoding首部)
3. 是最新的(通過實體驗證碼和緩存過期控制)
4. 符合用戶的需要(基於Accept系列的內容協商首部)
5. 在網絡上可以快速有效地傳輸(通過範圍請求,差異編碼以及其他數據壓縮方法)
6. 完整到達,未被篡改過(通過傳輸編碼首部和Content-MD5校驗和首部)

爲了實現上述目標,HTTP/1.1版本定義了以下10個基本實體首部字段。
- Content-Type
- Content-Length
- Content-Language
- Content-Encoding
- Content-Location
- Content-Range
- Content-MD5
- Last-Modified
- Expires
- Allow
- Etag
- Cache-Control

Content-Length:實體的大小

Content-Length首部指示出報文中編碼後實體主體的字節大小。使用Content-Length首部是爲了能夠檢測出服務器崩潰而導致的報文截尾,並對共享持久連接的多個報文進行正確的分段。

Content-Length首部對於持久連接是必不可少的,如果響應通過持久連接傳輸,就可能有另一條HTTP響應緊隨其後。客戶端通過Content-Length首部就可以知道報文在何處結束,下一條報文從何處開始。因爲連接是持久的,客戶端無法依賴連接關閉來判別報文的結束。

在使用分塊編碼(chunked encoding)時,可以沒有Content-Length,此時,數據是分爲一系列的塊來發送的,每塊都有大小說明。

HTTP/1.1規範中建議對於帶有主體但沒有Content-Length首部的請求,服務器如果無法確定報文的長度,就應當發送400 Bad Request響應或411 Length Required響應,後一種表明服務器要求收到正確的Content-Length首部。

實體摘要

爲檢測實體主體的數據是否被修改過,發送方可以在生成初始的主體時,生成一個數據的校驗和。Content-MD5首部是在對內容作了所有需要的內容編碼之後,還沒做任何傳輸編碼之前,計算出來的。

媒體類型和字符集

Content-Type首部字段說明了實體主體的MIME類型,同時還支持可選的參數來進一步說明內容的類型。
Content-Type: text/html; charset=iso-8859-4

多部分媒體類型
MIME中的multipart電子郵件報文中包含多個報文,它們合在一起作爲單一的複雜報文發送。每一部分都是獨立的,有各自的描述其內容的集,不同的部分之間用分界字符串連接在一起。
HTTP也支持多部分主體。不過,通常只用在下列兩種情形之一:提交填寫好的表格,或是作爲承載若干文檔片段的範圍響應。
HTTP使用Content-Type:multipart/form-data或Content-Type:multipart/mixed這樣的首部以及多部分主體來發送這種請求。

內容編碼 Content-Encoding

HTTP應用程序有時在發送之前需要對內容進行編碼,當內容經過編碼之後,編好碼的數據就防止實體主體中,像往常一樣發送給接收方。此時Content-Length變爲編碼後的長度。
同時,我們不希望服務器用客戶端無法解碼的方式來對內容進行編碼,因此,客戶端需要把自己能夠支持的內容編碼列表防止請求的Accept-Encoding首部。

傳輸編碼和分塊編碼 Transfer-Encoding

使用傳輸編碼是爲了改變報文中的數據在網絡上傳輸的方式。

分塊編碼
分塊編碼是HTTP規範唯一定義的傳輸編碼方式。
分塊編碼把報文分割爲若干個大小已知的塊。塊之間是緊挨着發送的,這樣就不需要在發送之前就知道整個報文的大小了。

範圍請求 Range

範圍請求是指客戶端實際上只請求文檔的一部分,或者說某個範圍。比如,下載電影下到一半網絡故障,連接中斷了,此時可利用範圍請求來繼續下載。
Range: bytes=4000-
代表客戶端請求的是文檔開頭4000字節以後的步伐內容。

Range首部在流行的點對點(Peer-to-Peer)文件共享客戶端軟件中得到廣泛的應用,他們從不同的對等實體同時下載多媒體文件的不同部分。

差異編碼

差異編碼是HTTP協議的一個擴展,它通過交換對象改變的部分而不是完整的對象來優化傳輸性能。

請求報文

A-IM: diffe   //Accept-Instance-Manipulation
If-None-Match: ababdisdksada //驗證是否新鮮

響應報文

IM:diffe //差異編碼的算法
Etag: zdsdsfsafsd  //更新後的版本號
Delta-base: ababdisdksada //差異算法基於的Etag
發佈了49 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章