Http協議(3)—HTTP實體和編碼
HTTP實體實現目標
.可以被正確識別(通過Content-Type和Content-Launage)
.可以被正確解包(通過Content-Lenght首部和Content-Encoding首部)
.是最新的(通過實體驗證碼和緩存過期控制)
.符合用戶需要(基於Accept系列的內容協商首部)
.在網絡上可以快速有效的傳輸(通過範圍請求、差異編碼以及其他數據壓縮方法)
.完整到達、未被篡改(通過傳輸編碼首部和Content-MD5校驗和首部)
一、報文是箱子,實體是貨物
1.HTTP基本實體首部
.Content-Type
實體所承載對象的類型
.Content-Length
實體主體的長度或大小
.Content-Launage
與所傳送實體最相配的語言
.Content-Encoding
實體數據是不是已經被壓縮
.Content-Location
備用位置
.Content-Range
如果這是部分實體,則說明它是整體的哪部分
.Content-MD5
實體主體內容的校驗和
.Last-Modified
所傳輸的內容在服務器上創建或最後修改的日期
.Expires
實體數據將要失效的日期
.Allow
該資源所允許的各種請求方法,例如,GET、Post等
.ETag
這份文檔特定實例的唯一驗證碼
.Cache-Control
應該如何緩存該文檔
2.實體主體
二、Content-Length:實體的大小
1.檢測截尾
客戶端需要通過Content-Length來檢測報文結尾以區分到底是報文結束時正常的連接關閉
還是報文傳輸時服務器崩潰而導致的連接關閉
緩存代理服務器不會爲沒有Content-Length首部的HTTP主題作緩存
2.錯誤的Content-Length
3.Content-Length與持久連接
因爲持久連接,客戶端無法通過連接關閉來判斷報文是否結束,故必須帶有Content-Length
首部.
但是當分塊編碼時可以沒有Content-Length首部,因爲數據分爲一系列的塊來傳送,每塊都
有大小說明
4.內容編碼
如果對主體進行了內容編碼(壓縮),則Content-Length就是編碼後的主體的長度
5.確定實體主體長度的規則
a.如果特定的HTTP報文類型不允許帶有主體,就忽略Content-Length首部
b.如果報文中含有描述傳輸編碼的Transfer-Encoding,那實體就由一個稱爲零字節塊的
特殊模式結束
c.如果報文中含有Content-Length首部,而沒有Transfer-Encoding首部,那麼Content-
Length的值就是主體的長度,如果兩者皆有,則應該忽略Content-Length的值
d.如果報文使用了multipart/byteranges媒體類型,並且沒有用Content-Length首部指定
實體主體長度,那麼多部分報文的每個部分都要說明自己的大小
e.如果以上規則均無法匹配,則就在連接關閉的時候結束
三、實體摘要 發送方在生成初始主體時,生成一個數據校驗和,接收方可以通過檢查這個校驗和來捕獲所有
意外的實體修改
服務器使用Content-MD5首部發送對實體主體運行MD5算法
四、媒體類型和字符集
Content-Type指明的是原始主體的媒體類型
1.文本的字符編碼
Content-Type:text/html; charset=xxxxx
2.多部分媒體類型
3.多部分表格提交
Content-Type:multipart/form-data; boundary=[abcdefg......]
boundary表明分隔主題中不同部分所用的字符串
4.多部分範圍響應
Content-Type:multipart/byteranges
五、內容編碼
1.過程
a.網站服務器生成原始響應報文,其中有原始的Content-Type和Content-Length首部
b.內容編碼服務器創建編碼後的報文,並增加Content-Encoding首部,以便接受的應用程序
進行解碼
c.接收程序得到編碼後的報文,進行解碼,獲得原始報文
2.內容編碼類型
3.Accept-Encoding首部
客戶端會把自己能夠識別的編碼列表放在Accept-Encoding首部裏發出去,如果http請求中
沒有包含首部,則表示客戶端可以接受任何編碼方式
六、傳輸編碼和分塊編碼
傳輸編碼與內容編碼的區別:
經過內容編碼的報文只是對報文的實體部分進行編碼,而對於經過傳輸編碼的報文,編碼
作用在整個報文上,報文自身的結構發生了變化
使用傳輸編碼(Transfer-encoding)是爲了改變報文中的數據在網絡上的傳輸方式
1.可靠傳輸
傳輸報文會引發的問題
.未知的尺寸
有些網關應用程序或則內容編碼器要想知道報文的大小,這時可以採用傳輸編碼來發
送數據,並用特別的結束腳註表明數據結束
.安全性
可以用傳輸編碼把報文內容擾亂,然後在共享的傳輸網絡上發送
2.Transfer-Encoding
.Transfer-Encoding:
告知接收方爲了可靠的傳輸報文,已經對其進行了何種編碼
.TE:
用在請求首部,告知服務器可以使用哪些傳輸編碼
3.分塊編碼
.把報文分割爲若干大小已知的塊,塊之間是緊挨着發送的
.分塊編碼是一種傳輸編碼,是報文的屬性,而不是主體的屬性
3.1.分塊與持久連接
.若客戶端與服務器不是持久連接,則服務端不需要知道它正在讀取的主體的長度,只需
要讀到服務器關閉主體連接爲止
.服務器在寫主體之前必須知道主體的大小,如果服務器動態創建內容,就無法知道長度,
分塊編碼只要服務器逐塊發出並且說明每塊大小即可,服務器可以用大小爲0的塊作爲
主體結束的信號
3.2.分塊報文的拖掛
4.內容編碼與傳輸編碼的結合
5.傳輸編碼規則
.傳輸編碼集合中必須包含分塊,唯一的例外是使用關閉連接來結束報文
.當使用分塊傳輸編碼時,它必須是最後一個作用在報文中主體之上的
.分塊傳輸編碼不能多次作用到一個報文主體之上
以上規則使得接收方能確定報文的長度
七、驗證碼與新鮮度
1.新鮮度
.服務器告知客戶端能夠將內容緩存多長時間,在這個時間之內是新鮮的
.可以用Expires首部或者Cache-Control
2.有條件的請求和驗證碼
有條件的請求:
.當資源改變時才請求副本
.通過If-Modified-Since首部實現
驗證碼:
.弱驗證碼
.強驗證碼
強驗證碼能唯一標識一個實例
八、範圍請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.