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协议之Chunked解析相关推荐
- HTTP 协议之 Chunked 解析
这里填写标题 1. HTTP 协议之 Chunked 解析 1. HTTP 协议之 Chunked 解析 在网上找了好一会, 始终没发现有解析 Chunked 编码的文章, 那就自己写一个吧, 呵呵. ...
- java http data chunk_HTTP协议之Chunked解析
在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵.网上使用ChuPHP 在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵. 网上使用 ...
- php chunked trailer header,HTTP协议之Chunked解析
在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵. 网上使用Chunked编码的网站似乎并不是很多,除了那些使用GZip压缩的网站,例:google.com,还有就是 ...
- 自定义协议的命令解析器
文章目录 前言 Switch...case类型命令解析的弊端 程序的改进目标 对命令解析器的分析 命令解析器的代码示例 用于代码工程需要解决的问题 可用于代码工程的命令解析器实现 一些新的认识 前言 ...
- 流媒体-RTMP协议-rtmpdump-flv封装解析(一)
流媒体-RTMP协议-rtmpdump-flv封装解析(一) 流媒体-RTMP协议-librtmp库学习(二) 流媒体-RTMP协议-librtmp库学习-c++多线程实现rtmp推流flv文件(三) ...
- DLT645协议解析(二)---07协议数据帧结构解析
(二)DLT645-2007协议数据帧结构解析 书接上回,下图展示的是DLT645-2007协议读取电表电量的交互过程,数据请求帧里面请求的数据类型是当前正向有功电量. PC请求帧: 6 ...
- TCP协议疑难杂症全景解析 1
TCP协议疑难杂症全景解析 说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象 ...
- spring boot 中使用 POP3协议读取并解析邮件
spring boot 中使用 POP3协议读取并解析邮件 1.邮箱授权 QQ邮箱授权,打开 "设置" 切换到 "账户" 找到下图中设置,开启 "PO ...
- app及Java服务端实现JT808协议的定义解析
app及Java服务端实现JT808协议的定义解析,可以用做行车记录仪等的app. 网上很多帖子已经对JT808协议做了说明,我在这里就不做过多的赘述了. 最近接到一个项目是打车类的,所以对这协议做了 ...
最新文章
- Linux mysql设置密码
- spring和ejb2.x集成共享applicationContext.xml的问题
- WPF实现实现圆形菜单
- VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错
- Echarts pie 饼图类型后显示数据
- linux内核编译,内核参数修改
- 《简明 PHP 教程》03 第一步
- 17ー03ー20 日本語勉強
- Qt 窗口置顶 | 和取消置顶
- [转载]手机编程与AIDE
- 个人计算机网刻系统,诚龙网维全自动pxe网刻工具_win7网刻工具_网刻win7系统工具...
- 爬虫-将网页数据写入word中
- Android自定义导览地图组件(二)
- ORACLE索引分裂(enq: TX - index contention)
- linux里面的注释命令是啥,LINUX基础命令注释大全
- 无人机技术将从硬件创新转向自动化智能飞行
- What?校花居然半夜问我要“软件”
- 3.3V过压保护电路
- IDEA插件之Json Parser
- C语言的3种打桩方法总结
热门文章
- 最详细的----->一维数组实现杨辉三角
- io获取 pcl_点云数据可视化之PCL滤波学习
- 位序、字节序、类型序
- PyTorch框架:(4)如何去构建数据
- 数据结构和算法:(3)3.2线性表的链式存储结构
- 力扣(LeetCode)刷题,简单+中等题(第28期)
- 基于简化点云地图的语义边缘对齐的单目定位方法
- 高亮提示、聚焦控件并滚动到浏览器中干好可以查看到该控件的位置
- 【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxxparam2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
- 在Ubuntu 14.04 64bit上编译并研究State Threads网络线程库源码