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 ...