Sword HTTP协议之chunk介绍

摘要:
块模式用于传输数据,即HTTP服务器生成数据,HTTP服务器消息头需要设置“传输编码:编码格式”。如果HTTP消息(请求消息或响应消息)的传输编码头的值被分块,则每个非空块以字节数(字节数的十六进制表示)开头该块包含数据。阻塞传输编码仅在HTTP协议1.1版(HTTP/1.1)中提供。

简介

当HTTP服务器无法预知报文长度时,可以使用Transfer-Encoding:chunk模式来传输数据
即HTTP服务器一边产生数据,一边发给客户端,HTTP服务器报文头需要设置"Transfer-Encoding: chunked"来代替Content-Length。

编码格式

如果一个HTTP消息(请求消息或应答消息)的Transfer-Encoding消息头的值为chunked,那么,
消息体由数量未定的块组成,并以最后一个大小为0的块为结束。
每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。
在一些实现中,块大小和CRLF之间填充有白空格(0x20)。最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。
最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。消息最后以CRLF结尾。

编码格式如下:
[chunk size][ ][chunk data][ ][chunk size][ ][chunk data][ ][chunk size = 0][ ][ ]

chunk size是以十六进制的ASCII码表示,比如:头部是3134这两个字节,表示的是1和4这两个ascii字符,被http协议解释为十六进制数14,
也就是十进制的20,后面紧跟[ ](0d 0a),再接着是连续的20个字节的chunk正文。chunk数据以0长度的chunk块结束,也就是(30 0d 0a 0d 0a)。

分块传输编码

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,
允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。
分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供
通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。
数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。
然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,
这样服务器可以发送数据而不需要预先知道发送内容的总大小。通常数据块的大小是一致的,但也不总是这种情况。

HTTP 1.1引入分块传输编码提供了以下几点好处:
HTTP分块传输编码允许服务器为动态生成的内容维持HTTP持久链接。
通常,持久链接需要服务器在开始发送消息体前发送Content-Length消息头字段,但是对于动态生成的内容来说,在内容创建完之前是不可知的。
分块传输编码允许服务器在最后发送消息头字段。对于那些头字段值在内容被生成之前无法知道的情形非常重要,
例如消息的内容要使用散列进行签名,散列的结果通过HTTP消息头字段进行传输。没有分块传输编码时,
服务器必须缓冲内容直到完成后计算头字段的值并在发送内容前发送这些头字段的值。

HTTP服务器有时使用压缩 (gzip或deflate)以缩短传输花费的时间。分块传输编码可以用来分隔压缩对象的多个部分。
在这种情况下,块不是分别压缩的,而是整个负载进行压缩,压缩的输出使用本文描述的方案进行分块传输。
在压缩的情形中,分块编码有利于一边进行压缩一边发送数据,而不是先完成压缩过程以得知压缩后数据的大小。

免责声明:文章转载自《Sword HTTP协议之chunk介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cmd 压缩文件 +jenkins 发送Email邮件附带report报告和日志android开发之shape详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

十大接口

十大接口 一、Response响应封装 1.1封装 from rest_framework.response import Response class APIResponse(Response): def __init__(self, status=0, msg="ok", results=None, http_status=None, head...

Vue简洁及基本用法

初识Vue 一.什么是Vue vue属于前端知识,在学习vue之前,需要简单了解HTML、css、JavaScript的知识。Vue是框架。 Vue是一套构建用户界面的渐进式架构。vue只关注视图层,采用自底向上增量开发的设计。 Vue是为了通过简单的API实现响应的数据绑定 和 组合的视图组件。 二.IDEA中使用Vue 打开idea,找到file...

kafka2.5.0生产者与消费者配置详解

1)引入maven依赖 我这里使用的是springboot 2.1.3.RELEASE 版本: <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId&g...

Python接口自动化(三)post请求四种传送正文方式

HTTP协议规定POST提交的数据必须放在消息主题(entity-body)中,但协议并没有规定数据必须使用什么编码方式。 浏览器行为:Form表单提交 Http协议行为:Http1.1协议   我们知道,HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。规范把HTTP请求分为三个部分:状态行、请求头、消息主体。 <meth...

关于stm32 HardFault_Handler 异常的处理 死机

在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。一般来说运行操作系统  是以下几个问题 1.开始的...

【华为云技术分享】基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一

摘要:仓储管理存在四大细分场景:出入库管理、盘点、分拣和货物跟踪。本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践。 仓储是什么?仓储,是物流生命周期很重要的一部分,首先了解什么物流。 物流,顾名思义“物的流通”,指从物品的供应地向接收地流通,是一个根据实际需要,将运输、核算、储存...