为什么订正 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 重传机制