`

[转]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/item/6eca64e0243b13accf2d4f37
分享到:
评论

相关推荐

    boost之http请求及chunked解析

    在IT行业中,Boost库是一个非常重要的C++工具集,它为C++标准库提供了许多扩展功能,包括网络编程。...希望这个概述能为你提供一个起点,让你更好地理解和使用Boost.ASIO进行HTTP请求和chunked编码的解析。

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

    1. **读取头部信息**:首先,你需要解析HTTP响应头,寻找`Transfer-Encoding: chunked`字段,这表明后续的数据将以chunked编码的形式传输。同时,也要注意`Content-Type`头,因为它定义了数据的类型。 2. **理解...

    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协议解析及其通信流程

    为了解决这个问题,HTTPS(HTTP over SSL/TLS)被广泛应用,它在HTTP之上添加了SSL/TLS层,确保数据的加密传输和服务器的身份验证。 6. **缓存与代理**: - HTTP支持缓存机制,客户端可以缓存服务器的响应,减少...

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

    处理HTTP请求时,嵌入式设备需要解析HTTP消息结构,根据请求方法、URI等信息进行相应的数据处理,然后发送HTTP响应。响应消息同样包括状态行、响应头和消息正文,状态码则表示请求处理的结果,如200表示成功,404...

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

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

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

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

    http 协议源代码

    HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层协议。本资源提供了用C语言实现的HTTP协议源...

    c语言 http chunked解码.docx

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

    java 使用socked接收chunck分块数据

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

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

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

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

    HTTP/1.1要求在没有chunked编码时明确指定内容长度,以确保正确解析。简单请求消息和响应消息则不包含消息头,适用于GET方式的快速交互。 总的来说,理解HTTP协议对于开发Web应用、优化网络性能和调试问题至关重要...

    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、...

Global site tag (gtag.js) - Google Analytics