浅析HTTP/2的多路复用

HTTP/2有三大特性:头部压缩、Server Push、多路复用。前两个特性意思比较明确,也好理解,惟有多路复用不太好理解,尤为是和HTTP1.1进行对比的时候,这个问题我想了很长时间,也对比了很长时间,如今把思考的结果分享出来,但愿对你们有帮忙。css

先来讲说Keep-Alive

在没有Keep-Alive前,咱们与服务器请求数据的流程是这样:nginx

clipboard.png

  • 浏览器请求//static.mtime.cn/a.js-->解析域名-->HTTP链接-->服务器处理文件-->返回数据-->浏览器解析、渲染文件
  • 浏览器请求//static.mtime.cn/b.js-->解析域名-->HTTP链接-->服务器处理文件-->返回数据-->浏览器解析、渲染文件
  • ...
  • ...
  • ...
  • 这样循环下去,直至所有文件下载完成。

这个流程最大的问题就是:每次请求都会创建一次HTTP链接,也就是咱们常说的3次握手4次挥手,这个过程在一次请求过程当中占用了至关长的时间,并且逻辑上是非必需的,由于不间断的请求数据,第一次创建链接是正常的,之后就占用这个通道,下载其余文件,这样效率多高啊!你猜对了,这就是Keep-Alive浏览器

Keep-Alive解决的问题

Keep-Alive解决的核心问题:必定时间内,同一域名屡次请求数据,只创建一次HTTP请求,其余请求可复用每一次创建的链接通道,以达到提升请求效率的问题。这里面所说的必定时间是能够配置的,无论你用的是Apache仍是nginx缓存

HTTP1.1仍是存在效率问题

如上面所说,在HTTP1.1中是默认开启了Keep-Alive,他解决了屡次链接的问题,可是依然有两个效率上的问题:性能优化

  • 第一个:串行的文件传输。当请求a文件时,b文件只能等待,等待a链接到服务器、服务器处理文件、服务器返回文件,这三个步骤。咱们假设这三步用时都是1秒,那么a文件用时为3秒,b文件传输完成用时为6秒,依此类推。(注:此项计算有一个前提条件,就是浏览器和服务器是单通道传输)
  • 第二个:链接数过多。咱们假设Apache设置了最大并发数为300,由于浏览器限制,浏览器发起的最大请求数为6,也就是服务器能承载的最高并发为50,当第51我的访问时,就须要等待前面某个请求处理完成。

HTTP/2的多路复用

HTTP/2的多路复用就是为了解决上述的两个性能问题,咱们来看一下,他是如何解决的。服务器

  • 解决第一个:在HTTP1.1的协议中,咱们传输的requestresponse都是基本于文本的,这样就会引起一个问题:全部的数据必须按顺序传输,好比须要传输:hello world,只能从hd一个一个的传输,不能并行传输,由于接收端并不知道这些字符的顺序,因此并行传输在HTTP1.1是不能实现的。

clipboard.png

HTTP/2引入二进制数据帧的概念,其中帧对数据进行顺序标识,以下图所示,这样浏览器收到数据以后,就能够按照序列对数据进行合并,而不会出现合并后数据错乱的状况。一样是由于有了序列,服务器就能够并行的传输数据,这就是所作的事情。并发

clipboard.png

  • 解决第二个问题:HTTP/2对同一域名下全部请求都是基于,也就是说同一域名无论访问多少文件,也只创建一路链接。一样Apache的最大链接数为300,由于有了这个新特性,最大的并发就能够提高到300,比原来提高了6倍!

之前咱们作的性能优化不适用于HTTP/2

  • JS文件的合并。咱们如今优化的一个主要方向就是尽可能的减小HTTP的请求数, 对咱们工程中的代码,研发时分模块开发,上线时咱们会把全部的代码进行压缩合并,合并成一个文件,这样无论多少模块,都请求一个文件,减小了HTTP的请求数。可是这样作有一个很是严重的问题:文件的缓存。当咱们有100个模块时,有一个模块改了东西,按照以前的方式,整个文件浏览器都须要从新下载,不能被缓存。如今咱们有了HTTP/2了,模块就能够单独的压缩上线,而不影响其余没有修改的模块。
  • 多域名提升浏览器的下载速度。以前咱们有一个优化就是把css文件和js文件放到2个域名下面,这样浏览器就能够对这两个类型的文件进行同时下载,避免了浏览器6个通道的限制,这样作的缺点也是明显的,1.DNS的解析时间会变长。2.增长了服务器的压力。有了HTTP/2以后,根据上面讲的原理,咱们就不用这么搞了,成本会更低。
相关文章
相关标签/搜索