HTTP消息
HTTP
消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰ 请求(requests)
-- 由客户端发送用来触发一个服务器上的动作;响应(responses)
-- 来自服务器的应答。
HTTP
消息由采用 ASCII
编码的多行文本构成。在 HTTP/1.1
及早期版本中,这些消息通过连接公开地发送。在 HTTP/2
中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个 HTTP
帧中。
类型 1-HTTP 请求
起始行
起始行 (start-line) 包含三个元素:
- 一个
HTTP
方法 - 请求目标 (request target),通常是一个 URL,或者是协议、端口和域名的绝对路径。
- HTTP 版本 (HTTP version)
Headers
来自请求的 HTTP headers 遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号和一个结构取决于 header 的值(key: value)。
Body
请求的最后一部分是它的 body
。不是所有的请求都有一个 body
:例如获取资源的请求,GET
,HEAD
,DELETE
和 OPTIONS
,通常它们不需要 body
。有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST
请求(包含 HTML
表单数据)。
类型 2-HTTP 响应
状态行
HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:
- 协议版本,通常为 HTTP/1.1。
- 状态码 (status code),表明请求是成功或失败。常见的状态码是
200
,404
,或302
。 - 状态文本 (status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该
HTTP
消息。
Headers
结构同请求的Headers
Body
响应的最后一部分是 body
。不是所有的响应都有 body
:具有状态码 (如 201 或 204) 的响应,通常不会有 body
。
HTTP/2 帧
HTTP/1.x 报文有一些性能上的缺点:
- Header 不像 body,它不会被压缩。
- 两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。
- 无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。
HTTP/2
引入了一个额外的步骤:它将 HTTP/1.x
消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用
(multiplexing) 的过程,它允许更有效的底层 TCP
连接。