为什么修订 HTTP 协议

HTTP/1.1 应用于 Web 已有15年的历史,协议的缺陷和不足开始显现。

对比过去,现在的 web 页面需要加载更多资源,HTTP1.x 协议规定一个 TCP connection 不能并行发起多个 request 请求,这使得页面在快速加载大量资源时变得困难。

为处理上述问题,HTTP1.1 协议允许浏览器使用多个 TCP connection 来并行发起多个 request 请求。这种处理方式存在缺陷,使用太多的 connection 会适得其反(TCP 拥塞控制会导致网络效率低下),同时也会出现不公平现象(浏览器都设法占用超出它本该分配的网络资源)。

HTTP/2 跟 SPDY 有什么关系

在 SPDY 协议被 Mozilla 和 nginx 等厂商实现后,相对于 HTTP/1.x 展现出了明显的性能提升,这时 HTTP/2 协议的讨论和指定开始提上议程。

经过一轮提议和投票,最被选择了 SPDY/2 作为 HTTP/2 协议的基础。此后,在工作组和实现者的讨论下 HTTP/2 协议又做出了一系列变更。在这个过程中,SPDY 协议的核心开发者参与了 HTTP/2 协议的开发,这其中包括 Mike Belshe 和 Roberto Peon。

2015年9月,Google 宣布为了支持 HTTP/2 协议,将来不再支持 SPDY 协议。

HTTP/2 跟 HTTP/1.x 的区别

总体来说区别有以下几点:

  • 使用二进制来代替文本格式
  • 使用多路复用来代替有序和阻塞
  • 使用一个 connection 来处理并行请求
  • 使用 header 压缩来减小 header 大小
  • 允许服务端使用 push 来预先推送客户端需要的 cache

为什么 HTTP/2 是二进制的

二进制协议解析效率更高,更节省网络资源,相对于 HTTP/1.1 协议使用文本格式的空格或空行来解析数据,二进制协议更不容易出错

例如, HTTP/1.1 定义了四种不同解析消息的方式,HTTP/2 只有一种解析方式

虽然 HTTP/2 不能通过 telnet 来使用,但是可以使用 Wireshark 等工具

为什么 HTTP/2 是多路复用

HTTP/1.x 存在所谓的“头部阻塞”问题,也就是每个 TCP connection 只能同时发起一个 request 请求。

HTTP/1.1 尝试使用 pipelining 来解决这个问题,这没有完全陈述清楚该问题(一个大的或者慢的响应会阻塞这之后的其他请求)。同时 pipelining 被证明很难部署,因为许多中间件和服务器不能正确的处理它。

这使得客户只能通过猜测确定与站点的哪个连接发起请求,使用实际可用连接数的10倍来加载页面是很常见的,这会严重影响性能,通常会导致请求阻塞。

多路复用允许多个请求和响应的 message 在一个 TCP 连接上并行处理来解决这个问题,甚至可以让不同 message 的内容同时混合在一起处理,也就是客户端可以使用单个 TCP connection 来加载完整的页面

为什么只有一个 TCP connection

使用 HTTP/1,浏览器可以在每个域名上打开四个到八个连接。很多网站同时使用多个子域,这样加载单个页面会打开多达30个 TCP 连接。

一个应用并发使用太多的连接打破了构建 TCP 协议的基础设计,每个连接会响应大量数据让网络的缓冲区溢出,从而触发 TCP 的拥塞控制和 TCP 重传机制


sixsixfly
18 声望0 粉丝