[HTTP]HTTP 中的 Transfer-Encoding 报文头

1、背景: 浏览器

  1. 持续链接的问题:对于非持续链接,浏览器能够经过链接是否关闭来界定请求或响应实体的边界;而对于持续链接,这种方法显然不奏效。有时,尽管我已经发送完全部数据,但浏览器并不知道这一点,它没法得知这个打开的链接上是否还会有新数据进来,只能傻傻地等了。
  2. 用Content-length解决:计算实体长度,并经过头部告诉对方。浏览器能够经过 Content-Length 的长度信息,判断出响应实体已结束
  3. Content-length引入的新问题:因为 Content-Length 字段必须真实反映实体长度,可是对于动态生成的内容来讲,在内容建立完以前,长度是不可知的。这时候要想准确获取长度,只能开一个足够大的 buffer,等内容所有生成好再计算。但这样作一方面须要更大的内存开销,另外一方面也会让客户端等更久。
  4. 咱们须要一个新的机制:不依赖头部的长度信息,也能知道实体的边界——分块编码(Transfer-Encoding: chunked)

   

2、分块编码(Transfer-Encoding: chunked) 服务器

    1. Transfer-Encoding,是一个 HTTP 头部字段(响应头域),字面意思是「传输编码」。最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。
    2. 分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,容许HTTP由网页服务器发送给客户端的数据能够分红多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
    3. 数据分解成一系列数据块,并以一个或多个块发送,这样服务器能够发送数据而不须要预先知道发送内容的总大小。
    4. 具体方法
      1. 在头部加入 Transfer-Encoding: chunked 以后,就表明这个报文采用了分块编码。这时,报文中的实体须要改成用一系列分块来传输。
      2. 每一个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。
      3. 最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。
    5. 例:

      HTTP/1.1 200 OK
      Content-Type: text/plain
      Transfer-Encoding: chunked
      this

         

      25\r\n
      This is the data in the first chunk\r\n
      编码

         

      1C\r\n
      and this is the second one\r\n
      spa

         

      3\r\n 内存

      con\r\n io

         

      8\r\n
      sequence\r\n
      coding

         

      0\r\n 请求

      \r\n 方法

         

    6. Content-Encoding 和 Transfer-Encoding 两者常常会结合来用,其实就是针对 Transfer-Encoding 的分块再进行 Content-Encoding压缩。
相关文章
相关标签/搜索