- 浏览: 267233 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- mysql (5)
- boost (6)
- 工具 (10)
- IT生活 (7)
- 多线程 (3)
- Ruby (15)
- php (2)
- MongoDB (39)
- 移动互联网 (2)
- 测试 (8)
- c++ (28)
- 书 (1)
- 网站 (3)
- 网络编程 (14)
- 开源软件 (1)
- 分布式计算 (1)
- 得得得 (1)
- php,wordpress (1)
- error (5)
- 编译 (2)
- 学习 (1)
- 杀毒软件 (1)
- dd (0)
- linux (21)
- 数据库 (1)
- STL (1)
- c++/c (5)
- 软件设计 (1)
- 操作系统 (4)
- 库 (2)
- win32 (1)
- s (0)
- openssl (1)
- perl (2)
- debug (1)
- windows (4)
- python (12)
- windows 防火墙 (1)
- vs (1)
- vim (2)
- vc (1)
- 浏览器插件的危害 (1)
- curl (0)
- 判断手机号码合法性的库 (0)
- 地址备注 (0)
- 安装 File::Slurp (1)
- cenos (2)
- shell (1)
- linunx (1)
- internet (1)
- software (1)
- widows (1)
- linux io (1)
- nginx (2)
- 算法 (2)
- google (1)
- protobuf (2)
- tengine (1)
- tools (1)
- lua (2)
- liunx (1)
- vcard (1)
- lua-iconv (1)
- 网络 (2)
- teat (0)
- ldconfig linux (0)
- awk (0)
- grep (0)
- windws (2)
- linux 命令 (1)
- tcp dump (1)
- vmware (1)
- question2answer (2)
- mongdb (1)
- 正则 (1)
- OCR (2)
- Windows Server (1)
最新评论
在网上找了好一会,始终没发现有解析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
发表评论
-
windows 常用网络查询命令(不断更新)
2012-12-05 11:12 644查询端口占用情况: netstat -aon|findstr ... -
[转] setsockopt :SO_LINGER 选项设置 socket error 10055
2012-11-10 12:53 1414setsockopt 设置 SO_LINGER 选 ... -
Nginx出现“413 Request Entity Too Large”错误解决方法
2012-11-05 13:59 1027今天使用Wordpress的flash版文件上传功能的时候,总 ... -
【转】Netstat命令详解
2012-10-18 18:14 677Netstat用于显示与IP、TCP ... -
wireshark
2012-09-25 17:22 0frame.time >= "sep 25, ... -
【转】HTTP请求模型和头信息
2012-07-19 20:43 854HTTP请求模型 一、连接至Web服务器 一个客户端应用( ... -
查看网路连接的命令
2012-07-11 17:18 0netstat -ano | find "6003& ... -
服务器多服务器设置
2012-03-12 18:01 749当服务器功能比较多时,可以抽象出一个代理,将不同的服务 ... -
socket error 10055
2011-12-20 10:39 2769利用_beginthreadex创建的线程句柄不会自动释放,如 ... -
mongodb
2011-12-15 14:52 1627VS2010 将程序运行时库从MDD改为MTD(在MTD模式 ... -
mongodb 头文件包含问题
2011-12-15 10:02 1225添加 #include "dbclient.h&q ... -
Nginx 的介绍 (开源服务器)
2011-11-04 10:04 877http://blog.licess.org/nginx/ ... -
HTTP 协议 的简单解释
2011-11-01 20:32 752At a glance, HTTP is a fairly s ... -
windows 网络编程 函数
2011-05-06 16:48 866#include <winsock.h> u_ ... -
windows socket 编程资源
2011-05-05 07:21 735http://icourse.cuc.edu.cn/netwo ...
相关推荐
在IT行业中,Boost库是一个非常重要的C++工具集,它为C++标准库提供了许多扩展功能,包括网络编程。...希望这个概述能为你提供一个起点,让你更好地理解和使用Boost.ASIO进行HTTP请求和chunked编码的解析。
1. **读取头部信息**:首先,你需要解析HTTP响应头,寻找`Transfer-Encoding: chunked`字段,这表明后续的数据将以chunked编码的形式传输。同时,也要注意`Content-Type`头,因为它定义了数据的类型。 2. **理解...
### HTTP 1.1 Chunked 编码详解 #### 协议概述 HTTP 1.1 的 Chunked 编码是一种特殊的传输编码方式,用于在不知道数据总长度的情况下传输动态生成的内容。根据 RFC 2616 的 3.6.1 节描述,chunked 编码通过将消息体...
一个对chunked编码进行解码的例子,通过java socket实现发送http请求,对gzip压缩的消息体进行解码处理。
**HTTP协议解析器详解** HTTP(HyperText Transfer Protocol)协议是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层...
为了解决这个问题,HTTPS(HTTP over SSL/TLS)被广泛应用,它在HTTP之上添加了SSL/TLS层,确保数据的加密传输和服务器的身份验证。 6. **缓存与代理**: - HTTP支持缓存机制,客户端可以缓存服务器的响应,减少...
处理HTTP请求时,嵌入式设备需要解析HTTP消息结构,根据请求方法、URI等信息进行相应的数据处理,然后发送HTTP响应。响应消息同样包括状态行、响应头和消息正文,状态码则表示请求处理的结果,如200表示成功,404...
HTTP协议是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层协议。本实例将深入探讨如何使用C语言来实现HTTP协议。 首先,...
在HTTP协议中,`Transfer-Encoding: chunked`是一种用于分块传输编码的方式,常用于服务器无法预先知道响应体总长度的情况。这种方式将响应体分成多个块(chunks),每一块都有一个大小标识,最后以一个零长度的块...
HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。它是一个基于请求与响应模型的、无状态的、应用层协议。本资源提供了用C语言实现的HTTP协议源...
HTTP1.1协议引入了一种名为`CHUNKED`编码的方式,用于处理那些在发送时无法预先知道内容长度的情况。这种编码方式对于动态生成的、流式传输的内容尤其有用,因为它允许服务器在不知道整个响应体确切大小的情况下就...
在HTTP协议中,"Chunked Transfer Encoding"是一种用于无固定长度内容传输的方式,它允许服务器在不知道消息主体的总大小时就开始发送数据。在Java中,处理chunked数据通常涉及到Socket编程,因为Socket是网络通信的...
在IT行业中,网络编程是不可或缺的一部分,而HTTP协议作为互联网上应用最为广泛的一种网络协议,它的实现方式多种多样。本文将深入探讨如何直接使用Socket API来实现HTTP协议,特别是针对下载场景的应用。Socket编程...
HTTP/1.1要求在没有chunked编码时明确指定内容长度,以确保正确解析。简单请求消息和响应消息则不包含消息头,适用于GET方式的快速交互。 总的来说,理解HTTP协议对于开发Web应用、优化网络性能和调试问题至关重要...
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、...