標籤:結果 分組 發送資料 tac rom ica 請求 沒有 hex
分塊傳輸編碼(Chunked transfer encoding)是超文字傳輸通訊協定 (HTTP)(HTTP)中的一種傳輸資料機制,同意HTTP由應用server發送給client應用( 一般是網頁瀏覽器)的資料能夠分成多個部分。分塊傳輸編碼僅僅在HTTP協議1.1版本號碼(HTTP/1.1)中提供。
通常,HTTP應答訊息中發送的資料是整個發送的。Content-Length訊息頭欄位表示資料的長度。資料的長度非常重要,由於client須要知道哪裡是應答訊息的結束,以及興許應答訊息的開始。然而,使用分塊傳輸編碼,資料分解成一系列資料區塊,並以一個或多個塊發送,這樣server能夠發送資料而不須要預Crowdsourced Security Testing道發送內容的總大小。
通常資料區塊的大小是一致的。但也不總是這樣的情況。
HTTP 1.1引入分塊傳輸編碼提供了下面幾點優點:
- HTTP分塊傳輸編碼同意server為動態產生的內容維持HTTP持久串連。通常,持久連結須要server在開始發送訊息體前發送Content-Length訊息頭欄位,可是對於動態產生的內容來說。在內容建立完之前是不可知的。[動態內容,content-length無法預知]
- 分塊傳輸編碼同意server在最後發送訊息頭欄位。
對於那些頭欄位值在內容被產生之前無法知道的情形非常重要。比如訊息的內容要使用散列進行簽名,散列的結果通過HTTP訊息頭欄位進行傳輸。
沒有分塊傳輸編碼時,server必須緩衝內容直到完畢後計算頭欄位的值並在發送內容前發送這些頭欄位的值。[散列簽名,需緩衝完畢才幹計算]
- HTTPserver有時使用壓縮 (gzip或deflate)以縮短傳輸花費的時間。分塊傳輸編碼能夠用來分隔壓縮對象的多個部分。在這樣的情況下,塊不是分別壓縮的,而是整個負載進行壓縮,壓縮的輸出使用本文描寫敘述的方案進行分塊傳輸。在壓縮的情形中,分塊編碼有利於一邊進行壓縮一邊發送資料,而不是先完畢壓縮過程以得知壓縮後資料的大小。[gzip壓縮。壓縮與傳輸同一時候進行]
普通情況HTTP的Header包括Content-Length域來指明報文體的長度。有時候服務產生HTTP回應是無法確定訊息大小的,比方大檔案的下載,或者後台須要複雜的邏輯才幹所有處理頁面的請求,這時用須要即時產生訊息長度。server一般使用chunked編碼。
在進行Chunked編碼傳輸時。在回複訊息的Headers有transfer-coding域值為chunked,表示將用chunked編碼傳輸內容。
使用chunked編碼的Headers例如以下(能夠利用FireFox的FireBug外掛程式或HttpWatch查看Headers資訊):
採用下面方式編碼:
Chunked-Body=*chunk
"0"CRLF
footer
CRLF
chunk=chunk-size[chunk-ext]CRLF
chunk-dataCRLF
hex-no-zero=<HEXexcluding"0">
chunk-size=hex-no-zero*HEX
chunk-ext=*(";"chunk-ext-name["="chunk-ext-value])
chunk-ext-name=token
chunk-ext-val=token|quoted-string
chunk-data=chunk-size(OCTET)
footer=*entity-header
編碼使用若干個Chunk組成。由一個標明長度為0的chunk結束,每一個Chunk有兩部分組成,第一部分是該Chunk的長度和長度單位(一般不 寫),第二部分就是指定長度的內容。每一個部分用CRLF隔開。在最後一個長度為0的Chunk中的內容是稱為footer的內容。是一些沒有寫的頭部內 容。 下面給出一個Chunked的解碼過程(RFC文檔中有)
length:=0
readchunk-size,chunk-ext(ifany)andCRLF
while(chunk-size>0){
readchunk-dataandCRLF
appendchunk-datatoentity-body
length:=length+chunk-size
readchunk-sizeandCRLF
}
readentity-header
while(entity-headernotempty){
appendentity-headertoexistingheaderfields
readentity-header
}
Content-Length:=length
Remove"chunked"fromTransfer-Encoding
HTTP協議之chunk編碼(分塊傳輸編碼)