什么是 HTTP/2
HTTP/2 就是超文本传输协议的第二个主要版本,是自1999年 HTTP 1.1 之后发布的首个更新,主要基于 SPDY 协议(是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验)。
和 HTTP1.1 比起来有什么优势
1. HTTP/2采用二进制格式而非文本格式
2. HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
3. 使用报头压缩,HTTP/2降低了开销
4. HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
其中的 多路复用对前端优化性能有很大的帮助
什么是多路复用
在 HTTP 1.1 中,发起一个请求是这样的:
浏览器请求 url -> 解析域名 -> 建立 HTTP 连接 -> 服务器处理文件 -> 返回数据 -> 浏览器解析、渲染文件
这个流程最大的问题是,每次请求都需要建立一次 HTTP 连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,而且逻辑上是非必需的,因为不间断的请求数据,第一次建立连接是正常的,以后就占用这个通道,下载其他文件,这样效率多高啊!
为了解决这个问题, HTTP 1.1 中提供了 Keep-Alive,允许我们建立一次 HTTP 连接,来返回多次请求数据。
但是这里有两个问题:
HTTP 1.1 基于串行文件传输数据,因此这些请求必须是有序的,所以实际上我们只是节省了建立连接的时间,而获取数据的时间并没有减少
最大并发数问题,假设我们在 Apache 中设置了最大并发数 300,而因为浏览器本身的限制,最大请求数为 6,那么服务器能承载的最高并发数是 50
而 HTTP/2 引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据。
HTTP/2 对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一路连接。同样Apache的最大连接数为300,因为有了这个新特性,最大的并发就可以提升到300,比原来提升了6倍。
如何应用 HTTP/2
下面是我用 nodejs + express 实现的一个简单例子 ( HTTP/2 必须采用 SSL 安全连接)
打开 chrome 的调试器,可以看到
这是基于 HTTP 1.1
现在 nginx、tomcat 都有支持 http2 的配置
哪些浏览器支持 HTTP/2