分块传输编码(Chunked Transfer Encoding)是 HTTP/1.1 协议中的一项核心特性,它允许服务器在不预先知道响应体总大小的情况下,高效地传输数据。这项技术解决了传统 Content-Length 机制的局限性,使得 HTTP 协议能够完美地支持流式传输和动态生成内容。

核心机制:告别固定长度的束缚

在 HTTP/1.0 时代,服务器必须在发送响应之前计算出内容的精确字节数,并通过 Content-Length 头部告知客户端。这种模式在处理静态、大小固定的文件时非常有效,但在处理动态内容、大型文件流或实时数据推送时则无能为力。

分块传输正是为此而生。它通过在协议层引入一种灵活的“分块”模式,让服务器可以在数据生成的同时,立即开始向客户端发送

报文格式:精确的“长度-内容”对

分块传输的实现依赖于客户端与服务器之间的严格报文约定。整个响应流分为两个主要部分:响应头和响应体。

1. 响应头:宣告分块模式

服务器首先在响应头中包含 Transfer-Encoding: chunked 字段,以此明确告知客户端,接下来的响应体将以分块方式编码。这个字段会取代传统的 Content-Length

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

2. 响应体:数据块序列

响应体由一个或多个数据块组成,每个数据块都遵循一个精确的格式:[十六进制长度]\r\n[数据内容]\r\n

  • [十六进制长度]:一个十六进制数字,精确表示其后紧跟的数据内容的字节数。
  • \r\n:一个用于分隔长度和内容的换行符。
  • [数据内容]:实际的响应数据。
  • \r\n:一个用于分隔数据内容和下一个数据块(或结束标记)的换行符。

3. 传输结束:零长度标记

当所有数据块都发送完毕后,服务器必须发送一个长度为 0 的特殊数据块,以标志响应体的结束。这个结束标记的格式是 0\r\n\r\n

一个完整的、精确的报文示例:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked4\r\n
Wiki\r\n
5\r\n
pedia\r\n
B\r\nin chunks.\r\n
0\r\n
\r\n
  • 第一个数据块: 4\r\n + Wiki\r\n。长度 4(十六进制)对应内容 Wiki,共 4 个字节。
  • 第二个数据块: 5\r\n + pedia\r\n。长度 5(十六进制)对应内容 pedia,共 5 个字节。
  • 第三个数据块: B\r\n + in chunks.\r\n。长度 B(十六进制)即十进制 11,对应内容 in chunks.,共 11 个字节。
  • 结束标记: 0\r\n\r\n。长度为 0 的数据块,表示数据传输结束。

客户端如何处理:流式解析与重组

对于客户端来说,处理分块传输并非一个简单的文件下载过程,而是一个分阶段的流式解析和重组过程。这项任务通常由客户端底层的 HTTP 库或浏览器引擎自动完成,对上层应用是透明的。

当客户端收到服务器的响应头,发现 Transfer-Encoding: chunked 时,它会立即改变其数据接收模式,进入一个专门用于处理分块编码的状态机。这个状态机的工作流程可以分为以下几个关键步骤:

  1. 读取块大小:客户端会持续从网络套接字(socket)中读取数据,直到遇到第一个 \r\n 序列。它将这之前的所有字节解析为一个十六进制的数字,这个数字就是即将到来的数据块的字节长度。

  2. 读取数据内容:一旦确定了数据块的大小,客户端就会精确地从套接字中读取相应数量的字节。这些字节就是该数据块的实际内容。这个过程是阻塞的,客户端会等待所有字节都到达,然后才继续下一步。

  3. 读取块结束标记:在读取完数据内容后,客户端会继续从流中读取两个字节 (\r\n)。这只是一个分隔符,用于将数据内容和下一个块的长度隔开。客户端会简单地丢弃这两个字节。

  4. 循环与终止判断:在完成上述三个步骤后,客户端会根据上一步读取到的块大小进行判断:

    • 如果块大小不为零,客户端会回到第 1 步,继续读取下一个块的长度,并重复整个过程。
    • 如果块大小为零,这意味着服务器已经发送了所有数据。客户端会再读取最后的 \r\n,然后将整个流标记为结束。

一旦整个分块传输过程完成,客户端的 HTTP 库就会将所有读取到的数据块拼接起来,形成一个完整的、逻辑上连续的数据流。这个流随后会被交给上层应用,而上层应用根本不需要知道数据是以分块形式传输的,它们可以直接像处理普通响应一样处理这个完整的数据流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95206.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95206.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95206.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 项目首屏加载速度优化

Vue 项目首屏加载从 5s 到 1.5s:4 步落地优化方案,附完整代码 数据对比前段时间我在做一个活动时,打包加载后发现打开页面要等半天,经过几天的优化,最终将首屏加载时间从5秒压到 1.5 秒。这篇文章会把整个优化过程拆解…

Java学习第十六部分——JUnit框架

目录 一.概述 二.作用 三.版本 四.优势 五.局限性 六.发展方向 七.核心组件 1 测试用例 2.断言(Assertions) 3.测试生命周期 4.测试运行器 八.简单示例 九.JUnit 4 与 JUnit 5 的区别 十.idea项目实战 1.在idea中创建Java项目&#xff0c…

[吾爱原创] 千千每日计划

[吾爱原创] 千千每日计划 链接:https://pan.xunlei.com/s/VOYuE8p-KIV-NJr2_0d1Ak9YA1?pwdbqez# 介绍:千千系列的最后一款软件,一款每日计划的一款软件,并且支持时间段修改和打卡和导入导出等功能。 功能: 1.设置每天的计划 2…

docker命令(二)

目录 docker命令 1.inspect命令(查看镜像信息) 2.tag命令(为镜像起别名) 3.--help命令(查看命令的使用帮组) docker 命令 --help docker --help 4.run命令 1.格式 2.启动tomcat镜像 3. docker 不能被外部访…

Dockerfile实现java容器构建及项目重启(公网和内网)

公网情况0.Dockerfile关键字关键字作用一句话出现位置FROM指定基础镜像(任何 Dockerfile 必须且首行)全局RUN在镜像构建阶段执行命令(常用来安装软件)构建期COPY把宿主机文件/目录复制进镜像构建期ADD类似 COPY,但额外…

SpringCloud与Dubbo深度对比:架构、性能与生态全解析

引言在微服务架构盛行的今天,服务治理框架的选择成为企业技术栈决策的关键环节。Spring Cloud和Dubbo作为Java生态中最具代表性的两大微服务框架,各自拥有独特的优势和适用场景。本文将从架构设计、服务治理、性能表现、生态系统等多个维度进行深度对比&…

简历书写---自我评价怎么写

前言 今天一对一辅导了很多同学做简历,看到很多同学简历上都有一栏:自我评价 那我们就要思考一下,我们搞技术的,一份技术简历,自我评价上怎么写,才能算一个加分点呢? 观点分享 首先,…

嵌入式Linux学习 - 数据库开发

目录 一. 在终端的使用 1. 下载 2. 操作 3. 相关函数 1.增 2. 删 3. 改 4. 查 5. 补充函数 二. 在软件的使用 1. 下载 2. 操作 三. 在编程的使用 1. 下载 2. 相关函数 1. 打开 2. 读写执行sql语句 3. 关闭 一. 在终端的使用 1. 下载 sudo apt-get install …

产品运营必备的职场通用能力有哪些?如何一步步提升?

在流量红利消退的存量竞争时代,产品运营岗位正经历价值重构。单纯的活动策划与用户维护已无法满足发展需求,数据驱动的精细化运营成为行业分水岭。面对这场变革,复合能力建设与前瞻工具掌握是运营人突破天花板的密钥。推荐考取CDA数据分析师&…

ESPTimer vs GPTimer:ESP32 定时器系统深度解析

第十五章和第十六章分别学习了​​ESPTimer​​ 和 ​​GPTimer​​ ,那这两种定时器有什么区别,如何使用呢,下面探讨下。1. 两种定时器对比介绍1.1 两种定时器设计在 ESP32 开发中,​​ESPTimer​​ 和 ​​GPTimer​​ 是两种完…

【70页PPT】WMS助力企业数字化转型(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91806268 资料解读:【70页PPT】WMS助力企业数字化转型 详细资料请看本解读文章的最后内容。仓储管理在企业运营中占据关键地位&a…

[光学原理与应用-337]:ZEMAX - 自带的用于学习的样例设计

ZEMAX(OpticStudio)内置了大量样例设计文件,这些文件覆盖了从基础光学原理到复杂系统设计的全场景,是学习光学设计、掌握软件操作、理解像差理论的绝佳资源。以下是ZEMAX自带样例设计的详细分类、使用方法及学习价值分析&#xff…

下一波红利:用 #AI编程 闯入小游戏赛道,#看广告变现 模式正在崛起!

文章标题(可选,均包含核心关键词) 【主推标题】 #AI编程制作小游戏 的终极 #变现 指南:如何通过 #看广告变现 轻松赚钱 【疑问式标题】 #AI制作小游戏 真的能赚钱吗?揭秘 #AI编程赚钱 的四大核心路径与广告变现策略 【趋势型标题】 下一波红利:用 #AI编程 闯入小游戏赛道…

【git】add后不想commit怎么实现pull

本地有改动已 git add 到暂存区(stage),但是还没 commit,同时远端有 28 个新提交需要拉取。 直接 git pull 会冲突或被拒绝,因为你本地有 staged 修改。 处理步骤有几种方案,我给你推荐最稳妥的几种:✅ 方法 1&#xf…

Unable to establish SSL connection. curl静态编译

博主有个老RHEL系统,内核2.6.18;ssl不管用了,最简单的wget也不行,下面编个静态编译的新版 curl 用用(不影响yum源,不然的话系统自带的旧版 OpenSSL 受影响得得不偿失),来最优化解决下…

Redis-08 SpringBoot集成Redis常见问题

SpringBoot集成Redis的教程网上很多,总体来说就是三个步骤:添加依赖、修改配置文件、自定义Redis配置类(自定义序列化器),具体步骤可自行搜索,本文主要解惑集成中的常见疑问。 1,选择什么依赖&…

数据结构:选择排序 (Selection Sort)

目录 从学生排队开始 算法的初始状态和核心操作 代码的逐步完善 第一阶段:定义函数框架和外层循环 第二阶段:实现“寻找最小元素”的逻辑(内层循环) 第三阶段:完成“交换”操作 复杂度与特性分析 时间复杂度 (…

Django Admin 管理工具

一、简介Django Admin 是 Django 框架最受欢迎和强大的特性之一。它是一个自动生成的管理后台,允许开发者无需或仅需编写少量代码,就能对网站的数据模型(数据库中的表)进行直观的增、删、改、查(CRUD)操作。…

园区智慧水电管理系统:让能源管理从“成本黑洞”变“利润引擎”

园区智慧水电管理系统,是一套专为产业园区、科技园、企业总部等大型空间设计的集智能计量、远程管控、自动计费、能耗分析于一体的数字化能源解决方案。它用技术手段解决水电管理中的“抄表难、收费乱、浪费多、数据缺”四大顽疾,真正实现降本、提效、控…

DeepSeek应用技巧-通过MCP打造数据分析助手

本文章将通过MCP服务来打造一个数据分析助手,可以直接读取本地的excel或csv的文件,然后生成可视化的报告并保存在本地,十分有应用和实践的价值,话不多说,我们开始手把手搭建。一、知识应用(1)Fu…