Skip to content

HTTP

版本

HTTP/0.9

最早版本的 HTTP 并没有版本号,后来为了与之后的版本进行区分,把该版本 HTTP 称为 HTTP/0.9,有时也叫做单行(one-line)协议。

该版本 HTTP 极其简单:请求由单行指令构成。以唯一可用方法 GET 开头,其后跟目标资源的路径。

http
GET /example.html

响应只包含文档本身:

html
<html>
  example
</html>

该版本的 HTTP 协议没有 HTTP 标头。只能传输 HTML 文件,不能传输其它类型文件。没有状态码。出现问题的时候会返回一个包含问题描述信息的 HTML 文件。

HTTP/1.0

发布年份:1996 年。

无状态协议:服务器不保留关于客户端的任何数据。

连接类型:非持久连接。每个请求/响应对后,连接就关闭了,这造成了每次请求都需要重新建立连接。

性能限制:由于不支持持久连接,频繁的建立和关闭连接影响了性能。

相对于 HTTP/0.9,新增了以下:

  • 协议版本信息现在会随着每个请求发送;
  • 增加了状态码,使浏览器能了解请求执行成功或失败,并调整相应行为(如更新或使用本地缓存);
  • 引入 HTTP 标头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性;
  • 在新 HTTP 标头的帮助下,具备了传输其它类型文件的能力。

HTTP/1.1

发布年份:1997 年。

持久连接:默认开启持久连接,允许在一个 TCP 连接上发送多个 HTTP 请求,减少了建立和关闭连接的开销。

管线化技术:允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟,不过响应仍需按请求的顺序依次返回。

分块传输编码:允许服务器分块发送响应,提高了传输数据的效率。

缓存处理改进:引入了更复杂的缓存控制策略。

错误通知改进:增加了更多的状态码。

引入内容协商机制,包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。

凭借 Host 标头,能够使不同域名配置在同一个 IP 地址的服务器上。

HTTP/2

发布年份:2015 年。

二进制格式:HTTP 2.0 使用二进制而非文本格式,使得解析更高效。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。

多路复用:在同一个连接上并行交错地发送多个请求和响应,消除了 HTTP 1.x 中的队头阻塞问题。

首部压缩:HTTP 2.0 使用 HPACK 压缩格式减少了头部大小,降低了开销。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。

服务器推送:允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。

HTTP/3

发布年份:2019 年推出草案。

基于 QUIC:HTTP 3.0 是基于 QUIC(Quick UDP Internet Connections)协议,而不是 TCP。QUIC 是基于 UDP 实现的。

减少连接延迟:QUIC 集成了 TLS 握手,减少了设置过程中必须交换的信息,加快了连接建立速度。

改进的拥塞控制:独立的流量控制,减少了数据包丢失对整个连接的影响。HTTP/2 的多路复用是运行在一个单独的 TCP 连接上的,意味着一旦有包丢失以及后续重新传输,会阻塞该连接上的所有 HTTP 事务。QUIC 通过 UDP 运行多个流,并且为每个流实现了包丢失检测和重传,这意味着包丢失只会阻塞丢失的那个流。

连接迁移:支持连接的无缝迁移,即使客户端的 IP 地址发生变化。

References