为什么修订 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 重传机制
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。