Http協議 3 HTTP實體和編碼

2021-06-26 06:05:42 字數 3820 閱讀 8377

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=***xx

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首部實現

驗證碼:

.弱驗證碼

.強驗證碼

強驗證碼能唯一標識乙個例項

八、範圍請求

HTTP協議3 HTTP請求方法

根據http標準,http請求可以使用多種請求方法。http1.0定義了三種請求方法 get,post 和 head方法。http1.1新增了五種請求方法 options,put,delete,trace 和 connect 方法。序號 方法描述 1get 請求指定的頁面資訊,並返回實體主體。2he...

HTTP協議基礎 3 HTTP訊息

http基於客戶端 伺服器體系結構模型和無狀態請求 響應協議,該協議通過可靠的tcp ip連線交換訊息來執行。本篇就來學習http訊息,可以說請求是乙個訊息,響應也是這個訊息。通過學習http訊息,接下來學習http請求和響應會更順利一些。http 客戶端 是為了傳送乙個或多個http請求訊息而與伺...

網路協議分析3 HTTP

在瀏覽器輸入url,回車以後發生了什麼?第一,找到伺服器 第二,建立tcp連線 第三,建立http連線 第四,斷開tcp連線 客戶端和伺服器端的通訊遵守了http協議,自然需要封裝http報文 http請求報文 請求行 方法 get post url 版本 1.1 http協議的請求方法有 get ...