《图解HTTP》——HTTP报文内的HTTP信息

1,063 阅读7分钟

本章是介绍从客户端发往服务端的请求以及从服务端返回客户端的响应是如何运作的。

3.1 HTTP报文

用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成字符串文本
HTTP报文大致可分为报文首部报文主体两块。两者中间由空行来划分。通常,不一定要有报文主体。

3.2 请求报文及响应报文的结构

请求报文和响应报文的首部内容由以下数据组成。

  • 请求行
    包含用于请求的方法,请求URI和HTTP版本。
  • 状态行
    包含表明响应结果的状态码,原因短语和HTTP版本。
  • 首部字段
    包含表示请求和响应各种条件和属性的各类头部。一般有四种首部——通用首部,请求首部,响应首部和实体首部
  • 其他
    可能包含HTTP的RFC里未定义的首部(Cookie等)。

3.3 编码提升传输速率

HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输效率(有效处理大量访问请求)。但编码的操作需要计算机来完成,会消耗更多的CPU等资源。

3.3.1 报文主体和实体主体的差异

  • 报文
    HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
  • 实体
    作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
    HTTP报文的主体用于传输请求或响应的实体主体
    通常,报文主体等于实体主体。当传输中进行编码操作时,实体主体内容发生变化,此时和报文主体将发生差异。

3.3.2 压缩传输的内容编码

HTTP协议中内容编码功能类似于我们将文件进行压缩。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的的实体由客户端接收并负责解码。

常用的内容编码:

  • gzip(GNU zip)
  • compress (UNIX系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

3.3.3 分割发送的分块传输编码

分块传输代码:在HTTP通信过程中,请求的编码实体主题尚未完全传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。

分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体最后一块会使用“0(CR+LF)”来标记。
接受的客户端负责解码,恢复到编码器前的实体主体。
HTTP/1.1存在传输编码机制,可以在通信时按某种编码进行传输,但只定义作用域分块编码中。

3.4 发送多种数据的多部分对象集合

发送邮件时可以在邮件里写入文字并添加多份附件,这时采用了MIME(多用途因特网邮件拓展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。例如,图片等二进制数据以ASCII码字符串编码的方式指明,就是利用MIME来描述标记数据类型。MIME扩展中会使用一种称为多部分对象集合的方法,来容纳多份不同类型的数据
相应地,HTTP协议也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。
多部分对象集合包含的对象如下:

  • multipart/form-data 在Web表单文件上传时使用。
  • multipart/byteranges 状态码206响应报文包含了多个范围的内容时使用。
    在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type
    使用boundary字符串来区分多部分对象集合指明的各类实体。boundary字符串指定的各个实体的起始行之前插入“--”标记,而在多部分对象集合对应的字符串的最后插入“--”标记作为结束。
    多部分对象集合的每个部分类型中,都可以含有首部字段。另外,可以在某个部分中嵌套使用多部分对象的集合。

3.5 获取部分内容的范围请求

为解决网络中断引起的文件下载重头开始问题,需要一种可恢复(能从之前下载中断处恢复下载)的机制,要实现该功能需要指定下载的实体范围。而制定范围发送的请求叫做范围请求

执行范围请求时,用到首部字段Range来指定资源的byte范围。
byte范围的指定形式如下:
针对范围请求,响应会返回状态码为206的响应报文。对于多重范围的范围请求,响应会在首部字段ContentType标明multipart/byteranges后返回响应报文。
如果服务器无法响应范围请求,则会返回状态码200 OK和完整的实体内容。

3.6 内容协商返回最合适的内容

同一个Web网站有可能存在着多份相同内容的页面,比如中英文版,虽然内容上相同,使用的语言却不同。
当浏览器的默认语言为中文或英文,访问相同URI的Web页面时,则会显示响应的中英文版,这样的机制称为内容协商

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的标准。
包含在请求报文中的某些首部字段就是判断的基准:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商有三种类型:

  • 服务器驱动协商
    以请求的的首部字段为参考,在服务器端自动处理。对于用户来说不一定能筛选出最优。
  • 客户端驱动协商
    用户从浏览器显示的可选项列表中手动选择。还可利用js脚本在Web页面自动选择(比如按OS的类型或浏览器类型,切换成PC版或手机版)。
  • 透明驱动协商
    上述两种的结合体,是由服务器端和和客户端各自进行内容协商的一种方法。

! important

  • 用于HTTP协议交互的信息被称为HTTP报文。
  • HTTP报文大致可分为报文首部和报文主体两块。
  • HTTP在传输数据时可以通过编码提升传输效率。但编码的操作需要计算机来完成,会消耗更多的CPU等资源。
  • 通常,报文主体等于实体主体。当传输中进行编码操作时,实体主体内容发生变化,此时和报文主体将发生差异。
  • 内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。
  • 分块传输编码会将实体主体分成多个部分(块),在传输大容量数据时,能够让浏览器逐步显示页面。
  • HTTP协议也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。
  • 为解决网络中断引起的文件下载重头开始问题,需要一种可恢复(能从之前下载中断处恢复下载)的机制,要实现该功能需要指定下载的实体范围。而制定范围发送的请求叫做范围请求。
  • 内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。
  • 内容协商有三种类型:
    • 服务器驱动协商
    • 客户端驱动协商
    • 透明驱动协商