热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpchunkedtrailerheader,HTTP1.1協議的chunked編碼(chunkedtransferencoding分塊傳輸編碼)...

一般情況HTTP的Header包含Content-Length域來指明報文體的長度。有時候服務生成HTTP回應是無法確定消息大小的,比如大文件的下載,或

一般情況HTTP的Header包含Content-Length域來指明報文體的長度。

有時候服務生成HTTP回應是無法確定消息大小的,比如大文件的下載,或者后台需要復雜的邏輯才能全部處理頁面的請求,這時用需要實時生成消息長度,服務器一般使用chunked編碼。采用chunked編碼有兩種選擇,一種是設定Server的IO buffer長度讓Server自動flush buffer中的內容,另一種是手動調用IO中的flush函數。不同的語言IO中都有flush功能:

- php: ob_flush(); flush();

- perl: STDOUT->autoflush(1);

- java: out.flush();

- python: sys.stdout.flush()

- ruby: stdout.flush

使用chunked編碼的Headers如下(可以利用FireFox的FireBug插件或HttpWatch查看Headers信息,HttpWatch還可以查看chunked的個數):

20ccda3a01d27c82399000cab7e91c11.png

Chunked編碼一般使用若干個chunk串連而成,最后由一個標明長度為0的chunk標示結束。每個chunk分為頭部和正文兩部分,頭部內容指定下一段正文的字符總數(非零開頭的十六進制的數字)和數量單位(一般不寫,表示字節).正文部分就是指定長度的實際內容,兩部分之間用回車換行(CRLF)隔開。在最后一個長度為0的chunk中的內容是稱為footer的內容,是一些附加的Header信息(通常可以直接忽略)。

上述解釋過於官方,簡而言之,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"),這些頭域可以在解碼后附加在現有頭域之后

b7f0599c0886ea1debe7f2822cf8b501.gif

看一個wireshark抓包的結果:

f5cd779a64e58c8de4ed6f2937767291.png

這里面只有一個有意義的chunke以及一個footer。第一個chunk,頭部是3134這兩個字節,表示的是1和4這兩個ascii字符,被http協議解釋為十六進制數14,也就是十進制的20。后面緊跟0d0a,再接着是20個字節的chunk正文(圖中的011e~0131)。

后面再接着0d0a,然后就是footer了,30表示ascii字符0,http解釋為長度是0(也說明了這是最后一個chunk),后面緊跟0d0a,然后正文部分為空,再接0d 0a表示結束

轉載文章:

1)http://blog.csdn.net/zhangboyj/article/details/6236780

2)http://www.cnblogs.com/jhxk/articles/2715848.html

3)http://www.cnblogs.com/jhxk/articles/2715848.html



推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 我创建了一个新的AWSSSO(使用内部IDP作为身份源,因此不使用ActiveDirectory)。我能够登录AWSCLI、AWSGUI,但 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • Ihavethisfollowinginputfile:我有以下输入文件:test.csvdone_cfg,,,,port<0>,clk_in,subcktA,ins ... [详细]
  • 学习mybatis的基础知识:mybatis入门教程(二)
    2019独角兽企业重金招聘Python工程师标准2.3MyBatisprintsql在log4j.properties配置文件中添加如下配置,让mybatis打 ... [详细]
author-avatar
飞松安步当车9_U
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有