HTTP1.1 和 HTTP2.0

1.1. 什么是 HTTP2.0

HTTP2.0(超文本传输协议第 2 版),是 HTTP 协议的的第二个主要版本,使用于万维网。HTTP2.0 是 HTTP 协议自 1999 年 HTTP1.1 发布后的首个更新,主要基于 SPDY 协议(是 Google 开发的基于 TCP 的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验)。

1.2. 与 HTTP1.1 的主要区别

  • HTTP2.0 采用二进制格式而非文本格式;
  • HTTP2.0 是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行;
  • HTTP2.0 使用报头压缩, 降低了开销;
  • HTTP2.0 让服务器可以将响应主动“推送”到客户端缓存中;

1.2.1 内容安全

因为 HTTP2.0 是基于 HTTPS 的,天然具有安全特性。

1.2.2 二进制格式

比起像 HTTP1.1 这样的文本协议,二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。

HTTP1.1 的解析是基于文本的,HTTP2.0 将所有的传输信息分割为更小的消息和帧,并对他们采用二进制格式编码,基于二进制可以让协议有更多的扩展性,比如引入了帧来传输数据和指令。

1.2.3 多路复用

HTTP1.1 有个问题叫线端阻塞(head-of-line blocking), 它是指一个连接(connection)一次只提交一个请求的效率比较高,多了就会变慢。 HTTP1.1 试过用流水线(pipelining)来解决这个问题, 但是效果并不理想(数据量较大或者速度较慢的响应, 会阻碍排在他后面的请求)。

这个功能相当于是长连接的增强,每个 request 请求可以随机的混杂在一起,接收方可以根据 request 的 id 将 request 再归属到各自不同的服务端请求里面,另外多路复用中也支持了流的优先级,允许客户端告诉服务器那些内容是更优先级的资源,可以优先传输。

多路复用允许同时通过单一的 HTTP2.0 连接发送多重请求-响应信息。改善了:在 HTTP1.1 中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞。

1.2.4. 提升访问速度

相比 HTTP1.0 请求资源所需时间更少,访问速度更快。

1.2.5. 首部压缩

假定一个页面有 80 个资源需要加载(这个数量对于今天的 Web 而言还是挺保守的), 而每一次请求都有 1400 字节的消息头(这同样也并不少见,因为 Cookie 和引用等东西的存在), 至少要 7 到 8 个来回去“在线”获得这些消息头。这还不包括响应时间——那只是从客户端那里获取到它们所花的时间而已。这全都由于 TCP 的慢启动机制,它会基于对已知有多少个包,来确定还要来回去获取哪些包 – 这很明显的限制了最初的几个来回可以发送的数据包的数量。相比之下,即使是头部轻微的压缩也可以是让那些请求只需一个来回就能搞定——有时候甚至一个包就可以了。这种开销是可以被节省下来的,特别是当考虑移动客户端应用的时候,即使是良好条件下,一般也会看到几百毫秒的来回延迟。

1.2.6. 服务器端推送

当浏览器请求一个网页时,服务器将会发回 HTML,在服务器开始发送 JavaScript、图片和 CSS 前,服务器需要等待浏览器解析 HTML 和发送所有内嵌资源的请求。服务器推送服务通过“推送”那些它认为客户端将会需要的内容到客户端的缓存中,以此来避免往返的延迟