学习和使用HTTP2.0

什么是HTTP2.0

简单来讲,HTTP/2(超文本传输协议第2版,最初命名为HTTP2.0),是HTTP协议的第二个主要版本。HTTP/2是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY协议。 HTTP2.0的特色是:在不改动HTTP语义、方法、状态码、URI及首部字段的状况下,大幅度提升了web性能。html

先来感觉一下HTTP2.0到底比HTTP1.x快了多少。连接地址前端

什么是SPDY协议

SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,经过压缩、多路复用和优先级等技术,缩短网页的加载时间并提升安全性。SPDY协议的核心思想是尽可能减小TCP链接数。SPDY并非一种用于替代HTTP的协议,而是对HTTP协议的加强。linux

HTTP1.x的局限性

1.慢

影响一个网络请求的因素主要有两个,带宽和延迟。今天的网络基础建设已经使得带宽获得极大的提高,大部分时候都是延迟在影响响应速度。web

2.链接没法复用

链接没法复用会致使每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。算法

3.队头阻塞

队头阻塞(Head-of-line blocking或缩写为HOL blocking)在计算机网络的范畴中是一种性能受限的现象。它的缘由是一列的第一个数据包(队头)受阻而致使整列数据包受阻。例如它有可能在缓存式输入的交换机中出现,有可能由于传输顺序错乱而出现,亦有可能在HTTP流水线中有多个请求的状况下出现。segmentfault

Head-of-line blocking会致使带宽没法被充分利用,以及后续健康请求被阻塞。浏览器

HTTP2.0特色

1. 二进制传输

区别于 HTTP1.x 经过文本的方式传输数据,HTTP2.0 采用二进制传输。缓存

在HTTP2.0中引入了新的编码机制,全部传输的数据都会被分割,并采用二进制格式编码。安全

为了保证HTTP不受影响,须要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增长一个二进制分帧层。在二进制分帧层上,HTTP2.0会将全部传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。

2. 多路复用

在HTTP1.0中,咱们常常会使用到雪碧图、使用多个域名等方式来进行优化,都是由于浏览器限制了同一个域名下的请求数量,当页面须要请求不少资源的时候,队头阻塞(Head of line blocking)会致使在达到最大请求时,资源须要等待其余资源请求完成后才能继续发送。 HTTP2.0中,有两个概念很是重要:帧(frame)和流(stream)。 帧是最小的数据单位,每一个帧会标识出该帧属于哪一个流,流是多个帧组成的数据流。 所谓多路复用,即在一个TCP链接中存在多个流,便可以同时发送多个请求,对端能够经过帧中的表示知道该帧属于哪一个请求。在客户端,这些帧乱序发送,到对端后再根据每一个帧首部的流标识符从新组装。经过该技术,能够避免HTTP旧版本的队头阻塞问题,极大提升传输性能。服务器

多路复用

3. Header压缩

在HTTP1.0中,咱们使用文本的形式传输header,在header中携带cookie的话,每次都须要重复传输几百到几千的字节,这着实是一笔不小的开销。 在HTTP2.0中,咱们使用了HPACK(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减小了header的大小。并在两端维护了索引表,用于记录出现过的header,后面在传输过程当中就能够传输已经记录过的header的键名,对端收到数据后就能够经过键名找到对应的值。

4. 服务器Push

在HTTP2.0中,服务端能够在客户端某个请求后,主动推送其余资源。 能够想象一下,某些资源客户端是必定会请求的,这时就能够采起服务端push的技术,提早给客户端推送必要的资源,就能够相对减小一点延迟时间。在浏览器兼容的状况下也可使用prefetch。

5. 更安全

HTTP2.0使用了tls的拓展ALPN作为协议升级,除此以外,HTTP2.0对tls的安全性作了近一步增强,经过黑名单机制禁用了几百种再也不安全的加密算法。

如何使用

在使用以前先来了解一下它的兼容性。

主流浏览器基本都支持 HTTP2.0,并且即便不支持,像 Nginx 是能够自动向下兼容 HTTP 1.1 的。Nginx 配置能够参考 Nginx 上配置 HTTP/2 简明教程

对前端的影响

由于有了多路复用加持,减小HTTP请求的最佳实践再也不适用 如合并JS、CSS文件(Concatenation),多个图片或图标合并(Spriting),将较小的JS或CSS文件内嵌到HTML中(Inlining),合并HTML文件(Vulcanize)等。

所以在作项目优化时,要根据具体的业务场景来进行,不能一味的追求减小 HTTP 请求而增长单个请求的压力。

参考文章:

【快速入门系列】一篇文章让你入门HTTP2.0

谈谈HTTP/2对前端的影响

浅谈:HTTP 2.0 的二进制帧、流、多路复用

相关文章
相关标签/搜索