http1.0 存在的问题: 每次发起 http 请求都需要进行一次 TCP连接
http1.1 connection:keep-alive; 解决了这个问题,但是 http1.1 无法标识同一个 TCP 连接下,不同的 HTTP请求,所以一直存在一个服务器的队头阻塞问题。
http2 进行的优化

  • 在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
  • 二进制封装成帧,比如在 http1.1 的传输中,状态码200 得花费 3个字节来表示,但是http2 只需要一个字节
  • 一个 TCP 连接下可以开启多个 Stream 流,每帧数据传输的过程中添加 stream id
  • 服务器推送

客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。例如当一个用户请求html内容的时候,服务器可以直接推送对应的css文件
image.png

http2 存在的问题

http2 是基于 TCP 连接的,而TCP连接是基于字节流的,也就是当上一个字节没有读取到的时候,后面的收到的字节都只能放在缓冲区里。http2 的tcp队头阻塞问题
image.png
多个流之间会存在阻塞问题,当一个流在网络过程中发生了丢包的情况,那么后面的流就只能存放在缓冲区里面。
image.png

http3 的一个优化

quick 和 udp 替换原本的 TCP