服务端给浏览器发送报文时,必须告诉浏览器报文的大小,这样浏览器可以根据报文大小来判断报文的完整性以及在长连接中确定报文的截尾。但是很多服务器的报文是动态创建的,在发送之前是无法确定其大小的。服务器只有等待内容全部创建后,计算出主体的大小,才能响应客户端的请求,这样的处理方法大大延迟了响应。传输编码中的分块编码为这种困难提供了解决方案,服务器可以逐块发送主体,并说明每块的大小就可以了。HTTP协议中只定义了两个首部来描述传输编码:

  • Transfer-Encoding响应首部。告诉浏览器传输编码方式,一般为分块编码。
  • TE请求首部。告诉服务器自己可以接受的编码方式。

HTTP分块编码的响应报文结构大概是这样的:以HTTP响应首部块开始,随后是一系列的分块。每个分块包含一个长度值和该分块的数据,长度值是十六进制形式并将CRLF与数据分隔开。分块中数据的大小以字节计算,不包括长度值和数据之间的CRLF序列。最后是长度为0的结束块,表示分块编码传输结束。

假设请求的文件是jpeg文件,所以在收到数据之后,只考虑跳过响应报文的HEADER部分加\r\n\r\n四个字节后,直接把剩余的数据写到文件中。测试过程中,发现有相当一部分图片不能正常打开,总是比服务器多了几个字节;打印输出响应报文后发现头中并没有我们通常所见的Content-Length域来指明报文体的长度,反而是多了Transfer – Encoding域。上网查阅http1.1协议后,发现通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。协议中关于这个字段的具体解释如下:

一般HTTP通信时会使用是Content-Length头信息来指定body信息大小,但是有时候无法确定信息大小,就要使用trunked编码动态的提供body内容的长度。进行Chunked编码传输的HTTP数据要在消息头部设置:Transfer-Encoding: chunked表示Content Body将用chunked编码传输内容。Chunked编码一般使用若干个chunk串连而成,最后由一个标明长度为0的chunk标示结束。每个chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(非零开头的十六进制的数字)和数量单位(一般不写,表示字节).正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。

上述解释过于官方,简而言之,chunked编码的基本方法是将大块数据分解成多块小数据,每块都可以自指定长度,其具体格式如下:

HTTP CHUNKED相关推荐

  1. HTTP协议中的Tranfer-Encoding:chunked编码解析

    当不能预先确定报文体的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就需要通过Transfer-Encoding域来确定报文体长度.     通常情况下,Transfer ...

  2. 取消掉Transfer-Encoding:chunked

    有时候,Web服务器生成HTTP Response是无法在Header就确定消息大小的,这时一般来说服务器将不会提供Content-Length的头信息,而采用Chunked编码动态的提供body内容 ...

  3. 利用bigpipe机制实现页面模块的异步渲染 chunked技术

    bigpipe基于HTTP/1.1 支持的chunked编码,可以由浏览器接收到服务器发送的chunked块后,立即解析该块代码.因为chunked编码使消息主体成块发送,每块有自己的大小指示器,在所 ...

  4. HTTP协议之Chunked解析

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

  5. HTTP Response中的Chunked编码

    进行Chunked编码传输的HTTP Response会在消息头部设置: Transfer-Encoding: chunked 表示Content Body将用Chunked编码传输内容. Chunk ...

  6. HTTP协议中的chunked编码解析

    " HTTP协议中的chunked传输编码全接触." 在HTTP协议中,服务器发往客户端的数据中,通常都包括HTTP头和HTTP体,当存在HTTP体的时候,HTTP体的长度通常是由 ...

  7. Http Chunked Transfer Coding

    分块传输编码 Chunked Transfer Coding 是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由網頁伺服器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分.分 ...

  8. java chunked 解码_模拟http请求 带 chunked解析办法一

    今天在干坏事抓取别人页面时候遇到一个问题,平时我们在post数据后,大不了要求提交cookie,但是今天这个测试了N遍不需要coookie都行的,但是抓取到的始终是乱码,怎么解析都不行.于是自己又把c ...

  9. 分块编码(Transfer-Encoding:chunked)

    参考链接: HTTP 协议中的 Transfer-Encoding 分块传输编码 一.背景: 1.持续连接的问题:对于非持续连接,浏览器可以通过连接时否关闭来界定请求或响应实体的边界;而对于持续连接, ...

  10. .net 解析Transfer-Encoding:chunked 秒掉网上无用方案

    昨天在爬数据时,发现某个网站Response.Get过来的数据一直是为空.当时就很奇怪,认真看下了响应头.发现Transfer-Encoding:chunked这个玩意 网上查了下资料 一般情况HTT ...

最新文章

  1. linux c implicit declaration of function 警告的解决方法
  2. H3C S5500核心交换机策略路由调度流量到不同的路由设备
  3. Javascript 面向对象全新理练之数据的封装
  4. 超图桌面版加载obj 3D模型 - 2
  5. MySQL内连接方法_Mysql常用的几种join连接方式
  6. java获取net地址 本机
  7. 了解如何使用ASP.NET Core 3.1构建Web应用程序
  8. 搞定Server 2008蓝牙问题
  9. 一个基于运气的数据结构,你猜是啥?
  10. java保留两位小数怎么_java保留两位小数4种方法
  11. 【算法笔记+POJ3461】Oulipo(字符串hash模版)
  12. matlab画圆的命令_matlab画圆命令资料
  13. 公司邮箱通讯录的更新
  14. MAX232芯片的引脚图和电脑串口的连接电路及RS232引脚定义详细说明
  15. 动态逆序对:CDQ分治
  16. 怎么申请https证书
  17. 史上最美大型互联网机房综合布线图鉴
  18. python无法正常启动0xc000007b_应用程序无法正常启动(0xc000007b)。
  19. Process finished with exit code 1Class not found:
  20. 六、Rewrite重写

热门文章

  1. 计算机毕业设计——基于HTML品优购项目的设计与实现(7页)
  2. Linux通过主机名免密码建立互信
  3. 《劝学》 君子曰:学不可以已。
  4. 树莓派4b和3b+功耗_从入手树莓派开始
  5. 程序猿如何理财之如何研究好一家上市公司?
  6. 太平洋皇冠证券按照2015年第四季度的收入计算,列出了全球企业云服务收入最多的10家科技公司
  7. 为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案
  8. 数字孪生扫除智慧城市“盲点”,赋能社会数字发展
  9. 行为皆数据 门店即服务——首次揭秘阿里的无人店系统
  10. ShaderGraph——全息效果