HTTP協(xié)議之Chunked解析
來源:易賢網(wǎng) 閱讀:10717 次 日期:2015-02-06 15:43:10
溫馨提示:易賢網(wǎng)小編為您整理了“HTTP協(xié)議之Chunked解析”,方便廣大網(wǎng)友查閱!

網(wǎng)上使用Chunked編碼的網(wǎng)站似乎并不是很多,除了那些使用GZip壓縮的網(wǎng)站,例:google.com,還有就是大部分打開GZip壓縮的PHP論壇。

根據(jù)本人的理解,使用Chunked編碼的主要好處就在于一些程序的運(yùn)算出過程中,可以動態(tài)的輸出內(nèi)容。

例如,要在后臺處理一個小時的運(yùn)算,但又不希望用戶等一個小時才能看到結(jié)果。這時就可采用Chunked編碼將內(nèi)容分塊輸出,用戶隨時都可以接收到最新的處理結(jié)果。

ASP關(guān)閉了緩存的輸出模式,就是Chunked編碼的。(Response.Buffer = false)

而每一次的Response.Write,都是一個Chunked,所以不要使用的太頻繁哦,否則Chunk數(shù)量太多,額外的數(shù)據(jù)太浪費(fèi)空間了。

若想了解Chunked的具體編碼結(jié)構(gòu),用ASP關(guān)閉緩存調(diào)試蠻方便的。:)

我們先來看看RFC2616中對Chunked的定義:

Chunked-Body = *chunk

last-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)

我們來模擬一下數(shù)據(jù)結(jié)構(gòu):

[Chunk大小][回車][Chunk數(shù)據(jù)體][回車][Chunk大小][回車][Chunk數(shù)據(jù)體][回車][0][回車]

注意chunk-size是以十六進(jìn)制的ASCII碼表示的,比如86AE(實際的十六進(jìn)制應(yīng)該是:38366165),計算成長度應(yīng)該是:34478,表示從回車之后有連續(xù)的34478字節(jié)的數(shù)據(jù)。

跟蹤了的返回數(shù)據(jù),發(fā)現(xiàn)在chunk-size中,還會多一些空格??赡苁枪潭ㄩL度為7個字節(jié),不滿7個字節(jié)的,就以空格補(bǔ)足,空格的ASCII碼是0x20。

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

length := 0//用來記錄解碼后的數(shù)據(jù)體長度

read chunk-size, chunk-extension (if any) and CRLF//第一次讀取塊大小

while (chunk-size > 0) {//一直循環(huán),直到讀取的塊大小為0

read chunk-data and CRLF//讀取塊數(shù)據(jù)體,以回車結(jié)束

append chunk-data to entity-body//添加塊數(shù)據(jù)體到解碼后實體數(shù)據(jù)

length := length + chunk-size//更新解碼后的實體長度

read chunk-size and CRLF//讀取新的塊大小

}

read entity-header//以下代碼讀取全部的頭標(biāo)記

while (entity-header not empty) {

append entity-header to existing header fields

read entity-header

}

Content-Length := length//頭標(biāo)記中添加內(nèi)容長度

Remove "chunked" from Transfer-Encoding//頭標(biāo)記中移除Transfer-Encoding

有空再研究一下GZip+Chunked是如何編碼的,估計是每個Chunk塊進(jìn)行一次GZip獨(dú)立壓縮。

使用了Chunked,自然會在性能上稍微打點(diǎn)折扣,因為比正常的數(shù)據(jù)體多出了一些額外的消耗。

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

更多信息請查看IT技術(shù)專欄

更多信息請查看數(shù)據(jù)庫
易賢網(wǎng)手機(jī)網(wǎng)站地址:HTTP協(xié)議之Chunked解析
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機(jī)號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)