HTTP 1.0 / 1.1 / 2.0 / 3.0 区别

这里写目录标题

  • 前言
  • 正文
  • HTTP 1.0 / 1.1 / 2.0 / 3.0 区别
    • HTTP /1.0
      • 概念
      • HTTP 1.0存在的问题
    • HTTP/1.1
      • 优势
      • 缺点
    • HTTP/2.0
      • 优点
      • 缺点
    • HTTP/3.0
      • 优点
  • 总结
    • 参考连接


前言

大家好,我是练习两年半的Java练习生,今天我们来讲一讲计算机网络中的HTTP协议,还有各版本之间的区别,让我们一起来看看吧!


正文

HTTP 1.0 / 1.1 / 2.0 / 3.0 区别

HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第1张图片

HTTP /1.0

概念

1.0的HTTP版本,是一种无状态,无连接的应用层协议。 HTTP1.0规定浏览器和服务器保持短暂的链接。

浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完成以后立即断开TCP连接(无连接),服务器不跟踪也每个客户单,也不记录过去的请求(无状态)。

这种无状态性可以借助cookie/session机制来做身份认证和状态记录。

HTTP 1.0存在的问题

  1. 无法复用连接

每次发送请求,都需要进行一次TCP连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网络的利用率变低。

  1. 队头阻塞

由于HTTP1.0规定下一个请求必须在前一个请求响应到达之前才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。

HTTP/1.1

优势

  1. 长连接

HTTP1.1增加Connection字段,通过设置Keep-Alive保持HTTP连接不断卡。避免每次客户端与服务器请求都要重复建立释放建立TCP连接。提高了网络的利用率。

如果客户端想关闭HTTP连接,可以在请求头中携带Connection:false来告知服务器关闭请求。
HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第2张图片

  1. 管道化

HTTP/1.1 采用了长连接的方式,这使得管道(pipeline)网络传输成为了可能。
即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

举例来说,客户端需要请求两个资源。以前的做法是,在同一个 TCP 连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求。那么,管道机制则是允许浏览器同时发出 A 请求和 B 请求,如下图:

HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第3张图片

但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应
如果服务端在处理 A 请求时耗时比较长,那么后续的请求的处理都会被阻塞住,这称为「队头堵塞」。
所以,HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞

缺点

  1. 队头阻塞

因为当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会招致客户端一直请求不到数据,这也就是「队头阻塞」,好比上班的路上塞车。
HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第4张图片

HTTP/2.0

优点

  1. 安全性有保障,基于HTTPS

  2. 头部压缩

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分
这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

  1. 二进制格式

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)

  1. 并发传输

而 HTTP/2 就很牛逼了,引出了 Stream 概念,多个 Stream 复用在一条 TCP 连接。
HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第5张图片
从上图可以看到,1 个 TCP 连接包含多个 Stream,Stream 里可以包含 1 个或多个 Message,Message 对应 HTTP/1 中的请求或响应,由 HTTP 头部和包体构成。Message 里包含一条或者多个 Frame,Frame 是 HTTP/2 最小单位,以二进制压缩格式存放 HTTP/1 中的内容(头部和包体)。

  1. 服务器推送

服务器和客户端双方都可以建立Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。

缺点

HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,看似很完美了,但是 HTTP/2 还是存在“队头阻塞”的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。

HTTP/2是基于TCP协议,在TCP层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给HTTP应用,当上一个字节数据没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这一个字节数据到达时,HTTP/2应用层才能从内核中拿到数据。这就是HTTP/2队头阻塞问题!
HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第6张图片

HTTP/3.0

HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
UDP 发送是不管顺序,也不管丢包的,所以不会出现像 HTTP/2 队头阻塞的问题。大家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。

优点

  1. 无队头阻塞

QUIC 协议也有类似 HTTP/2 Stream 与多路复用的概念,也是可以在同一条连接上并发传输多个 Stream,Stream 可以认为就是一条 HTTP 请求。
QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。
所以,QUIC 连接上的多个 Stream 之间并没有依赖,都是独立的,某个流发生丢包了,只会影响该流,其他流不受影响。

  1. 更快建立连接

HTTP/3 在传输数据前虽然需要 QUIC 协议握手,但是这个握手过程只需要 1 RTT,握手的目的是为确认双方的「连接 ID」,连接迁移就是基于连接 ID 实现的。
HTTP 1.0 / 1.1 / 2.0 / 3.0 区别_第7张图片

  1. 连接迁移

基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。那么当移动设备的网络从 4G 切换到 WIFI 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立连接

而 QUIC 协议没有用四元组的方式来“绑定”连接,而是通过连接 ID 来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。


总结

好啦,以上就是我们今天要介绍的全部内容,希望能帮助你更好的理解和记忆HTTP各版本之间的区别。如果有什么问题,欢迎在评论区讨论,一起学习进步!
在这里插入图片描述


参考连接

https://xiaolincoding.com/network/2_http/http_interview.html#http-1-1%E3%80%81http-2%E3%80%81http-3-%E6%BC%94%E5%8F%98

你可能感兴趣的:(http,网络,服务器)