http協議中的tranfer-encoding
當不能預先確定報文體的長度時,不可能在頭中包含content-length域來指明報文體長度,此時就需要通過transfer-encoding域來確定報文體長度。
通常情況下,transfer-encoding域的值應當為chunked,表明採用chunked編碼方式來進行報文體的傳輸。chunked編碼是http/1.1 rfc裡定義的一種編碼方式,因此所有的http/1.1應用都應當支援此方式。
chunked編碼的基本方法是將大塊資料分解成多塊小資料,每塊都可以自指定長度,其具體格式如下(bnf文法):
chunked-body = *chunk //0至多個chunk
last-chunk //最後乙個chunk
trailer //尾部
crlf //結束標記符
chunk = chunk-size [ chunk-extension ] crlf
chunk-data crlf
chunk-size = 1*hex
last-chunk = 1*("0") [ chunk-extension ] crlf
chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size(octet)
trailer = *(entity-header crlf)
解釋:chunked-body表示經過chunked編碼後的報文體。報文體可以分為chunk, last-chunk,trailer和結束符四部分。chunk的數量在報文體中最少可以為0,無上限;每個chunk的長度是自指定的,即,起始的資料必然是16進製制數字的字串,代表後面chunk-data的長度(位元組數)。這個16進製制的字串第乙個字元如果是「0」,則表示chunk-size為0,該chunk為last-chunk,無chunk-data部分。可選的chunk-extension由通訊雙方自行確定,如果接收者不理解它的意義,可以忽略。
trailer是附加的在尾部的額外頭域,通常包含一些元資料(metadata, meta means "about information"),這些頭域可以在解碼後附加在現有頭域之後。
例項分析:
address 0.......................... f
000c0 31
000d0 66 66 63 0d 0a ............... // ascii碼:1ffc/r/n, chunk-data資料起始位址為000d5
很明顯,「1ffc」為第乙個chunk的chunk-size,轉換為int為8188.由於1ffc後馬上就是
020d0 .. 0d 0a 31 66 66 63 0d 0a .... // ascii碼:/r/n1ffc/r/n
前乙個0d0a是上乙個chunk的結束標記符,後乙個0d0a則是chunk-size和chunk-data的分隔符。
此塊chunk的長度同樣為8188, 依次類推,直到最後一塊
100e0 0d 0a 31
100f0 65 61 39 0d 0a...... //asii碼:/r/n/1ea9/r/n
100a0 30 0d 0a 0d 0a //ascii碼:0/r/n/r/n
「0」說明當前chunk為last-chunk, 第乙個0d 0a為chunk結束符。第二個0d0a說明沒有trailer部分,整個chunk-body結束。
解碼流程:
對chunked編碼進行解碼的目的是將分塊的chunk-data整合恢復成一塊作為報文體,同時記錄此塊體的長度。
rfc2616中附帶的解碼流程如下:(偽**)
length := 0 //長度計數器置0
read chunk-size, chunk-extension (if any) and crlf //讀取chunk-size, chunk-extension
//和crlf
while(chunk-size > 0 ) { //表明不是last-chunk
read chunk-data and crlf //讀chunk-size大小的chunk-data,skip crlf
read chunk-size and crlf //讀取新chunk的chunk-size 和 crlf
read entity-header //entity-header的格式為name:valuecrlf,如果為空即只有crlf
while (entity-header not empty) //即,不是只有crlf的空行
read entity-header
content-length:=length //將整個解碼流程結束後計算得到的新報文體length
//作為content-length域的值寫入報文中
remove "chunked" from transfer-encoding //同時從transfer-encoding中域值去除chunked這個標記
length最後的值實際為所有chunk的chunk-size之和,在上面的抓包例項中,一共有八塊chunk-size為0x1ffc(8188)的chunk,剩下一塊為0x1ea9(7849),加起來一共73353位元組。
注:對於上面例子中前幾個chunk的大小都是8188,可能是因為:"1ffc" 4位元組,"/r/n"2位元組,加上塊尾乙個"/r/n"2位元組一共8位元組,因此乙個chunk整體為8196,正好可能是傳送端一次tcp傳送的快取大小。
HTTP協議?HTTP協議中POST GET H
head to inde x.html not supported.invalid method in request head htp 1.1 apache 1.3.12 server at www.fudan.edu.cn port 80 關於實體頭部的內容還可以有 last modified ...
認識tcp ip協議中的http協議
一 什麼是tcp ip tcp ip協議是乙個協議集合,按照層次分為鏈路層 網路層 傳輸層 應用層四個層次。與tcp ip協議並列的還有osi網路框架模型 開放式系統互連參考模型,分為物理層 資料鏈路層 網路層 傳輸層 會話層 表示層 應用層七個層次 1.鏈路層 用來處理連線網路的硬體部分,包括控制...
HTTP 協議中的 cookie
cookie 是儲存在瀏覽器某個檔案中的一段key value字串 服務端下發響應時,可以在響應頭加上set cookie key value,告訴瀏覽器,需要儲存哪些cookie 瀏覽器在傳送請求時,會將此域下的所有cookie字串,放在http請求header中的cookie欄位中,隨請求傳送給...