HTTP2

#积累/浏览器原理

HTTP 1.1 特点

  • 持久连接
    HTTP 1.0每进行一次HTTP通信,都需要经历建立TCP连接、传输数据、断开TCP连接,频繁的建立TCP连接、断开TCP连接,增加了服务器额外的开销。

    HTTP 1.1增加了持久连接的方法,一个TCP连接上可以传输多个HTTP请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。当存在::队头阻塞::问题。
  • 提供虚拟主机的支持
    HTTP/1.1 的请求头中增加了 Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理。
  • 对动态生成的内容提供了完美支持
    HTTP/1.1 引入 Chunk transfer 机制,服务器会将数据分割成若干个任意大小的数据块,提供了对动态内容的支持。
  • 客户端 Cookie、安全机制

HTTP 1.1有什么问题?

  1. HTTP/1.1 队头阻塞的问题
    HTTP/1.1 中使用持久连接时,虽然能公用一个 TCP 管道,但是在一个管道中同一时刻只能处理一个请求,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。
  2. TCP 的慢启动
    刚开始 TCP 协议会采用一个非常慢的速度去发送数据,然后慢慢加快发送数据的速度,直到发送数据的速度达到一个理想状态。
  3. 同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽
    HTTP 1.1 对于每个域名最多同时维护 6 个 TCP 持久连接;
    下载过程中,当发现带宽不足的时候,各个 TCP 连接就需要动态减慢接收数据的速度;
    多条TCP连接之间不能协商让哪些关键资源优先下载。

HTTP 2 如何解决三个问题?

HTTP/2 的思路就是一个域名只使用一个 TCP 长连接来传输数据,这样整个页面资源的下载过程只需要一次慢启动,同时也避免了多个 TCP 连接竞争带宽所带来的问题。
对于队头阻塞的问题,HTTP/2 利用多路复用机制,实现任何时候都可以将请求发送给服务器,而并不需要等待其他请求的完成,然后服务器也可以随时返回处理好的请求资源给浏览器。

  • 每个请求都有一个对应的 ID,如 stream1 表示 index.html 的请求,stream2 表示 foo.css 的请求。这样在浏览器端,就可以随时将请求发送给服务器了。
  • 服务器端接收到这些请求后,会根据自己的喜好来决定优先返回哪些内容,比如服务器可能早就缓存好了 index.html 和 bar.js 的响应头信息,那么当接收到请求的时候就可以立即把 index.html 和 bar.js 的响应头信息返回给浏览器,然后再将 index.html 和 bar.js 的响应体数据返回给浏览器。之所以可以随意发送,是因为每份数据都有对应的 ID,浏览器接收到之后,会筛选出相同 ID 的内容,将其拼接为完整的 HTTP 响应数据。

HTTP2 特征

  • 多路复用
    同一个TCP连接,可以请求多个资源;而且请求可以即刻发送给服务器,不会有HTTP/1.1的队头阻塞问题。
  • 可以设置请求的优先级
    HTTP/2 提供了请求优先级,可以在发送请求时,标上该请求的优先级,这样服务器接收到请求之后,会优先处理优先级高的请求
  • 服务器推送
    HTTP/2 还可以直接将数据提前推送到浏览器
  • 头部压缩
    HTTP/2 对请求头和响应头进行了压缩

如何升级到HTTP2?

  • 浏览器要支持HTTP2
  • 服务器nginx要支持
  • http2只支持https

升级HTTP2对前端性能优化的影响

HTTP1.1对于每个域名有6个TCP连接的限制,所以HTTP1.1时代的性能优化可以降低资源的数量来加快资源请求速度;
HTTP2对于一个域名建立1个TCP长连接,在一个连接上没有请求数量的限制。像多个小图标合并为一张雪碧图,合并js、css减少文件数量的优化手段已经无效了。