`

HTTP协议中的Tranfer-Encoding

阅读更多

HTTP协议中的Tranfer-Encoding


当不能预先确定报文体的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就需要通过Transfer-Encoding域来确定报文体长度。

    通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。chunked编码是HTTP/1.1 RFC里定义的一种编码方式,因此所有的HTTP/1.1应用都应当支持此方式。

    chunked编码的基本方法是将大块数据分解成多块小数据,每块都可以自指定长度,其具体格式如下(BNF文法):

    Chunked-Body   = *chunk            //0至多个chunk

                     last-chunk         //最后一个chunk 

                     trailer            //尾部

                     CRLF               //结束标记符


   chunk          = chunk-size [ chunk-extension ] CRLF   

                        chunk-data CRLF

   chunk-size     = 1*HEX

   last-chunk     = 1*("0") [ chunk-extension ] CRLF


   chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )

   chunk-ext-name = token

   chunk-ext-val  = token | quoted-string

   chunk-data     = chunk-size(OCTET)

   trailer        = *(entity-header CRLF)      

    

    解释:

    Chunked-Body表示经过chunked编码后的报文体。报文体可以分为chunk, last-chunk,trailer和结束符四部分。chunk的数量在报文体中最少可以为0,无上限;每个chunk的长度是自指定的,即,起始的数据必然是16进制数字的字符串,代表后面chunk-data的长度(字节数)。这个16进制的字符串第一个字符如果是“0”,则表示chunk-size为0,该chunk为last-chunk,无chunk-data部分。可选的chunk-extension由通信双方自行确定,如果接收者不理解它的意义,可以忽略。

    trailer是附加的在尾部的额外头域,通常包含一些元数据(metadata, meta means "about information"),这些头域可以在解码后附加在现有头域之后。

    实例分析:

    下面分析用ethereal抓包使用Firefox与某网站通信的结果(从头域结束符后开始):

Address  0..........................  f

000c0                                31

000d0    66 66 63 0d 0a ...............   // ASCII码:1ffc\r\n, chunk-data数据起始地址为000d5

         很明显,“1ffc”为第一个chunk的chunk-size,转换为int为8188.由于1ffc后马上就是

         CRLF,因此没有chunk-extension.chunk-data的起始地址为000d5, 计算可知下一块chunk的起始

         地址为000d5+1ffc + 2=020d3,如下:

020d0    .. 0d 0a 31 66 66 63 0d 0a .... // ASCII码:\r\n1ffc\r\n

         前一个0d0a是上一个chunk的结束标记符,后一个0d0a则是chunk-size和chunk-data的分隔符。

         此块chunk的长度同样为8188, 依次类推,直到最后一块

100e0                          0d 0a 31

100f0    65 61 39 0d 0a......            //ASII码:\r\n\1ea9\r\n

         此块长度为0x1ea9 = 7849, 下一块起始为100f5 + 1ea9 + 2 = 11fa0,如下:

100a0    30 0d 0a 0d 0a                  //ASCII码:0\r\n\r\n

         “0”说明当前chunk为last-chunk, 第一个0d 0a为chunk结束符。第二个0d0a说明没有trailer部分,整个Chunk-body结束。

    解码流程:

    对chunked编码进行解码的目的是将分块的chunk-data整合恢复成一块作为报文体,同时记录此块体的长度。

    RFC2616中附带的解码流程如下:(伪代码)

    length := 0         //长度计数器置0

    read chunk-size, chunk-extension (if any) and CRLF      //读取chunk-size, chunk-extension

                                                          //和CRLF

    while(chunk-size > 0 )   {            //表明不是last-chunk

          read chunk-data and CRLF            //读chunk-size大小的chunk-data,skip CRLF

          append chunk-data to entity-body     //将此块chunk-data追加到entity-body后

          read chunk-size and CRLF          //读取新chunk的chunk-size 和 CRLF

    }

    read entity-header      //entity-header的格式为name:valueCRLF,如果为空即只有CRLF

    while (entity-header not empty)   //即,不是只有CRLF的空行

    {

       append entity-header to existing header fields

       read entity-header

    }

    Content-Length:=length      //将整个解码流程结束后计算得到的新报文体length

                                 //作为Content-Length域的值写入报文中

    Remove "chunked" from Transfer-Encoding  //同时从Transfer-Encoding中域值去除chunked这个标记

    length最后的值实际为所有chunk的chunk-size之和,在上面的抓包实例中,一共有八块chunk-size为0x1ffc(8188)的chunk,剩下一块为0x1ea9(7849),加起来一共73353字节。

    注:对于上面例子中前几个chunk的大小都是8188,可能是因为:"1ffc" 4字节,"\r\n"2字节,加上块尾一个"\r\n"2字节一共8字节,因此一个chunk整体为8196,正好可能是发送端一次TCP发送的缓存大小。

分享到:
评论

相关推荐

    转移文件

    这里我们将深入探讨文件转移的相关知识点,以及如何使用`tranfer-file-master`这个可能包含工具或脚本的压缩包来实现高效、安全的文件传输。 一、文件转移的常见方式 1. **本地文件移动/复制**:在同一台计算机上...

    网络协议图

    TCP(Tranfer Control Protocal)传输控制协议是一个面向连接的协议,当使用这个协议 时,网络可以保证客户端和服务器端的连接是可靠的、安全的。 UDP(User Datagram Protocal)用户数据报协议是一种非面向连接的...

    screen tranfer

    这通常通过加密技术实现,如TLS/SSL协议,确保数据在传输过程中的安全。 6. **分辨率与帧率**: 不同设备的屏幕分辨率和帧率可能不同,屏幕传输需要处理这些差异,确保在不同设备上都能正确显示。 7. **多平台兼容...

    heat and mass tranfer

    a book on heat and mass transfer

    FSBB30CH60伺服电机驱动模块ALTIUM设计硬件原理图PCB+AD集成封装库文件.zip

    FSBB30CH60伺服电机驱动模块ALTIUM设计硬件原理图PCB+AD集成封装库文件,硬件4层板设计,大小为188mmx135mm,ALTIUM设计的工程文件,包括完整的...Tranfer EI33变压器 Trans 共模电感 ULN2003 ULN2003 Volt Reg LM7805

    tranfer.rar_coordinates_地心坐标

    将球面坐标转换为地心坐标,测试无误,自带数据集,具体应用修改参数即可

    hadooplib.zip

    用户可将多个 Java applet 及其所需组件(.class 文件、图像和声音)绑定到 JAR 文件中,而后作为单个的简单 HTTP(Hypertext Tranfer Protocal,超文本传输协议)事务下载到浏览器中,从而大大提高下载速度。...

    donny681-stc51_lora-master.zip_lora_lora 51_lora stc15_lora stm3

    在描述中提到的“LORA TRANFER MASTER INCLUDE STM32F103”,表明这个项目是关于LoRa通信的主控端实现,可能包含了使用STM32F103作为主控制器来处理LoRa传输的相关代码和配置。STM32F103是一款广泛应用的微控制器,...

    Filetranfer 用MFC编写的文件传输

    在本文中,我们将深入探讨如何利用MFC进行文件传输的实现。 首先,我们需要了解MFC中的基本组件和机制。MFC基于面向对象编程,它封装了Windows的消息处理机制,通过消息映射(Message Map)将消息与函数关联起来。...

    layui 穿梭框transfer右侧数据赋值排序错乱小技巧.doc

    在本文中,我们将讨论一个 layui 框架中的小技巧,该技巧可以解决穿梭框transfer右侧数据赋值排序错乱的问题。 layui 是一个基于JavaScript的前端UI框架,提供了多种实用的UI组件,包括穿梭框transfer。穿梭框...

    Java网络编程Java网络编程Java网络编程

    1. TCP 是 Tranfer Control Protocol 的简称,是一种面向连接的保证可靠传输的协议。通过 TCP 协议传输,得到的是一个顺序的无差错的数据流。 2. UDP 是 User Datagram Protocol 的简称,是一种无连接的协议,每个...

    LONATL罗纳地G61Q电脑编程软件操作使用说明分享.pdf

    * Air blowing tranfer 剪刀架吹气 * First feed terry lewer 全起毛刀 * First feed terry lewer half cylinder 半起毛刀 * Heel toe terry lewer 倒车起毛刀 * Rib terry lewer feed 抽条起毛刀 * Ducking stitch ...

    FUNDAMENTALS-OF-HEAT-and-MASS-TRANSFER 7ed.rar

    《传热传质基础》是工程领域中一门重要的专业课程,主要探讨热量和质量在不同介质间传递的原理与方法。第七版的教材《FUNDAMENTALS-OF-HEAT-and-MASS-TRANSFER》深入浅出地阐述了这一领域的核心概念和计算技巧。配套...

    NEC8100编程手册

    - 在15-03-15项中,通过按"音量+/-"键选择分机端口,将所有已连接的分机中的"0"改为"1",然后按"HOLD"键确认,以取消回铃并允许通话直接建立。 5. **呼入立即振铃**: - 设置10-08-01为1,确保电话在接收到呼入时...

    The Journal of Technology Transfer

    为了达到这一目的,作者们构建了一个框架来处理文献中提到的方法论问题。该框架的主要特征包括定义和分类不同类型的影响力、估算(大致数量级)这些影响力以及开发多变量模型来解释这些不同的影响力,其中包括传统的...

    serial oscilation

    RLC serial oscilation,tranfer curve.

    cui组件 jquery组件库

    在本篇文章中,我们将深入探讨CUI组件库的核心概念、主要功能以及如何在实际项目中应用。 CUI组件库的核心在于它提供的各种UI组件,这些组件涵盖了网页设计中的常见元素,如按钮、表单、导航菜单、弹窗、提示信息、...

    经编CAD常用英文词典

    2. **FTP传输** - Tranfer FTPS:使用FTP(File Transfer Protocol)协议进行安全传输,FTPS是一种支持SSL/TLS加密的FTP变体。 3. **S型链块** - S chain:一种特定的经编织物结构,由S形排列的链环组成。 4. **S...

    time-example.rar_Time_gmtime

    1.程序分析: 2.程序源代码: #include "stdio.h" #include "conio.h" #include "time.h" void main() { time_t lt /*define a longint ... printf(asctime(gmtime(&lt))) /*tranfer to Greenwich time*/ getch() }

    Multi-Domain Transfer Learning for Early Diagnosis of Alzheimer's Disease

    文章的标题和描述中蕴含着以下几个重要知识点: 1. 迁移学习(transfer learning):这是机器学习中的一个概念,指的是利用在某个领域或任务上学到的知识来帮助解决另一个不同但相关的领域或任务的学习过程。在...

Global site tag (gtag.js) - Google Analytics