分块编码

分块编码

分块编码传输是和持久连接配合使用的,因为如果不是持久连接的话就不需要知道长度等信息,只需要读到连接关闭即可。在持久连接的情况下,如果是服务端动态创建内容可能无法提前知道主体的长度,Content-Length也就无法明确,自然也就无法确认某次响应需要读取多少数据。这时候就可以利用分块编码传输解决这个问题,同时分块的方式也可以提高效率。比如传输过程中需要使用压缩技术,分块可以实现一边压缩一边传输。

分块编码基本格式如下(以响应报文为例):

js 复制代码
HTTP/1.1 200 OK<CR><LF> // 响应行
Content-Type: text/plain<CR><LF> // 此行及其以下是响应头
Transfer-Encoding: chunked<CR><LF>
Trailer: Content-MD5<CR><LF>
<CR><LF>

11<CR><LF> // 此行及其以下是响应体
123456789012345678901234567<CR><LF>
12<CR><LF>
1234567890123456789012345678<CR><LF>
...
0<CR><LF>
<CR><LF>

响应行和常规的HTTP响应报文一致,包含协议版本,响应状态码和原因短语。响应头的各个标头字段键值对。

需要注意的是,如果是分块编码则Transfer-Encoding必须指定为chunked。然后以一个<CR><LF>和主体部分分隔,接下去就是一个个数据分块,其中每个分块的格式都是一致的。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的CRLF(\r\n)。

js 复制代码
length<CR><LF>
data<CR><LF>

length是十六进制的数据长度,最后一个分块长度值必须为 0,对应的分块数据没有内容,表示数据传输结束,这时候接收端就会认为这次的数据已经读取完成了。

其中分块传输除了上面提到的优点之外还有一个好处就是方便在主体内容传输完成之后再补充一些Header信息。如同示例中的Content-MD5,因为一开始无法知道主体的全部内容自然也是无法计算数据校验信息,这时候如果使用chunked再配合Trailer头就可以在分块数据的末尾补充一些Header信息。

相关推荐
Marshall1517 分钟前
DC-SDK 实战指南:基于 Cesium 的三维数字孪生大屏开发 前言 在当今数字孪生、智慧城市等领域的开发中,三维地图可视化已经成为核心需求。
前端
少云清32 分钟前
【UI自动化测试】5_web自动化测试 _元素操作和元素信息获取
前端·web自动化测试
lyyl啊辉2 小时前
2. Vue数据双向绑定
前端·vue.js
CappuccinoRose2 小时前
CSS 语法学习文档(十七)
前端·css·学习·布局·houdini·瀑布流布局·csspaintingapi
keyborad pianist2 小时前
Web开发 Day1
开发语言·前端·css·vue.js·前端框架
Never_Satisfied3 小时前
在HTML & CSS中,可能导致父元素无法根据子元素的尺寸自动调整大小的情况
前端·css·html
We་ct3 小时前
LeetCode 101. 对称二叉树:两种解法(递归+迭代)详解
前端·算法·leetcode·链表·typescript
码云数智-大飞3 小时前
微前端架构落地实战:qiankun vs Module Federation 2026 深度对比与选型指南
前端·架构
IT枫斗者3 小时前
MyBatis批量插入性能优化:从5分钟到3秒的工程化实践
前端·vue.js·mysql·mongodb·性能优化·mybatis
前端 贾公子3 小时前
深入理解 Vue3 的 v-model 及自定义指令的实现原理(中)
前端·html