首頁  >  文章  >  web前端  >  HTTP協定之Chunked解析

HTTP協定之Chunked解析

黄舟
黄舟原創
2016-12-16 10:06:513356瀏覽

網路上使用Chunked編碼的網站似乎不是很多,除了那些使用GZip壓縮的網站,例如:google.com,還有大部分打開GZip壓縮的php論壇。

根據本人的理解,使用Chunked編碼的主要好處就在於一些程式的運算出過程中,可以動態的輸出內容。
例如,要在後台處理一個小時的運算,但又不希望使用者等一個小時才能看到結果。這時就可採用Chunked編碼將內容分塊輸出,使用者隨時都可以接收到最新的處理結果。
asp關閉了快取的輸出模式,就是Chunked編碼的。 (Response.Buffer = false)
而每一次的Response.Write,都是一個Chunked,所以不要使用的太頻繁哦,否則Chunk數量太多,額外的數據太浪費空間了。
若想了解Chunked的具體編碼結構,用ASP關閉快取調試蠻方便的。 :)

我們先來看看RFC2616中對Chunked的定義:
Chunked-Body = *chunk
last-chunk
trailer
CRLF

chunk = chunk-size [ chunk-extension ] CRLF-extension ] CR3 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)

我們來模擬一下資料結構:

[Chunk大小][回車][Chunk資料體][回車][Chunk大小][回車][Chunk資料體][回車][0][Enter]


注意chunk-size是以十六進位的ASCII碼表示的,例如86AE(實際的十六進位應該是:38366165),計算成長度應該是:34478,表示從回車之後有連續的34478位元組的資料。

追蹤了www.yahoo.com的回傳數據,發現在chunk-size中,還會多一些空格。可能是固定長度為7個字節,不滿7個字節的,就以空格補足,空格的ASCII碼是0x20。


以下是解碼過程的偽代碼:

length := 0//用來記錄解碼後的資料體長度

read chunk-size, chunk-extension (if any) and CRLF//第一次讀取區塊大小
while (chunk-size > 0) {//一直循環,直到讀取的區塊大小為0
read chunk-data and CRLF//讀取區塊資料體,以回車結束
append chunk-data to entity- body//新增區塊資料體到解碼後實體資料
length := length + chunk-size//更新解碼後的實體資料
read chunk-size and CRLF//讀取新的區塊大小
}
read entity- header//以下程式碼讀取全部的頭標記
while (entity-header not empty) {
append entity-header to existing header fields
read entity-header
}
Content-Length := length//頭標記中新增內容長度
Remove "chunked" from Transfer-Encoding//頭標記中移除Transfer-Encoding

有空再研究一下GZip+Chunked是如何編碼的,估計是每個Chunk塊進行一次GZip​​獨立壓縮。


使用了Chunked,自然會在效能上稍微打點折扣,因為比正常的數據體多出了一些額外的消耗。

但是有些情況下,必需要使用分塊輸出,這也是不得已而為之.


 以上就是HTTP協議之Chunked解析的內容,更多相關文章請關注PHP中文網(www.php.cn)! 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn