https://www.cnblogs.com/xuehaoyue/p/6639029.html

参考链接:

HTTP 协议中的 Transfer-Encoding

分块传输编码

一、背景:

  1. 持续连接的问题:对于非持续连接,浏览器可以通过连接是否关闭来界定请求或响应实体的边界;而对于持续连接,这种方法显然不奏效。有时,尽管我已经发送完所有数据,但浏览器并不知道这一点,它无法得知这个打开的连接上是否还会有新数据进来,只能傻傻地等了。
  2. 用Content-length解决:计算实体长度,并通过头部告诉对方。浏览器可以通过 Content-Length 的长度信息,判断出响应实体已结束
  3. Content-length引入的新问题:由于 Content-Length 字段必须真实反映实体长度,但是对于动态生成的内容来说,在内容创建完之前,长度是不可知的。这时候要想准确获取长度,只能开一个足够大的 buffer,等内容全部生成好再计算。但这样做一方面需要更大的内存开销,另一方面也会让客户端等更久。
  4. 我们需要一个新的机制:不依赖头部的长度信息,也能知道实体的边界——分块编码(Transfer-Encoding: chunked)

二、分块编码(Transfer-Encoding: chunked)

  1. Transfer-Encoding,是一个 HTTP 头部字段(响应头域),字面意思是「传输编码」。最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。
  2. 分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
  3. 数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。
  4. 具体方法
    1. 在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。
    2. 每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。
    3. 最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。
  5. 例:

    HTTP/1.1 200 OK
    Content-Type: text/plain
    Transfer-Encoding: chunked

    25\r\n
    This is the data in the first chunk\r\n

    1C\r\n
    and this is the second one\r\n

    3\r\n

    con\r\n

    8\r\n
    sequence\r\n

    0\r\n

    \r\n

  6. Content-Encoding 和 Transfer-Encoding 二者经常会结合来用,其实就是针对 Transfer-Encoding 的分块再进行 Content-Encoding压缩。

转载于:https://www.cnblogs.com/FineDay/p/10452421.html

分块编码(Transfer-Encoding: chunked)相关推荐

  1. 分块编码(Transfer-Encoding: chunked)VS Content-length

    参考链接: HTTP 协议中的 Transfer-Encoding 分块传输编码 https://www.cnblogs.com/xuehaoyue/p/6639029.html 一.背景: 持续连接 ...

  2. HTTP中分块编码(Transfer-Encoding: chunked)

    转自: 妙音天女--分块传输编码~ 参考链接: HTTP MDN--HTTP协议 一.背景: 持续连接的问题:对于非持续连接,浏览器可以通过连接是否关闭来界定请求或响应实体的边界:而对于持续连接,这种 ...

  3. php transfer-encoding: chunked,php – 使用chunked transfer encoding和gzip

    我最近开始在我的网站上使用gzip,它在除Opera之外的所有浏览器上都起到了一种魅力作用,它给出了一个错误,即由于数据损坏而无法解压缩内容.从我可以从测试和谷歌搜索中收集到的,使用gzip和chun ...

  4. libcurl API 常用函数

    libcurl 详参libcurl 1 curl_easy_getinfo CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); 使 ...

  5. python爬虫入门教程--快速理解HTTP协议(一)

    http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道.下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解HTTP协议的相关资料,文中介绍的非常详细,需要 ...

  6. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  7. http请求丢部分数据_温故知新,HTTP/2

    去年年底,据国际互联网工程任务组( IETF )消息,HTTP-over-QUIC 实验性协议将被重命名为 HTTP/3,即有望成为 HTTP 协议的第三个正式版本,也就是说HTTP/3可能要来了. ...

  8. 温故知新,HTTP/2

    版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载. https://blog.csdn.net/wireless_com/article/details ...

  9. app中的长连接与实现方式

    http://mrpeak.cn/blog/http2/   --- 原文 http2.0的好处不仅仅是multiplexing,请求压缩,优先级控制,server push等等都是亮点.  解决连接 ...

最新文章

  1. scrapy 搜索关键字_Scrapy 新浪微博搜索爬虫
  2. Vue 的路由实现 Hash模式 和 History模式
  3. checkboxlist与数组结合用的技
  4. ECSHOP中transport.js和jquery的冲突的简单解决办法
  5. 走心地讨论一下,一个中国码农在硅谷求职的实用经历
  6. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
  7. 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】
  8. 火狐marquee_火狐不支持marquee解决方案
  9. 原子变量与非阻塞同步机制
  10. word转pdf组合的图片出现灰线,如何处理
  11. 李宏毅自然语言处理——指代消歧
  12. VUE使用echarts实现中国地图航线动态展示
  13. 【论文基本功】【LaTeX】公式及其编号
  14. IT定律之计算机行业发展规律——三大定律
  15. 我想去 河南省 郑州春苑置业有限公司 上班 待遇好不好
  16. My97date日期选择设置最大最小值
  17. 影集制作php源码_2018最新仿720全景在线制作云平台网站PHP源码(新增微信支付+打赏+场景红包+本地存储)...
  18. python实验报告及源代码-python满分实验报告:红心大战源代码源码程序
  19. 【成为架构师系列】领导力就是两件事:断物和识人
  20. 区块链中去中心化是什么意思?

热门文章

  1. Packt发布了2018年技能提升报告
  2. Swift学习:字符串和字符(Strings and Characters)
  3. 统计学习方法 --- 感知机模型原理及c++实现
  4. c语言中的errno
  5. 【体系结构】Oracle实例崩溃恢复原理
  6. [RMAN]控制文件的恢复
  7. Linux 系统如何更改主机名
  8. 面试题: 大公司面试 !=!=未看
  9. UITableView长按拖动排序(支持不同行高,不同section间交换)
  10. shell截取字符串的8种方法