HTTP消息(报文)

HTTP 消息是服务器和客户端之间交换数据的方式。有两种类型的消息:请求(客户端请求)、响应(服务端响应)

HTTP 消息由采用 ASCII 编码的多行文本构成。在 HTTP/1.1 及早期版本中,消息以明文的形式发送,HTTP/2中,为了优化性能,消息被分到多个HTTP帧中,以二进制的形式发送

HTTP/2 二进制框架机制被设计为不需要改动任何 API 或配置文件即可应用,对用户来说同样是透明的

HTTP 请求和响应具有相似的结构,由以下部分组成:

  1. 第一行作为起始行用于描述要执行的请求,或者是响应状态
  2. 多个可选的HTTP标头组成的集合,用于指明请求或描述消息主体
  3. 一个空行指示所有关于请求的元数据已经发送完毕
  4. 一个可选的包含数据的主体(例如表单)

起始行和HTTP标头通称为请求头,而其有效负载被称为主体

HTTP 请求

起始行

hTTP 请求是客户端发送的消息,用来使服务器执行动作,起始行包含三个要素:

  1. 一个HTTP方法:GET(表示要获取资源) POST(表示向服务器推送数据)
  2. 请求目标:通常是一个URL,或者是协议、端口和域名的绝对路径,请求的格式因不同的HTTP方法而异,可以是如下形式:
    1. 一个绝对路径,末尾跟上一个 '?' 和查询字符串。这是最常见的形式,称为原始形式(origin form),被 GETPOSTHEADOPTIONS 方法所使用。
      1. POST / HTTP/1.1
      2. GET /background.png HTTP/1.0
      3. HEAD /test.html?query=alibaba HTTP/1.1
      4. OPTIONS /anypage.html HTTP/1.0
    2. 一个完整的 URL,被称为绝对形式(absolute form),主要在使用 GET 方法连接到代理时使用。
      1. GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
    3. 由域名和可选端口(以 ':' 为前缀)组成的 URL 的 authority 部分,称为 authority form。仅在使用 CONNECT 建立 HTTP 隧道时才使用。
      1. CONNECT developer.mozilla.org:80 HTTP/1.1
    4. 星号形式(asterisk form),一个简单的星号('*'),配合 OPTIONS 方法使用,代表整个服务器。
      1. OPTIONS * HTTP/1.1
  3. HTTP 版本:定义了剩余消息的结构,作为对期望的响应版本的指示符

标头

HTTP标头的基本结构:不区分大小写的字符串,紧跟着的冒号(':')和一个结构取决于标头的值。整个标头(包括值)由一行组成,这一行可以非常的长

有许多请求标头可以用,它们可以分为如下几组:

  • 通用标头,例如 Via,适用于整个消息
  • 请求标头,例如 User-AgentAccept-Type,通过进一步定义,给定上下文或者进行有条件的限制来修改请求
  • 表示表头,例如 Content-Type 描述了消息数据的原始格式和应用的任意编码(仅在消息有主体时才存在)

主体

请求的最后一部分是它的主体。不是所有的请求都有一个主体

GETHEADDELETEOPTIONS,通常它们不需要主体。

POST 请求需要主体

主体大致可以分为两类:

  • 单一资源主体,由一个单文件组成,该类型的主体由两个标头定义:Content-TypeContent-Length
  • 多资源主体,由多部份主体组成,每一部分包含不同的信息位,通常和 HTML 表单 连系在一起

HTTP 响应

状态行

HTTP 响应的起始行被称作为状态行,包含以下信息:

  1. 协议版本
  2. 状态码,表示成功或者失败,常见的状态码有 200(成功),404(资源不存在),302(临时跳转)
  3. 状态文本,一个简短的,纯粹的信息,通过状态码的文本描述,帮组人们理解该HTTP消息

一个典型的状态行是这样子的:

  • HTTP/1.1 404 Not Found
  • HTTP/1.1 200 OK

标头

响应的标头和请求的标头结构一致

响应标头可以分为这几组:

  • 通用标头,例如 Via ,适用于整个消息
  • 响应标头,例如 VaryAccept-Ranges,提供有关服务的其他信息
  • 表示表头,例如 Content-Type 描述了消息数据的原始格式和应用的任意编码(尽在消息有主体时才存在)

主体

响应的最后一部分是主体,不是所有的响应都有主体,201204 状态码的响应通常不会有主体

主体大致可以分为三类:

  • 单资源主体,由已知长度的单个文件组成。该类型主体由两个标头定义:Content-TypeContent-Length
  • 单资源主体,由未知长度的单个文件组成。通过将 Transfer-Encoding 设置为 chunked 来使用分块编码
  • 多资源主体,由多部分 body 组成,每部分包含不同的信息段,但是比较少见

HTTP/2 帧

HTTP/1.x 消息有一些性能上的缺点:

  • 与主体不同,标头不会被压缩
  • 两个消息之间的标头通常非常相似,但他们仍然在连接中重复传输
  • 无法多路复用。党在同一个服务器打开几个连接时,TCP热链接比冷链接更加有效

HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流(stream)中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为多路复用(multiplexing)的过程,它允许更有效的底层 TCP 连接。

HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。

结论

HTTP 消息是使用 HTTP 的关键;它们的结构简单,并且具有高可扩展性。HTTP/2 帧机制是在 HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。