计网小知识 聊聊HTTP/1.1 HTTP/2 HTTP/3

753 阅读6分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

本文中的图片都来自小林Coding的 图解网络 ~ 个个都是宝藏文章哈~

另外各位大佬们在工作/学习中如果有遇到关于这三个版本的HTTP协议的内容 也欢迎交流 一起学习 一起把知识点们加深印象~

本文主要内容导航

  • HTTP/1.1 相比 HTTP/1.0 提高了哪些性能?

  • HTTP/2针对HTTP/1.1做了哪些优化?

  • HTTP/2有哪些缺陷 HTTP/3又做了哪些优化?

  • 三个版本的HTTP协议各自优缺点小结

1.HTTP/1.1 相比 HTTP/1.0 提高了哪些性能?

  • 【1】TCP长连接的方式改善了短连接造成的性能开销

可以很明显地看出来 长连接的效率要高了很多!!

省着不断地建立、断开TCP连接!

(虽说省去了这些建立、断连会高效很多 但是一直连着也不行 为了防止恶意连接导致服务端服务受损 可以限制客户端的最大长连接数)

img

  • 【2】支持管道网络传输

    • 第一个请求发出去了 不必等待其回来就可以发第二个

      • 减少整体的响应时间

img

HTTP/1.1的性能瓶颈

  • 请求/响应头部 Header未经压缩就发送
  • 发送冗长的首部
  • 服务器响应慢的话 容易造成队头阻塞

队头阻塞是较常见的问题

img

  • 没有请求优先级控制
  • 请求只能从客户端开始 服务端只能被动响应

2.HTTP/2针对HTTP/1.1做了哪些优化?

首先 HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。

img

针对HTTP/1.1的性能瓶颈 HTTP/2做了如下优化

  • 【1】头部压缩

    • 使用HPack算法进行头部压缩(见上图)
  • 【2】报文全面采用二进制格式

    • 这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。

img

  • 【3】每个请求/回应的所有数据包 称为数据流 每个数据流都标记着一个独一无二的编号

    • 客户端可以指定数据流的优先级 服务器会优先响应优先级高的Stream(数据流)

      • 有了请求优先级控制 就可以避免队头阻塞!!
  • 【4】利用多路复用 在一个连接中并发多个请求/回应

    • 不用按照顺序一一对应

    • 移除了HTTP/1.1中的串行请求 不需要排队等待!

      • 可以避免队头阻塞问题
      • 可以降低延迟
      • 可以大幅度提高连接的利用率!

    img

  • 【5】改善了传统的「请求 - 应答」⼯作模式 服务器可以主动向客户端发送消息!(服务器推送

    • 举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会⽤到的 JS、CSS ⽂件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送(Server Push,也叫 Cache Push)

3.HTTP/2有哪些缺陷 HTTP/3又做了哪些优化?

HTTP/2 主要的问题在于,多个 HTTP 请求在复⽤⼀个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求 的。所以⼀旦发⽣了丢包现象,就会触发 TCP 的重传机制,这样在⼀个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来

  • HTTP/1.1 中的管道( pipeline)传输中如果有⼀个请求阻塞了,那么队列后请求也统统被阻塞住了
  • HTTP/2 多个请求复⽤⼀个TCP连接,⼀旦发⽣丢包,就会阻塞住所有的 HTTP 请求

这都是基于 TCP 传输层的问题,所以HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP

img

UDP 发⽣是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的⼀个丢包全部重传问题

⼤家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输

  • QUIC 有⾃⼰的⼀套机制可以保证传输的可靠性的。当某个流发⽣丢包时,只会阻塞这个流,其他流不会受到影响
  • TLS3 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack
  • HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿然后是 TLS/1.3 的三次握⼿QUIC 直接 以往的 TCP 和 TLS/1.36 次交互合并成了 3 次,减少了交互次数

img

所以, QUIC 是⼀个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复⽤的协议。

但是——QUIC 是新协议,对于很多⽹络设备,根本不知道什么是 QUIC,只会当做 UDP,这样会出现新的问题。所以 HTTP/3 现在普及的进度非常的缓慢,不知道未来 UDP 是否能够逆袭 TCP

三个版本的HTTP协议各自优缺点小结
  • HTTP/1

    • HTTP/1.0 缺点

      • 安全性差
      • 性能极差
    • HTTP/1.1 优点

      • 长连接 提升性能
      • 管道网络传输(长连接使pipeline成为可能) 提升性能
    • HTTP/1.1 缺点

      • 安全性差
      • 性能差
  • HTTP/2

    • 优点

      • 完全兼容HTTP/1.1

      • 是更安全的HTTP 更快的HTTPS

        • 基于HTTPS 安全性有保障!

        • 解决HTTP/1.1的性能瓶颈 充分利用带宽 减低延迟 大幅度提高上网体验!

          • 【1】使用HPack算法实现头部压缩;
          • 【2】报文格式为二进制;
          • 【3】每个请求/回应的所有数据包 称为数据流 每个数据流都标记着一个独一无二的编号 数据流优先级可以被指定;
          • 【4】多路复用技术;
          • 【5】服务器推送;
    • 缺点

      • 多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。

        所以一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来

    • HTTP/1.1 中的管道( pipeline)传输中如果有一个请求阻塞了,那么队列后请求也统统被阻塞住了。
    • HTTP/2 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。

    这都是基于 TCP 传输层的问题,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!

  • HTTP/3

    • 优点

      • 解决传输层的问题(利用UDP+QUIC协议)

        • UDP 发生是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的一个丢包全部重传问题
        • QUIC 是⼀个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复⽤的协议。 该协议是HTTP/3的底层支撑协议 基于UDP 又取了TCP中的精华 实现了快&可靠的协议
    • 缺点

      • QUIC 是新协议,对于很多⽹络设备,根本不知道什么是 QUIC,只会当做 UDP,这样会出现新的问题。所以 HTTP/3 现在普及的进度非常的缓慢