HTTP系列: HTTP2

116 阅读2分钟

HTTP系列: HTTP2

三次握手的本质问题:信道不可靠,但是通信双方需要就某个问题达成一致,而要解决这个问题,三次通信是理论上的最小值,所以是为了满足 在不可靠信道上可靠的进行传输信息 这一需求导致的。

client => server 客户端向服务端发送消息: 关键词:

server => cloent 服务端收到了客户端发送的消息,然后回复: 关键词: 收发

client => server 客户端发送收到服务端的消息的确认报文: 关键词:

为了解决 HTTP1.0 中每请求一次就需要建立三次握手的问题,HTTP1.1 加入了 Connection: keep-alive 就可以告诉对方先不要断开链接,我之后还要用这个链接发消息。当需要断开的时候,再指定 Connection: closeheader

但是 HTTP1.1 中存在一个问题,就是下一次的请求需要等到上一次的请求返回响应才能发出,这就造成了队头阻塞

管道化 能解决部分问题,但是依旧解决不了 队头阻塞的问题

浏览器 一般会在同一个域名建立 6-8TCP链接, 如果一个队发生阻塞,就放到其他队里面,这就缓解了队头阻塞问题

除了 队头阻塞问题 HTTP 还存在 header过大 的问题,因此,我们的网页就要做打包,也就是需要打包工具把模块合并成多个 chunk 来加载。需要把小图片合并成大图片,通过调整background:position来使用,需要把一些CSS, 图片等内链,而且静态资源的域名也要禁止携带cookie

这些都是为了减少请求次数来达到提高性能加载的目的。

HTTP2

通过 stream 流来解决 http1.1 存在的问题

  • 多路复用:HTTP2 发送一次请求,响应,或者一次服务端推送的流程,都是封装在一个个流里面的。

    • 流和流之间可以并发,还可以设置优先级,这样自然就没有了队头阻塞的问题
    • 也就是复用同一个链链接,建立起多条通路(流)的意思。
  • 服务端推送

  • 头部压缩: 两端会维护一个索引表,通过下标来标识 header,这样传输量就少了不少,会用二进制的方式表示,用做压缩,而且压缩算法是专门设计的,叫做 HPACK。

  • 队头阻塞:通过流的来标识请求、响应,同一个流的分为多个帧来传输,多个流之间可以并发,不会相互阻塞。