返回列表 发新帖

http协议之chunked解析

194.8k 8
swmozowtfl 发表于 2015-7-10 20:44:48|湖北 | 查看全部 阅读模式
网上使用chunked编码的网站似乎并不是很多,除了那些使用gzip压缩的网站,例:google.com,还有就是大部分打开gzip压缩的php论坛。' z% U' Q( @3 @  `. q; Q3 O8 ]
根据本人的理解,使用chunked编码的主要好处就在于一些程序的运算出过程中,可以动态的输出内容。/ p: r" K9 E- S
例如,要在后台处理一个小时的运算,但又不希望用户等一个小时才能看到结果。这时就可采用chunked编码将内容分块输出,用户随时都可以接收到最新的处理结果。' ~) Y+ I/ d' b0 k; E) p! h& V
asp关闭了缓存的输出模式,就是chunked编码的。(response.buffer = false): ^# x1 |" M+ x7 Y
而每一次的response.write,都是一个chunked,所以不要使用的太频繁哦,否则chunk数量太多,额外的数据太浪费空间了。# o. B& U4 E( i, \
若想了解chunked的具体编码结构,用asp关闭缓存调试蛮方便的。:)5 M* N6 m' {" I% ^! F) L* a6 X
我们先来看看rfc2616中对chunked的定义:
, Q. d' |; a+ I' `' ?chunked-body = *chunk
/ _% D4 g0 p  m# R" Q9 A2 g2 ~- zlast-chunk, c# a  r1 s1 _! `
trailer& R! ^3 T! I; S+ G
crlf4 C, }: r! [2 C* g1 ?- {9 S
chunk = chunk-size [ chunk-extension ] crlf
: Q, ?0 ~& f6 m) ?chunk-data crlf* z9 m2 s' u2 j, J- T3 G; A  S& n
chunk-size = 1*hex
2 e& r1 ?$ A% H: e* elast-chunk = 1*(0) [ chunk-extension ] crlf! \% O" j" ]# s" V5 b0 D/ i( X; U
chunk-extension= *( ; chunk-ext-name [ = chunk-ext-val ] )
; _1 F1 V$ l7 u+ W" g" zchunk-ext-name = token( e: ^4 {+ s* x/ F5 z4 \% Q
chunk-ext-val = token | quoted-string1 ^2 O) F( D- M4 T5 X3 H
chunk-data = chunk-size(octet)
6 L$ F  h- ~3 Ltrailer = *(entity-header crlf)
' x; V, I/ ~" p! q" p我们来模拟一下数据结构:
% S5 R% K* P/ O  [/ V; j+ V+ d! |[chunk大小][回车][chunk数据体][回车][chunk大小][回车][chunk数据体][回车][0][回车]
1 q7 b/ y* ]* i4 A注意chunk-size是以十六进制的ascii码表示的,比如86ae(实际的十六进制应该是:38366165),计算成长度应该是:34478,表示从回车之后有连续的34478字节的数据。
* [7 w# v+ ]6 P" y$ G/ O. K跟踪了的返回数据,发现在chunk-size中,还会多一些空格。可能是固定长度为7个字节,不满7个字节的,就以空格补足,空格的ascii码是0x20。9 S% H, l- q8 I& A
以下是解码过程的伪代码:
* Y& o+ Q; c1 N& f" hlength := 0//用来记录解码后的数据体长度
1 g; w8 M; H: x" i( c6 q) H- X8 cread chunk-size, chunk-extension (if any) and crlf//第一次读取块大小
' s" D4 V& ~6 t4 g9 Y3 ~# Pwhile (chunk-size > 0) {//一直循环,直到读取的块大小为0
- t3 Z8 ~0 X, }# A4 |read chunk-data and crlf//读取块数据体,以回车结束+ s8 U1 v" v5 l$ u/ r9 p2 r# M3 a/ F
append chunk-data to entity-body//添加块数据体到解码后实体数据
" @* I2 ?' p2 V, a' Olength := length + chunk-size//更新解码后的实体长度' L! ]9 j" h7 e5 x) O
read chunk-size and crlf//读取新的块大小
4 v5 x! R+ v! ?( m% D. N. Y}4 e1 p- e7 h3 G
read entity-header//以下代码读取全部的头标记2 v. f' F# E7 A7 _
while (entity-header not empty) {
# u8 l) A7 |( j( i3 ~0 _append entity-header to existing header fields7 S' l: ~2 V+ |5 g) {
read entity-header# `. e7 X$ A2 A) p& q3 T
}
) X3 P+ a; R/ hcontent-length := length//头标记中添加内容长度) l' O4 [3 P+ W
remove chunked from transfer-encoding//头标记中移除transfer-encoding/ }; B8 F* Y) c" v6 c: i
有空再研究一下gzip+chunked是如何编码的,估计是每个chunk块进行一次gzip独立压缩。
2 a  T4 i( e( @# n* p使用了chunked,自然会在性能上稍微打点折扣,因为比正常的数据体多出了一些额外的消耗。
3 ]' v& Q- U3 B  P2 f" G' ^+ G, {" x但是有一些情况下,必需要使用分块输出,这也是不得已而为之.
" I$ B% L! P6 N: k7 X4 R2 Z4 n8 f, J( c- W! U3 j, H; j9 j$ M5 ~
更多网页制作信息请查看: 网页制作

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表