You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

2.6 KiB

HTTP 进化史

目录

  1. HTTP/0.9 和 HTTP/1.0
  2. HTTP/1.1
  3. SPDY 和 HTTP/2

HTTP/0.9 和 HTTP/1.0

HTTP/0.9 是个相当简单的协议,它只有一个 GET 方法,没有首部,其设计目标就是获取 HTML(其实也就是文本,没有图片)

在 1996 年通过 RFC 1945 制定了 HTTP/1.0 规范。1.0 版本为原有的轻量协议新增了大量内容,它包含了一些我们如今非常熟悉的概念:

  • 首部
  • 响应码
  • 重定向
  • 错误
  • 条件请求
  • 内容编码(压缩)
  • 更多的请求方法

尽管相对于 0.9 版本来说,HTTP/1.0 是一个巨大的飞跃,但仍存在很多瑕疵,尤其是不能让多个请求共用一个连接,缺少强制的 Host 首部,并且缓存的选择也相当简陋,这三点影响了 Web 可扩展的方式。

HTTP/1.1

1.0 版本刚刚制定,1.1 版本就接憧而来。截至目前,1.1 版本的协议已经使用了 20 多年了,它修复了之前提到的 1.0 版本的大量问题。因为强制要求客户端提供 Host 首部,所以虚拟主机托管成为可能,也就是在一个 IP 上提供多个 Web 服务。当使用新的连接指令时,Web 服务器也不需要在每个响应之后关闭连接。这对于提升性能和效率而言意义重大,因为浏览器再也不用为每个请求重新发起 TCP 连接了。

添加的变更如下:

  • 缓存相关首部的扩展
  • OPTIONS 方法
  • Upgrade 首部
  • Range 请求
  • 压缩和传输编码
  • 管道化

管道化这种特性允许客户端一次发送所有的请求。但是有些问题阻塞了管道化的普及,服务器仍然只能按顺序响应请求。具体来说,如果某个请求花了很长时间,那么队头阻塞会影响其他请求。

SPDY 和 HTTP/2

2009 年,Google 提出了 SPDY,SPDY 不是第一个希望替代 HTTP 的方案,但它是其中最重要的一个,因为它带来了显而易见的性能提升。

IETF 决定使用 SPDY 作为 HTTP/2.0 的起点,最终在 2015 年发布 HTTP/2.0 成为正式协议。

HTTP/2.0 被寄予了如下期望:

  • 相比于使用 TCP 的 HTTP/1.1,最终用户可感知的多数延迟都有能够量化的显著改善
  • 解决了 HTTP 中的队头阻塞问题
  • 并行的实现机制不依赖与服务器建立多个连接,从而提升 TCP 连接的利用率,特别是在拥塞控制方面
  • 保留 HTTP/1.1 的语义,可以利用已有的文档资源,包括 HTTP 方法、状态码、URI 和首部字段
  • 明确定义 HTTP/2.0 和 HTTP/1.x 交互的方法
  • 明确指出它们可以被合理使用的新的扩展点和策略