HTTP協議中的Tranfer Encoding

2021-05-18 07:46:57 字數 3020 閱讀 3792

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欄位中,隨請求傳送給...