HTTP 消息是服务器和客户端之间交换数据的方式。有两种类型的消息:请求(request)——由客户端发送用来触发一个服务器上的动作;响应(response)——来自服务器的应答。
HTTP 消息由采用 ASCII 编码的多行文本构成。在 HTTP/1.1 及早期版本中,这些消息通过连接公开地发送。在 HTTP/2 中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个 HTTP 帧中。
Web 开发人员或网站管理员,很少自己手工创建这些原始的 HTTP 消息:由软件、浏览器、代理或服务器完成。他们通过配置文件(用于代理服务器或服务器),API(用于浏览器)或其他接口提供 HTTP 消息。
HTTP/2 二进制框架机制被设计为不需要改动任何 API 或配置文件即可应用:它大体上对用户是透明的。
HTTP 请求和响应具有相似的结构,由以下部分组成:
起始行和 HTTP 消息中的 HTTP 头统称为请求头,而其有效负载被称为消息主体。
HTTP 请求是由客户端发出的消息,用来使服务器执行动作。起始行(start-line)包含三个元素:
GET
表示要获取资源,POST
表示向服务器推送数据(创建或修改资源,或者产生要返回的临时文件)。'?'
和查询字符串。这是最常见的形式,称为原始形式(origin form),被 GET
、POST
、HEAD
和 OPTIONS
方法所使用。POST / HTTP/1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
GET
方法连接到代理时使用。GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
':'
为前缀)组成的 URL 的 authority 部分,称为 authority form。仅在使用 CONNECT
建立 HTTP 隧道时才使用。CONNECT developer.mozilla.org:80 HTTP/1.1
'*'
),配合 OPTIONS
方法使用,代表整个服务器。OPTIONS * HTTP/1.1
来自请求的 HTTP 标头遵循和 HTTP 标头相同的基本结构:不区分大小写的字符串,紧跟着的冒号(':'
)和一个结构取决于标头的值。整个标头(包括值)由一行组成,这一行可以相当长。
有许多请求标头可用,它们可以分为几组:
请求的最后一部分是它的主体。不是所有的请求都有一个主体:例如获取资源的请求,像 GET
、HEAD
、DELETE
和 OPTIONS
,通常它们不需要主体。有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。
主体大致可分为两类:
HTTP 响应的起始行被称作状态行(status line),包含以下信息:
HTTP/1.1
。一个典型的状态行看起来像这样:HTTP/1.1 404 Not Found
。
响应的 HTTP 标头遵循和任何其他标头相同的结构:不区分大小写的字符串,紧跟着的冒号(':'
)和一个结构取决于标头类型的值。整个标头(包括其值)表现为单行形式。
许多不同的标头可能会出现在响应中。这些可以分为几组:
响应的最后一部分是主体。不是所有的响应都有主体:具有状态码(如 201 或 204)的响应,通常不会有主体。
主体大致可分为三类:
chunked
来使用分块编码。HTTP/1.x 消息有一些性能上的缺点:
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 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。