HTTP/2.0学习

HTTP/2.0学习

十一月 04, 2020

HTTP/1.1时代

特性

​ 对HTTP/1.0做了许多优化,也是现如今使用最多的HTTP协议:

  • 持久化连接以支持连接重用

    1.0时代每个请求都会重新创建一个TCP连接,一旦响应返回就立即关闭。而建立一个TCP连接,需要3次握手(https则需要8步),这造成了极大的性能浪费,所以1.1增加了持久化连接以达到重用。

  • 请求管道支持并发请求处理

    持久连接解决了连接复用问题,但还是存在着一个问题:在一个 TCP 连接中,同一时间只能够发送一个请求,并且需要等响应完成才能够发送第二个请求。

    因此 HTTP/1.1 制订了 PipeLining 管道,通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器的响应只能够一个接着一个的返回 ( 但各大浏览器有些不支持/默认关闭,因此这功能可以说是鸡肋)。

    因为每一条连接同时只能够返回一个响应,因此浏览器为了改善这种情况,会同时开启2~8(比如Chrome 6个)个 TCP 连接进行发送请求。

  • 更好的缓存机制

优化

​ 基于以上特性,在HTTP/1.1上web前端的优化基本上如下:

  1. 资源合并

    合并js和css文件,雪碧图等以减少http连接,但是副作用就是一个小的文件改动都会引起整个缓存资源失效。

    一般合并大小建议为30~50kb

  2. 域名分区

    由于1.1浏览器对于并发请求数有限制,所以可以使用多域名或者子域名来达到减少排队延迟的目的。

  3. 资源内嵌

    对于不常用的,较小大资源内嵌在文档中,比如base64的图片,以减少HTTP请求,但是这样的资源不能在浏览器中缓存,也不可能被其他页面共享,同时还有可能编码之后的资源变等更大了。在HTTP2中,这样的资源就可以使用SERVER PUSH来推送。

    建议:

    1. 只考虑嵌入1~2 KB 以下的资源,因为小于这个标准的资源经常会导致比它自身更高的HTTP 开销
    2. 如果文件很小,而且只有个别页面使用,可以考虑嵌入。理想情况下,最好是只用一次的资源
    3. 如果文件很小,但需要在多个页面中重用,应该考虑集中打包
    4. 如果小文件经常需要更新,就不要嵌入了
    5. 通过减少 HTTP cookie的大小将协议开销最小化

HTTP/2.0时代

​ 说到此,就必须先说一下SPDY,由于现代网页的不断丰富,HTTP/1.1显然满足不了此带来的性能开销,因此Google在2012年起草了SPDY,实际上2.0就是以此协议为原型进行开发的,特性如下:

  • 多路复用
  • 请求优先级
  • Header压缩(可达到80%以上)

SPDY 现已经被大多数浏览器以及 WEB 服务器所支持,但为了推进 HTTP/2.0, Google 已经宣布在 2016年对其停止开发。下来说说我们的主角,HTTP/2.0特性如下:

  • 二进制分帧

    HTTP1时代都是明文传输,HTTP/2.0则改为了二进制传输,实现低延迟和高吞吐量,将传输信息切分为更小的消息(帧),采用二进制格式编码。

  • 头部压缩
  • IO多路复用

    在一条连接上可以发送无限请求,并且可以响应并成功返回。一个TCP连接就相当于一个管道,一个http请求就相当于管道中的一个流(stream),数据在流中进行传输,因为采用二进制帧传输,数据在客户端乱序传输,到服务端后会进行数据重组,并不会因此造成信息错乱,所以在2.0上,之前的资源合并优化并不适用。

  • 请求优先级
  • 服务端推送

    服务端推送的优化:可以缓存。

  • 强制SSL(Chrome浏览器)

    虽然 HTTP/2.0 协议并没声明一定要用 SSL,但是最新版本的Chrome浏览器已经强制要求使用HTTPS。

优化

  • 资源合并减少请求或者域名分区增加并发并不适用于2.0,因为并没有并发限制
  • 因为服务端推送,资源内嵌的手段也变得没有意义。使用服务端推送的方式更加高效,因为客户端还可以缓存起来,甚至可以由不同的页面共享(依旧遵循同源策略)