`
56553655
  • 浏览: 202937 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HTTP协议之Chunked解析

阅读更多

在网上找了好一会,始终没发现有解析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

分享到:
评论

相关推荐

    boost之http请求及chunked解析

    在HTTP协议中,请求由多个部分组成:请求行、请求头和可选的请求体。Boost.ASIO提供了一个名为`boost::asio::ip::tcp::socket`的类,你可以用它来创建一个TCP连接,从而发送HTTP请求。例如,你可以创建一个socket...

    HTTP chunked方式传输的C语言解析示例

    HTTP chunked编码是一种在HTTP协议中用于处理大文件或流式传输数据的方式。它允许服务器在不知道确切内容长度的情况下发送响应。这种方式对于那些在生成过程中才能确定大小的动态内容非常有用,例如,从数据库中实时...

    http1.1的chunked协议解析

    ### HTTP 1.1 Chunked 编码详解 #### 协议概述 HTTP 1.1 的 Chunked 编码是一种特殊的传输编码方式,用于在不知道数据总长度的情况下传输动态生成的内容。根据 RFC 2616 的 3.6.1 节描述,chunked 编码通过将消息体...

    对chunked编码进行解码

    一个对chunked编码进行解码的例子,通过java socket实现发送http请求,对gzip压缩的消息体进行解码处理。

    http 协议解析器

    **HTTP协议解析器详解** HTTP(HyperText Transfer Protocol)协议是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层...

    http协议解析及其通信流程

    HTTP协议的工作基于请求-响应模型,它允许用户通过浏览器或其他HTTP客户端向Web服务器发送请求,获取所需的数据,如HTML页面、图片、视频等。 1. **HTTP请求**: - 用户在浏览器中输入URL,例如`...

    HTTP.zip_C http协议_HTTP协议_c语言 http_c语言 http_c语言http协议

    HTTP协议是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层协议。本实例将深入探讨如何使用C语言来实现HTTP协议。 首先,...

    HTTP协议在嵌入式系统中的实现

    HTTP协议,全称为超文本传输协议(Hypertext Transfer Protocol),是应用层的网络协议,用于实现访问网页的应用程序。在嵌入式系统中,特别是个人数字助理(PDA)等小型设备中实现HTTP协议的接入,对于扩展其网络...

    http 协议源代码

    本资源提供了用C语言实现的HTTP协议源代码,对于理解HTTP工作原理和C语言编程具有一定的学习价值。 1. HTTP协议基础: - HTTP协议是客户端(浏览器)和服务器之间的通信规范,使用TCP/IP作为传输层协议。 - 请求...

    关于PHP 如何用 curl 读取 HTTP chunked 数据

    在HTTP协议中,`Transfer-Encoding: chunked`是一种用于分块传输编码的方式,常用于服务器无法预先知道响应体总长度的情况。这种方式将响应体分成多个块(chunks),每一块都有一个大小标识,最后以一个零长度的块...

    直接用socket实现HTTP协议(下载专用)

    在IT行业中,网络编程是不可或缺的一部分,而HTTP协议作为互联网上应用最为广泛的一种网络协议,它的实现方式多种多样。本文将深入探讨如何直接使用Socket API来实现HTTP协议,特别是针对下载场景的应用。Socket编程...

    java 使用socked接收chunck分块数据

    在HTTP协议中,"Chunked Transfer Encoding"是一种用于无固定长度内容传输的方式,它允许服务器在不知道消息主体的总大小时就开始发送数据。在Java中,处理chunked数据通常涉及到Socket编程,因为Socket是网络通信的...

    HTTP协议详解 培训资料(PPT)

    HTTP协议是TCP/IP协议栈中的应用层协议,它允许用户通过Web浏览器获取网页和其他资源。 HTTP协议的版本主要有HTTP/1.0和HTTP/1.1,后者是当前广泛使用的版本。HTTP/1.0的会话方式是每次连接只处理一个请求和响应,...

    c语言 http chunked解码.docx

    HTTP1.1协议引入了一种名为`CHUNKED`编码的方式,用于处理那些在发送时无法预先知道内容长度的情况。这种编码方式对于动态生成的、流式传输的内容尤其有用,因为它允许服务器在不知道整个响应体确切大小的情况下就...

    HTTP解析器

    HTTP解析器是网络通信中的关键组件,主要用于处理和解析HTTP协议的数据包。在互联网通信中,HTTP(超文本传输协议)是应用层最常用的协议之一,用于从Web服务器传输超媒体文档到客户端,如浏览器。当一个HTTP请求或...

    HTTP Chunk协议等

    HTTP Chunked编码是一种在HTTP协议中传输大体积数据的方式,主要用在HTTP 1.1版本中,因为HTTP 1.0不支持内容长度未知的响应。Chunked编码的引入解决了服务器无法预先知道响应体总长度的问题,允许数据分块发送,每...

    HTTP协议详解.pdf

    本文将深入解析HTTP协议的基础知识、工作原理、请求方法、响应状态码、首部字段以及一些进阶特性。 一、HTTP协议基础 HTTP是一个基于TCP/IP通信协议来传递数据的应用层协议,主要用于Web浏览器与Web服务器之间的...

    HTTP.The.Definitive.Guide.zip_HTTP_HTTP协议

    《HTTP: The Definitive Guide》是一本深入探讨HTTP协议的权威指南,它涵盖了从基础概念到高级特性的全方位解析。 在HTTP协议中,最基本的概念是请求和响应。请求由客户端发起,通常包含方法(如GET、POST、PUT、...

    http.rar_HTTP协议

    这个"HTTP协议"压缩包中的HTML文件可能涵盖了这些概念,并通过实例解析、图解等方式深入浅出地解释HTTP协议的运作细节。学习这些内容对于网络开发者、系统管理员和互联网爱好者来说都是非常有价值的,能够帮助他们更...

Global site tag (gtag.js) - Google Analytics