zoukankan      html  css  js  c++  java
  • http 响应头---content-length

    一、Content-Length

    1.1 内容校验的方式

    对于http的请求返回结果要进行内容的长度校验主要有两种方式,二者互斥使用

      • 1、客户端在http头(head)加Connection:keep-alive时,服务器的response是Transfer-Encoding:chunked的形式,通知页面数据是否接收完毕,例如长连接或者程序运行中可以动态的输出内容,例如一些运算比较复杂且需要用户及时的得到最新结果,那就采用chunked编码将内容分块输出。
      • 2、除了如1所述之外的情况一般都是可以获取到Content-Length的。

    1.2 Content-Length概念

      在HTTP协议中,Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度

      “The entity-length of a message is the length of the message-body before any transfer-codings have been applied”。也就是有chunk就不能有content-length 。

    1.3 Content-Length获取规则

    • 1、响应为1xx,204,304相应或者head请求,则直接忽视掉消息实体内容。
    • 2、如果有Transfer-Encoding,则优先采用Transfer-Encoding里面的方法来找到对应的长度。比如说Chunked模式,就通过chunk机制来处理这种情况。HTTP1.1必须支持chunk模式。因为当不确定消息长度的时候,可以通过chunk机制来处理这种情况。也就是动态发送数据,而不是一次性将所有数据全部发送过来,所以每次发送的数据的长度大小需要发送时才能确定,此时,即使设置了Content-Length也会被忽略。
    • 3、“如果head中有Content-Length,那么这个Content-Length既表示实体长度,又表示传输长度。如果实体长度和传输长度不相等(比如说设置了Transfer-Encoding),那么则不能设置Content-Length。如果设置了Transfer-Encoding,那么Content-Length将被忽视”。这句话翻译的优点饶,其实关键就一点:有了Transfer-Encoding,则不能有Content-Length。获取长度后,就可以根据长度获取报文,然后判断是否进行了压缩,也就是Content-Enconding字段。
    • 4、Range传输。不关注,没详细看了:)
    • 5、通过服务器关闭连接能确定消息的传输长度。(请求端不能通过关闭连接来指明请求消息体的结束,因为这样可以让服务器没有机会继续给予响应)。这种情况主要对应为短连接,即非keep-alive模式。主要是在HTTP1.1版本之前。

    二、chunk机制

    2.1 chunked编码

    2.1.1 概念

      分块传输编码(Chunked transfer encoding)是只在HTTP协议1.1版本(HTTP/1.1)中提供的一种数据传送机制。以往HTTP的应答中数据是整个一起发送的,并在应答头里Content-Length字段标识了数据的长度,以便客户端知道应答消息的结束。

    2.1.2 优点

    • 对于动态生成的应答内容来说,内容在未生成完成前总长度是不可知的。因此需要先缓存生成的内容,再计算总长度填充到Content-Length,再发送整个数据内容。这样显得不太灵活,而使用分块编码则能得到改观。
    • 分块传输编码允许服务器在最后发送消息头字段。例如在头中添加散列签名。
    • 对于压缩传输传输而言,可以一边压缩一边传输

    2.1.3 格式

      如果在http的消息头里Transfer-Encoding为chunked,那么就是使用此种编码方式。接下来会发送数量未知的块,每一个块的开头都有一个十六进制的数,表明这个块的大小,然后接CRLF(" ")。然后是数据本身,数据结束后,还会有CRLF两个字符。有一些实现中,块大小的十六进制数和CRLF之间可以有空格
      最后一块的块大小为0,表明数据发送结束最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。消息最后以CRLF结尾

    2.2 实战

    抓包截图:

    2.3 测试

      如何测试自己的程序支持接收这种编码方式的数据呢?第一想到的当然是配下服务器,使其固定以这种方式发数据,但是没有搜索到如果把apache配成这个模式。好在强大的Stack Overflow里找到了有用信息。
      http://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx 这个页面就是chunked编码传输的。只需要测试看能否正确下载这个页面就可以了,分块发送时服务器是每0.1s发送1k的数据过来。

    三、转载文章

    https://leon-liu.blog.csdn.net/article/details/53432408?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-13.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-13.control

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/15134444.html

  • 相关阅读:
    May 9, 17:3020:00, 1479, "Concentrationcompactness/Rigidity method" lecture 4 by Yang Lan
    May 21, 10:0011:00, 1303, "Capacity, Primeter and ADMmass " by Jie Xiao
    课程期末安排
    问题: Schrodinger方程的广义Strichartz估计
    May 21, 11:1012:10 "On small solutions for nonlinear wave equations in exterior domains " by Makoto NAKAMURA
    SQL Server2019数据库备份与还原脚本,数据库可批量备份
    记一次 IIS 站点配置文件备份和还原,物理路径文件批量备份
    从网上收集的一些图片方面的操作
    android获取本地IP
    java利用httpconnect向服务器发送信息与接收回馈信息
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/15134444.html
Copyright © 2011-2022 走看看