http2/3

本文最后更新于:8 个月前

http2/3

http1.1存在的问题,为什么要有http2

  1. 在http1.1中是支持持久连接的,多个请求可以复用一个tcp连接,同时管道pipelining可以让多个请求在一次tcp连接中发送,但是因为一个管道中一次只能处理一个请求,所以存在排队问题,如此就会造成阻塞问题。
  2. 因为http连接是无状态的,所以每次请求头的内容都要大而全,所以经常会出现很多重复传输,例如user agent,Cookie,Accept等字段是固定且极有可能是完全重复的,所以导致很多带宽被浪费了
  3. 因为不需要支持https,所以http1.1的安全性是完全不够的

http2改进了什么

  1. 二进制分帧层
    为了提升速度,http2将请求和响应都进行了分割,并且采用二进制编码,如此以来在传输中就不是传统的header+response的形式,而是一个个的小块二进制碎片。通过这种方式就可以实现http2中的多路复用了。
  2. 头部压缩HPACK
    通过对重复性很高的头部字段,通过在客户端和服务器端构建静态字典,通过索引表示重复的字段,同时利用哈夫曼编码来压缩数字和字符串。在第一次请求的时候只需要根据有的字典发送对应的索引即可,对于字典中没有的字段或者不同的,通过哈夫曼编码压缩后进行发送,然后双方动态更新字典,下次在进行连接时,如果没有变化就只需要发送一个索引就行了。
  3. 多路复用
    因为采用了二进制分帧,所以在http2中,可以把所有通信都放在一个连接中完成,双向数据流也没有限制,避免了多个慢启动的tcp连接,一次启动后就可以完成数据的交换,在交换数据时,有序发送流,在根据每个帧唯一的identify标签在服务器进行组合,大大解决了http1.1的阻塞问题
  4. 浏览器要求使用https
    因为要求使用https,虽然http2可以使用明文发送,但是大家都要求https,所以他的安全性要高很多。
  5. 服务器推送
    可以在请求的时候,不需要客户端要求,他会多推送内容给客户端,在配置端配置上push即可,但是因为server push很多时候和缓存冲突,已经被移除了标准。

http3 又怎么了

  1. 新的协议QUIC
    虽然分帧加多路复用可以大大缓解队头阻塞的问题,但是因为tcp他本身还是有序流,所以一旦发生丢包,tcp还是会进行重传

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!