基础数据

http1中每次请求都需要发一次tcp链接,成本高效率低。

http1.1加入了 keep-alive 保持了tcp链接,但是由于在http1.1中请求是以队列的形成进行处理的,会导致队头阻塞。连接并发数过多时,一是会被浏览器限制,而是服务器处理能力有限,使得后面的请求需要排队。

http2中

  1. 为了方便解析,http2的报文改用二进制的形式进行传输
  2. 原来的报文分成了 header帧data帧 ,这些帧不存在先后关系,从而解决了http队头阻塞的问题(二进制帧)
  3. 通信双方可以通过二进制帧进行通信,这种这种二进制帧的双向传输的序列,也叫作
  4. http2中通过流在一个tcp连接中进行多个数据帧的通信,这就是多路复用的概念

首先要声明的是,所谓的乱序,指的是不同 ID 的 Stream 是乱序的,但同一个 Stream ID 的帧一定是按顺序传输的。二进制帧到达后对方会将 Stream ID 相同的二进制帧组装成完整的请求报文响应报文。当然,在二进制帧当中还有其他的一些字段,实现了优先级流量控制等功能。

HTTP/2的多路复用就是为了解决上述的两个性能问题。
在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。
帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。

https://juejin.im/post/5e76bd516fb9a07cce750746#heading-97

总结一波

http1 中每次请求都需要建立链接,成本较高
http1.1中加入 keep-alive 使得链接可以复用,但是处理请求采取队列形式,会导致队头阻塞。并发数高时,一方面浏览器限制,另一方面服务器承载能力有限,会导致后面的用户请求被阻塞

http2的多路复用能解决这个队头阻塞的问题,首先他的请求改成了数据帧的形式进行通信,每个帧属于不同的流,一个tcp链接可以同时进行多个流的传输,这样就能解决了队头阻塞的问题。帧本身是无序的,但是帧的传输时一个个传输的,当收到这个帧后,会根据帧的流id重组出一个完整的请求报文和相应报文。