欢迎来到天天文库
浏览记录
ID:37721036
大小:32.20 KB
页数:5页
时间:2019-05-29
《http1.1的chunked解码解析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、HTTP1.1中CHUNKED编码解析一般HTTP通信时,会使用Content-Length头信息性来通知用户代理(通常意义上是浏览器)服务器发送的文档内容长度,该头信息定义于HTTP1.0协议RFC194510.4章节中。浏览器接收到此头信息后,接受完Content-Length中定义的长度字节后开始解析页面,但如果服务端有部分数据延迟发送吗,则会出现浏览器白屏,造成比较糟糕的用户体验。解决方案是在HTTP1.1协议中,RFC2616中14.41章节中定义的Transfer-Encoding:chunked的头信息,chu
2、nked编码定义在3.6.1中,所有HTTP1.1应用都支持此使用trunked编码动态的提供body内容的长度的方式。进行Chunked编码传输的HTTP数据要在消息头部设置:Transfer-Encoding:chunked表示ContentBody将用chunked编码传输内容。根据定义,浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可解析页面.并且可以下载html中定义的页面内容,包括js,css,image等。采用chunked编码有两种选择,一种是设定Server的IObuffer长度让S
3、erver自动flushbuffer中的内容,另一种是手动调用IO中的flush函数。不同的语言IO中都有flush功能:lphp: ob_flush();flush();lperl: STDOUT->autoflush(1);ljava: out.flush();lpython: sys.stdout.flush()lruby: stdout.flush采用HTTP1.1的Transfer-Encoding:chunked,并且把IO的bufferflush下来,以便浏览器更早的下载页面配套资源。当不能预先确定报文体
4、的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就需要通过Transfer-Encoding域来确定报文体长度。Chunked编码一般使用若干个chunk串连而成,最后由一个标明长度为0的chunk标示结束。每个chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(非零开头的十六进制的数字)和数量单位(一般不写,表示字节).正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的chunk中的内容是称为footer的内容,是一些附加的Header信息
5、(通常可以直接忽略)。上述解释过于官方,简而言之,chunked编码的基本方法是将大块数据分解成多块小数据,每块都可以自指定长度,其具体格式如下(BNF文法):Chunked-Body =*chunk //0至多个chunklast-chunk //最后一个chunktrailer //尾部CRLF //结束标记符chunk =chunk-size[chunk-extension]CRLFchunk-dataCRLFchunk-size =1*HEXlast-chunk =1
6、*("0")[chunk-extension]CRLFchunk-extension=*(";"chunk-ext-name["="chunk-ext-val])chunk-ext-name=tokenchunk-ext-val =token
7、quoted-stringchunk-data =chunk-size(OCTET)trailer =*(entity-headerCRLF)解释:lChunked-Body表示经过chunked编码后的报文体。报文体可以分为chunk,last-chunk,trailer和结
8、束符四部分。chunk的数量在报文体中最少可以为0,无上限;l每个chunk的长度是自指定的,即,起始的数据必然是16进制数字的字符串,代表后面chunk-data的长度(字节数)。这个16进制的字符串第一个字符如果是“0”,则表示chunk-size为0,该chunk为last-chunk,无chunk-data部分。l可选的chunk-extension由通信双方自行确定,如果接收者不理解它的意义,可以忽略。ltrailer是附加的在尾部的额外头域,通常包含一些元数据(metadata,metameans"aboutin
9、formation"),这些头域可以在解码后附加在现有头域之后下面分析用ethereal抓包使用Firefox与某网站通信的结果(从头域结束符后开始):Address 0.......................... f000c0 31000d0 6666630
此文档下载收益归作者所有