chunk

时间:2024-08-18 04:01:55编辑:优化君

chunked是什么意思

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"),这些头域可以在解码后附加在现有头域之后。
实例分析:
下面分析用ethereal抓包使用Firefox与某网站通信的结果(从头域结束符后开始):
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后马上就是
CRLF,因此没有chunk-extension.chunk-data的起始地址为000d5, 计算可知下一块chunk的起始
地址为000d5+1ffc + 2=020d3,如下:
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
此块长度为0x1ea9 = 7849, 下一块起始为100f5 + 1ea9 + 2 = 11fa0,如下:
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
append chunk-data to entity-body //将此块chunk-data追加到entity-body后
read chunk-size and CRLF //读取新chunk的chunk-size 和 CRLF
}
read entity-header //entity-header的格式为name:valueCRLF,如果为空即只有CRLF
while (entity-header not empty) //即,不是只有CRLF的空行
{
append entity-header to existing header fields
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发送的缓存大小。


chunks是什么意思

chunks高中四级六级考研雅思托福GRE反馈大块常用释义英/tʃʌŋks /美/tʃʌŋks /常用影视原声n.大块 ; 矮胖的人或物 ; (chunk的复数) chunk中考高考四级六级考研近6年出现3次重要程度100%n.相当大的部分(或数量)必背考点真题例句变形原形chunk短语blow chunks呕, 呕吐例句Breaking down problems into bite-sized chunks and using code to solve them becomes normal.把问题分解为多个小的问题,然后用代码解决这些小问题,这种方式成了常态。影视原声And her hands were like two frozen chunks of tundra. I took some cold medicine to… I took cold medicine.她的手又冰又糙,像两大块冻土。然后我吃了点感冒药,就...我吃了感冒药。—《生活大爆炸 第十季》

Chunked 什么意思

"chunked"是指被切成了大块状,在此作动词"verb"用,是"chunk" 的过去式。

chunk(noun.)

1. a large, short, thick piece of something that does not have an even shape; as of meat or wood (大块(没有固定形状的块体);常用于木头或肉)
e.g. a chunk of bread / chunks of bread ; chunk of meat.
Chunk of ice that broke off was the size of rhode island.

2. a large part or amount of something; a considerable portion (大量的)
e.g. Below is the code listing where the device is nothing but an 80 byte chunk of memory. (足足80byte的记忆量)
The rent takes a large chunk out of my monthly salary.(租金占用了我这个月大部分的工资)
A huge chunk of the audience. (相当一大部分的观众)
A sizeable chunk of the report. (很大一部分的报告)

3. a stocky animal, esp. a horse (结实的动物,常用于马;结实的马的别称。)

4. A chunk of change (american english informal:a large amount of money.)
(非正式的美式英文,意指大量的金钱)
e.g. Lurie risked a pretty big chunk of change(很多钱) on the race.


chunk


上一篇:特朗普拜登第二次辩论

下一篇:中国航天二院