参考链接:

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: chunked25\r\n
This is the data in the first chunk\r\n1C\r\n
and this is the second one\r\n3\r\n
con\r\n8\r\n
sequence\r\n\0\r\n
\r\n

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

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

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

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

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

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

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

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

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

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

  5. libcurl API 常用函数

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

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

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

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

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

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

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

  9. 温故知新,HTTP/2

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

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

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

最新文章

  1. pycharm 远程环境开发调试
  2. 阻止表中出现重复项——SQL UNIQUE 约束
  3. 为什么在JavaScript中0.1+0.2不等于0.3?
  4. 【JS】call,apply,bind
  5. 类似于QQ游戏百万人同时在线的服务器架构实现
  6. python 机器识别_用Python端对端数据分析识别机器人“僵尸粉”
  7. 一致性算法之Raft算法
  8. openstack ice自定义调度算法项目详解(horizon、novaclient、api、scheduler、db、自定义数据库)
  9. 今日参与会议后的感悟
  10. 基于JSP的物流信息管理系统(MySQL版)
  11. 不得不会的软件测试bug分析定位技巧
  12. LAME应用教学--HIFI级MP3制作之路
  13. HNUST - 数据库课设
  14. 自定义控件其实很简单2
  15. 《数据结构(C语言版)》笔记-1.1 什么是数据结构
  16. FFMPEG API函数根据SDP文件接收RTP媒体流
  17. BASE64编码的图片在网页中的显示问题
  18. MyC++基础知识补漏
  19. Indy IdTcpserver
  20. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第三套) 附答案

热门文章

  1. Java中System.setProperty()用法
  2. 洛谷——P1219 八皇后
  3. C语言 满分代码 L1-047 装睡(解题报告)
  4. mysql 记录所有操作_mysql 的一些记录的操作
  5. linux安装trac+svn+apache+wike,windos中Trac+apache+svn的安装与配置
  6. python常见内置函数_python常见的内置函数
  7. Java串口包Javax.comm的安装
  8. 异步通知和同步通知_CCF NOI 2020 网上同步赛报名通知
  9. 限制服务器访问指定网站,如何允许或限制某一国或地区的用户访问网站
  10. android新闻管理,Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储...