返回列表 发新帖

http协议之chunked解析

194.3k 8
swmozowtfl 发表于 2015-7-10 20:44:48|湖北 | 查看全部 阅读模式
网上使用chunked编码的网站似乎并不是很多,除了那些使用gzip压缩的网站,例:google.com,还有就是大部分打开gzip压缩的php论坛。
- y' y$ m- w6 Z根据本人的理解,使用chunked编码的主要好处就在于一些程序的运算出过程中,可以动态的输出内容。3 m6 C5 i- E: f5 Q. |* |& ~
例如,要在后台处理一个小时的运算,但又不希望用户等一个小时才能看到结果。这时就可采用chunked编码将内容分块输出,用户随时都可以接收到最新的处理结果。0 o# A. N0 w! Q& C
asp关闭了缓存的输出模式,就是chunked编码的。(response.buffer = false)
5 g2 f) }( X! i1 \3 a而每一次的response.write,都是一个chunked,所以不要使用的太频繁哦,否则chunk数量太多,额外的数据太浪费空间了。
  s; i' W4 K/ I6 x若想了解chunked的具体编码结构,用asp关闭缓存调试蛮方便的。:)
' e- s$ O6 d# |: F我们先来看看rfc2616中对chunked的定义:) o9 i$ t2 }% |) e; S& S% E/ c
chunked-body = *chunk. {7 e; B' R- p. y! S. R5 X/ b
last-chunk; [' v- E& p# l. j6 u0 J1 p
trailer
. }5 x7 @0 T  ?: z! f2 W9 acrlf
4 F) k3 v% }3 u, g8 cchunk = chunk-size [ chunk-extension ] crlf  _5 _/ w/ H' f; m3 O* e4 G
chunk-data crlf6 [" X1 s3 F8 m# I) y1 L4 n6 x8 P# E
chunk-size = 1*hex
* D4 z2 B& S% m6 y+ j/ l; |+ [last-chunk = 1*(0) [ chunk-extension ] crlf
( U5 P- q, I  l8 f9 m5 o- Xchunk-extension= *( ; chunk-ext-name [ = chunk-ext-val ] )
+ M) Y4 I; c6 `8 x8 O0 Ichunk-ext-name = token
2 P$ U8 M4 W. Y* F+ r4 vchunk-ext-val = token | quoted-string
, x% J. o! N/ t6 ichunk-data = chunk-size(octet)
, N. p! X, r. dtrailer = *(entity-header crlf)
' A8 g& i0 t) l& s2 P* |0 N0 e: {我们来模拟一下数据结构:
& K; u. R: }: Q[chunk大小][回车][chunk数据体][回车][chunk大小][回车][chunk数据体][回车][0][回车]. [. O" ]/ n  N1 K* G$ o2 B
注意chunk-size是以十六进制的ascii码表示的,比如86ae(实际的十六进制应该是:38366165),计算成长度应该是:34478,表示从回车之后有连续的34478字节的数据。
# U+ {, L0 C1 g- c跟踪了的返回数据,发现在chunk-size中,还会多一些空格。可能是固定长度为7个字节,不满7个字节的,就以空格补足,空格的ascii码是0x20。
$ X" I1 ]# E3 W' a以下是解码过程的伪代码:
' b/ n6 }( W4 olength := 0//用来记录解码后的数据体长度" I! d8 n/ t3 v
read chunk-size, chunk-extension (if any) and crlf//第一次读取块大小: I9 Y$ N( p& s$ [5 l, F$ e$ C2 ?- {
while (chunk-size > 0) {//一直循环,直到读取的块大小为0: S  x' E8 l4 c9 c6 J. w; \9 c7 t
read chunk-data and crlf//读取块数据体,以回车结束
% i  h6 |: `4 n" y2 Pappend chunk-data to entity-body//添加块数据体到解码后实体数据
( V! ~$ w: P, ]% }8 m; ?length := length + chunk-size//更新解码后的实体长度
# Q8 I; f) z' j! Cread chunk-size and crlf//读取新的块大小7 e$ g7 \' }' t
}
/ [- |' v$ P( |: l8 Yread entity-header//以下代码读取全部的头标记# q, A/ @" n# b0 D3 G" b( ~; O
while (entity-header not empty) {
/ ~9 [# M- _" Y+ O8 s4 p2 pappend entity-header to existing header fields0 W/ J2 l% t2 B+ A: ^9 f- u
read entity-header9 z& p: ?* ?8 G- q  l. D' }- h
}  C1 a8 W6 @+ C4 {8 m) v7 y6 r' Q; q2 f" s
content-length := length//头标记中添加内容长度
9 C9 o$ l3 C; `0 R3 _/ rremove chunked from transfer-encoding//头标记中移除transfer-encoding  `1 T' Z. l! B# L" D' j
有空再研究一下gzip+chunked是如何编码的,估计是每个chunk块进行一次gzip独立压缩。
# \% N, t6 L+ [8 R7 r使用了chunked,自然会在性能上稍微打点折扣,因为比正常的数据体多出了一些额外的消耗。
" Z. A  y$ E8 ?3 _! g0 y$ v" Y4 i8 O% I5 @' R但是有一些情况下,必需要使用分块输出,这也是不得已而为之.0 b. E* N4 a* Z# \
! ?# g# F( j! i6 \- k
更多网页制作信息请查看: 网页制作

回复|共 8 个

gevaemaidovef 发表于 2016-3-24 15:23:38|Reserved | 查看全部
楼猪.重量级人物阿.
Mqokjdvq 发表于 2016-3-24 15:24:17|加拿大 | 查看全部
笨点也好~~~~
seazvyt 发表于 2016-3-24 15:24:19|英国 | 查看全部
我又回复了
tohme 发表于 2016-3-24 15:24:27|韩国 | 查看全部
cd:遮~~~~~~
tohme 发表于 2016-4-1 11:59:35|美国 | 查看全部
这话从何说起那~~~
buingeEvineus 发表于 2016-4-1 11:59:36|美国 | 查看全部
唉!猪!你怎么了?
GoodyFouppy 发表于 2016-4-1 12:00:15|美国 | 查看全部
这就是我斗胆的一点粗略分析,每天睡觉以前,我都会把您的帖子再三拜读,拜读。
bqtklouu 发表于 2016-4-1 12:00:44|美国 | 查看全部
你该这么说~~

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表