HTTP协议之chunk编码(分块传输编码)

分块传输编码Chunked transfer encoding)是超文本传输协议(HTTP)中的一种传输数据机制,同意HTTP由应用server发送给client应用( 一般是网页浏览器)的数据能够分成多个部分。分块传输编码仅仅在HTTP协议1.1版本号(HTTP/1.1)中提供。

通常,HTTP应答消息中发送的数据是整个发送的。Content-Length消息头字段表示数据的长度。数据的长度非常重要,由于client须要知道哪里是应答消息的结束,以及兴许应答消息的開始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样server能够发送数据而不须要预先知道发送内容的总大小。

通常数据块的大小是一致的。但也不总是这样的情况。

HTTP 1.1引入分块传输编码提供了下面几点优点:

  1. HTTP分块传输编码同意server为动态生成的内容维持HTTP持久连接。通常,持久链接须要server在開始发送消息体前发送Content-Length消息头字段,可是对于动态生成的内容来说。在内容创建完之前是不可知的。[动态内容,content-length无法预知]
  2. 分块传输编码同意server在最后发送消息头字段。

    对于那些头字段值在内容被生成之前无法知道的情形非常重要。比如消息的内容要使用散列进行签名,散列的结果通过HTTP消息头字段进行传输。

    没有分块传输编码时,server必须缓冲内容直到完毕后计算头字段的值并在发送内容前发送这些头字段的值。[散列签名,需缓冲完毕才干计算]

  3. HTTPserver有时使用压缩 (gzip或deflate)以缩短传输花费的时间。分块传输编码能够用来分隔压缩对象的多个部分。在这样的情况下,块不是分别压缩的,而是整个负载进行压缩,压缩的输出使用本文描写叙述的方案进行分块传输。在压缩的情形中,分块编码有利于一边进行压缩一边发送数据,而不是先完毕压缩过程以得知压缩后数据的大小。[gzip压缩。压缩与传输同一时候进行]

普通情况HTTP的Header包括Content-Length域来指明报文体的长度。有时候服务生成HTTP回应是无法确定消息大小的,比方大文件的下载,或者后台须要复杂的逻辑才干所有处理页面的请求,这时用须要实时生成消息长度。server一般使用chunked编码。

在进行Chunked编码传输时。在回复消息的Headers有transfer-coding域值为chunked,表示将用chunked编码传输内容。

使用chunked编码的Headers例如以下(能够利用FireFox的FireBug插件或HttpWatch查看Headers信息):

 採用下面方式编码:   
    Chunked-Body=*chunk   
           "0"CRLF   
           footer   
           CRLF   
    chunk=chunk-size[chunk-ext]CRLF   
        chunk-dataCRLF   
    
    hex-no-zero=<HEXexcluding"0">   
    
    chunk-size=hex-no-zero*HEX   
    chunk-ext=*(";"chunk-ext-name["="chunk-ext-value])   
    chunk-ext-name=token   
    chunk-ext-val=token|quoted-string   
    chunk-data=chunk-size(OCTET)

  footer=*entity-header

  编码使用若干个Chunk组成。由一个标明长度为0的chunk结束,每一个Chunk有两部分组成,第一部分是该Chunk的长度和长度单位(一般不 写),第二部分就是指定长度的内容。每一个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容。是一些没有写的头部内 容。   

    下面给出一个Chunked的解码过程(RFC文档中有)   
    length:=0   
    readchunk-size,chunk-ext(ifany)andCRLF   
    while(chunk-size>0){   
    readchunk-dataandCRLF   
    appendchunk-datatoentity-body   
    length:=length+chunk-size   
    readchunk-sizeandCRLF   
    }   
    readentity-header   
    while(entity-headernotempty){   
    appendentity-headertoexistingheaderfields   
    readentity-header   
    }   
    Content-Length:=length   
    Remove"chunked"fromTransfer-Encoding

时间: 2024-12-14 17:24:47

HTTP协议之chunk编码(分块传输编码)的相关文章

HTTP 协议中的 Content-Encoding 和 Transfer-Encoding(内容编码和传输编码)

转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HTTP 协议中还有另外一个头部与编码有关:Content-Encoding(内容编码).Content-Encoding 通常用于对实体内容进行压缩编码,目的是优化传输,例如用 gzip 压缩文本文件,能大幅减小体积.内容编码通常是选择性的,例如 jpg / png 这类文件一般不开启,因为图片格式已

HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP

题图:by @Olga Hi,大家好,我是承香墨影! HTTP 协议在网络知识中占据了重要的地位,HTTP 协议最基础的就是请求和响应的报文,而报文又是由报文头(Header)和实体组成.大多数 HTTP 协议的使用方式,都是依赖设置不同的 HTTP 请求/响应 的 Header 来实现的. 本系列<实用 HTTP>就抛开常规的 Header 讲解式的表述方式,从实际问题出发,来分析这些 HTTP 协议的使用方式,到底是为了解决什么问题?同时讲解它是如何设计的和它实现原理. HTTP 协议是一

#WEB安全基础 : HTTP协议 | 0x11 HTTP的分块传输模块

HTTP通信中,请求的编码实体资源没全部传输完成之前,浏览器无法显示页面,所以传输大容器数据时,把数据分块,能让浏览器逐步显示页面,这就叫分块传输模块 请看分块传输的流程图 每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用"0(CR-LF)"来标记 使用分块传输编码的实体主体会由接收内容的客户端负责解码,恢复到编码前的实体主体 HTTP/1.1 存在一种传输编码的机制,他可以在通信时按照某种编码方式来传输,但只定义作用于分块传输编码中 对于编码的研究,以后可以仔细学习,如

C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP协议可用于实现直播.点播应用,通过FMLE(Flash Media Live Encoder)推送音视频数据至RtmpServer,可

RFID 基础/分类/编码/调制/传输

不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且不同频段的RFID产品会有不同的特性. 其中感应器有无源和有源两种方式,下面详细介绍无源的感应器在不同工作频率产品的特性以及主要的应用. 1. 低频(从125KHz到134KHz)   其实RFID技术首先在低频得到广泛的应用和推广.该频率主要是通过电感耦合的方式进行工作, 也就是在读写器线圈和感应

C++实现RTMP协议发送H.264编码及AAC编码的音视频

转自:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP协议可用于实现直播.点播应用,通过FMLE(Flash Me

(转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP

UTF-8和GBK编码之间的区别(页面编码、数据库编码区别)以及在实际项目中的应用

第一节:UTF-8和GBK编码概述 UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码,它包含全世界所有国家需要用到的字符,是国际编码,通用性强,是用以解决国际上字符的一种多字节编码.由Ken Thompson于1992年创建.UTF-8用1到4个字节编码UNICODE字符,它对英文使用8位/8Bit(即1个字节/1Byte),中文使用24位/24Bit(3个字节/3Byte)来编码.用在网页上可以同一页

HTTP分块传输

HTTP分块传输 用途 对于在发送HTTP头部前,无法计算出Content-Length的HTTP请求及回复(例如WEB服务端产生的动态内容),可以使用分块传输,使得不至于等待所有数据产生后,再发送带有Content-Length的HTTP头部,而是将已经产生的数据一块一块发送出去. 特点: 1,HTTP BODY数据成连续的块传输,每块数据的最开始处,指明了该数据块的大小,随后则是CRLF,数据,及结尾CRLF: HTTP HEADERS <CRLF> 1E<CRLF> DATA