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

  1. HTTP 协议之 Chunked 解析

    这里填写标题 1. HTTP 协议之 Chunked 解析 1. HTTP 协议之 Chunked 解析 在网上找了好一会, 始终没发现有解析 Chunked 编码的文章, 那就自己写一个吧, 呵呵. ...

  2. java http data chunk_HTTP协议之Chunked解析

    在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵.网上使用ChuPHP 在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵. 网上使用 ...

  3. php chunked trailer header,HTTP协议之Chunked解析

    在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵. 网上使用Chunked编码的网站似乎并不是很多,除了那些使用GZip压缩的网站,例:google.com,还有就是 ...

  4. 自定义协议的命令解析器

    文章目录 前言 Switch...case类型命令解析的弊端 程序的改进目标 对命令解析器的分析 命令解析器的代码示例 用于代码工程需要解决的问题 可用于代码工程的命令解析器实现 一些新的认识 前言 ...

  5. 流媒体-RTMP协议-rtmpdump-flv封装解析(一)

    流媒体-RTMP协议-rtmpdump-flv封装解析(一) 流媒体-RTMP协议-librtmp库学习(二) 流媒体-RTMP协议-librtmp库学习-c++多线程实现rtmp推流flv文件(三) ...

  6. DLT645协议解析(二)---07协议数据帧结构解析

    (二)DLT645-2007协议数据帧结构解析      书接上回,下图展示的是DLT645-2007协议读取电表电量的交互过程,数据请求帧里面请求的数据类型是当前正向有功电量. PC请求帧:   6 ...

  7. TCP协议疑难杂症全景解析 1

    TCP协议疑难杂症全景解析 说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象 ...

  8. spring boot 中使用 POP3协议读取并解析邮件

    spring boot 中使用 POP3协议读取并解析邮件 1.邮箱授权 QQ邮箱授权,打开 "设置" 切换到 "账户" 找到下图中设置,开启 "PO ...

  9. app及Java服务端实现JT808协议的定义解析

    app及Java服务端实现JT808协议的定义解析,可以用做行车记录仪等的app. 网上很多帖子已经对JT808协议做了说明,我在这里就不做过多的赘述了. 最近接到一个项目是打车类的,所以对这协议做了 ...

最新文章

  1. Linux mysql设置密码
  2. spring和ejb2.x集成共享applicationContext.xml的问题
  3. WPF实现实现圆形菜单
  4. VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错
  5. Echarts pie 饼图类型后显示数据
  6. linux内核编译,内核参数修改
  7. 《简明 PHP 教程》03 第一步
  8. 17ー03ー20 日本語勉強
  9. Qt 窗口置顶 | 和取消置顶
  10. [转载]手机编程与AIDE
  11. 个人计算机网刻系统,诚龙网维全自动pxe网刻工具_win7网刻工具_网刻win7系统工具...
  12. 爬虫-将网页数据写入word中
  13. Android自定义导览地图组件(二)
  14. ORACLE索引分裂(enq: TX - index contention)
  15. linux里面的注释命令是啥,LINUX基础命令注释大全
  16. 无人机技术将从硬件创新转向自动化智能飞行
  17. What?校花居然半夜问我要“软件”
  18. 3.3V过压保护电路
  19. IDEA插件之Json Parser
  20. C语言的3种打桩方法总结

热门文章

  1. 最详细的----->一维数组实现杨辉三角
  2. io获取 pcl_点云数据可视化之PCL滤波学习
  3. 位序、字节序、类型序
  4. PyTorch框架:(4)如何去构建数据
  5. 数据结构和算法:(3)3.2线性表的链式存储结构
  6. 力扣(LeetCode)刷题,简单+中等题(第28期)
  7. 基于简化点云地图的语义边缘对齐的单目定位方法
  8. 高亮提示、聚焦控件并滚动到浏览器中干好可以查看到该控件的位置
  9. 【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxxparam2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
  10. 在Ubuntu 14.04 64bit上编译并研究State Threads网络线程库源码