在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵。
网上使用Chunked编码的网站似乎并不是很多,除了那些使用GZip压缩的网站,例:google.com,还有就是大部分打开GZip压缩的PHP论坛。
根据本人的理解,使用Chunked编码的主要好处就在于一些程序的运算出过程中,可以动态的输出内容。
例如,要在后台处理一个小时的运算,但又不希望用户等一个小时才能看到结果。这时就可采用Chunked编码将内容分块输出,用户随时都可以接收到最新的处理结果。
ASP关闭了缓存的输出模式,就是Chunked编码的。(Response.Buffer = false)
而每一次的Response.Write,都是一个Chunked,所以不要使用的太频繁哦,否则Chunk数量太多,额外的数据太浪费空间了。
若想了解Chunked的具体编码结构,用ASP关闭缓存调试蛮方便的。:)
我们先来看看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)
我们来模拟一下数据结构:
[Chunk大小][回车][Chunk数据体][回车][Chunk大小][回车][Chunk数据体][回车][0][回车]
注意chunk-size是以十六进制的ASCII码表示的,比如86AE(实际的十六进制应该是:38366165),计算成长度应该是:34478,表示从回车之后有连续的34478字节的数据。
跟踪了www.yahoo.com的返回数据,发现在chunk-size中,还会多一些空格。可能是固定长度为7个字节,不满7个字节的,就以空格补足,空格的ASCII码是0x20。
以下是解码过程的伪代码:
length := 0//用来记录解码后的数据体长度
read chunk-size, chunk-extension (if any) and CRLF//第一次读取块大小
while (chunk-size > 0) {//一直循环,直到读取的块大小为0
read chunk-data and CRLF//读取块数据体,以回车结束
append chunk-data to entity-body//添加块数据体到解码后实体数据
length := length + chunk-size//更新解码后的实体长度
read chunk-size and CRLF//读取新的块大小
}
read entity-header//以下代码读取全部的头标记
while (entity-header not empty) {
append entity-header to existing header fields
read entity-header
}
Content-Length := length//头标记中添加内容长度
Remove "chunked" from Transfer-Encoding//头标记中移除Transfer-Encoding
有空再研究一下GZip+Chunked是如何编码的,估计是每个Chunk块进行一次GZip独立压缩。
使用了Chunked,自然会在性能上稍微打点折扣,因为比正常的数据体多出了一些额外的消耗。
但是有一些情况下,必需要使用分块输出,这也是不得已而为之~^_^
转自:http://hi.baidu.com/zkheartboy/blog/item/9216a0fd05591e1508244d74.html
分享到:
相关推荐
在HTTP协议中,请求由多个部分组成:请求行、请求头和可选的请求体。Boost.ASIO提供了一个名为`boost::asio::ip::tcp::socket`的类,你可以用它来创建一个TCP连接,从而发送HTTP请求。例如,你可以创建一个socket...
HTTP chunked编码是一种在HTTP协议中用于处理大文件或流式传输数据的方式。它允许服务器在不知道确切内容长度的情况下发送响应。这种方式对于那些在生成过程中才能确定大小的动态内容非常有用,例如,从数据库中实时...
### HTTP 1.1 Chunked 编码详解 #### 协议概述 HTTP 1.1 的 Chunked 编码是一种特殊的传输编码方式,用于在不知道数据总长度的情况下传输动态生成的内容。根据 RFC 2616 的 3.6.1 节描述,chunked 编码通过将消息体...
一个对chunked编码进行解码的例子,通过java socket实现发送http请求,对gzip压缩的消息体进行解码处理。
**HTTP协议解析器详解** HTTP(HyperText Transfer Protocol)协议是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层...
HTTP协议的工作基于请求-响应模型,它允许用户通过浏览器或其他HTTP客户端向Web服务器发送请求,获取所需的数据,如HTML页面、图片、视频等。 1. **HTTP请求**: - 用户在浏览器中输入URL,例如`...
HTTP协议是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层协议。本实例将深入探讨如何使用C语言来实现HTTP协议。 首先,...
HTTP协议,全称为超文本传输协议(Hypertext Transfer Protocol),是应用层的网络协议,用于实现访问网页的应用程序。在嵌入式系统中,特别是个人数字助理(PDA)等小型设备中实现HTTP协议的接入,对于扩展其网络...
本资源提供了用C语言实现的HTTP协议源代码,对于理解HTTP工作原理和C语言编程具有一定的学习价值。 1. HTTP协议基础: - HTTP协议是客户端(浏览器)和服务器之间的通信规范,使用TCP/IP作为传输层协议。 - 请求...
在HTTP协议中,`Transfer-Encoding: chunked`是一种用于分块传输编码的方式,常用于服务器无法预先知道响应体总长度的情况。这种方式将响应体分成多个块(chunks),每一块都有一个大小标识,最后以一个零长度的块...
在IT行业中,网络编程是不可或缺的一部分,而HTTP协议作为互联网上应用最为广泛的一种网络协议,它的实现方式多种多样。本文将深入探讨如何直接使用Socket API来实现HTTP协议,特别是针对下载场景的应用。Socket编程...
在HTTP协议中,"Chunked Transfer Encoding"是一种用于无固定长度内容传输的方式,它允许服务器在不知道消息主体的总大小时就开始发送数据。在Java中,处理chunked数据通常涉及到Socket编程,因为Socket是网络通信的...
HTTP协议是TCP/IP协议栈中的应用层协议,它允许用户通过Web浏览器获取网页和其他资源。 HTTP协议的版本主要有HTTP/1.0和HTTP/1.1,后者是当前广泛使用的版本。HTTP/1.0的会话方式是每次连接只处理一个请求和响应,...
HTTP1.1协议引入了一种名为`CHUNKED`编码的方式,用于处理那些在发送时无法预先知道内容长度的情况。这种编码方式对于动态生成的、流式传输的内容尤其有用,因为它允许服务器在不知道整个响应体确切大小的情况下就...
HTTP解析器是网络通信中的关键组件,主要用于处理和解析HTTP协议的数据包。在互联网通信中,HTTP(超文本传输协议)是应用层最常用的协议之一,用于从Web服务器传输超媒体文档到客户端,如浏览器。当一个HTTP请求或...
HTTP Chunked编码是一种在HTTP协议中传输大体积数据的方式,主要用在HTTP 1.1版本中,因为HTTP 1.0不支持内容长度未知的响应。Chunked编码的引入解决了服务器无法预先知道响应体总长度的问题,允许数据分块发送,每...
本文将深入解析HTTP协议的基础知识、工作原理、请求方法、响应状态码、首部字段以及一些进阶特性。 一、HTTP协议基础 HTTP是一个基于TCP/IP通信协议来传递数据的应用层协议,主要用于Web浏览器与Web服务器之间的...
《HTTP: The Definitive Guide》是一本深入探讨HTTP协议的权威指南,它涵盖了从基础概念到高级特性的全方位解析。 在HTTP协议中,最基本的概念是请求和响应。请求由客户端发起,通常包含方法(如GET、POST、PUT、...
这个"HTTP协议"压缩包中的HTML文件可能涵盖了这些概念,并通过实例解析、图解等方式深入浅出地解释HTTP协议的运作细节。学习这些内容对于网络开发者、系统管理员和互联网爱好者来说都是非常有价值的,能够帮助他们更...