HTTP版本比较

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

HTTP目前一共有5个版本:0.9、1.0、1.1(主流)、2.0、3.0

HTTP版本比较

img

HTTP/1 ~ HTTP/3

版本 特点
HTTP 0.9 只能发送GET请求,没有协议头,不支持请求头,只支持纯文本
HTTP 1.0 1.支持GET、HEAD、POST方法 2.每一个请求建立一个TCP连接,请求完成后立即断开连接,导致两个问题:连接无法复用(无连接)队头阻塞 3.支持请求/响应头
HTTP 1.1 1.keepalive长连接,允许事务结束后保持TCP连接,以便复用,在请求头中有一个 Connection:Keep-alive(默认值) 2.chunked编码传输,将实体分块标明长度进行传送,在实体长度未知时特别有用 3.字节范围请求(断点续传),比如客户端已经有内容的一部分了,可以只请求剩下的部分,在请求消息中引入range实现 4.增加了 OPTIONS,PUT, DELETE, TRACE, CONNECT 方法 5.增加了24个错误状态码 6.HOST处理,在请求消息的URL中增加了主机名 hostname 7.管道传输,长连接有两种工作方式,非流水线方式:客户端收到响应后才能发送下一个请求。流水线方式:客户端不必收到响应即可继续发送请求,不过服务器会按照顺序回应请求,所以如果前面的请求比较慢,还是会队头阻塞
HTTP 2.0 1.多路复用(二进制分帧),将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,解决了队头阻塞的问题 首部信息会被封装到Headers帧,request body则封装到Data帧里面 2.通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流 3.头部压缩:当一个客户端向相同服务器请求许多资源时,像来自同一个网页的图像,将会有大量的请求看上去几乎同样的,这就需要压缩技术对付这种几乎相同的信息 4.服务器端推流,Server Push,服务端判断客户端的需求,主动推送资源 5.随时复位,HTTP2的RST_STREAM将能方便停止一个信息传输,启动新的信息,在不中断连接的情况下提高带宽利用效率
HTTP 3.0 基于UDP协议

参考:【HTTP】 各协议版本介绍-CSDN博客HTTP协议几个版本的比较 - 知乎 (zhihu.com)

一、http 1.1

特点:

  • 无状态
  • 明文传输(不安全)

性能:

  • 优化一:长连接
  • 优化二:管道网络传输
  • 问题:队头阻塞

1、无状态

好处:服务器不会去记忆 HTTP 的状态,不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。

坏处:完成有关联性的操作时会很麻烦,比如需要验证用户身份的一系列操作。

解决方案:cookie技术,在请求和响应报文头中写入cookie信息来控制客户端状态。客户端第一次请求时即产生cookie(不一定是登陆请求)

2、不安全(缺点)

  • 通信使用明文(不加密),内容可能会被窃听。比如,账号信息容易泄漏,那你号没了。
  • 不验证通信方的身份,因此有可能遭遇伪装。比如,访问假的淘宝、拼多多,那你钱没了。
  • 无法证明报文的完整性,所以有可能已遭篡改。比如,网页上植入垃圾广告,视觉污染,眼没了。

解决办法:HTTPS,在http协议与TCP协议之间加入 SSL/TLS 层

3、长连接

优化了http1.0每发送一次请求就建立一次连接(需要TCP三次握手)的性能问题

只要任意一端没有提出断开连接,就保持TCP连接状态。当然如果长时间没有交互,服务端会主动断开连接

短连接与长连接

4、管道网络传输

实际上很少使用,浏览器基本没有支持这个功能

得益于 长连接,在一个TCP连接里面,客户端可以发起多个请求,不用等第一个请求的响应回来,就可以将后面的请求发出,效果是减少了整体的响应时间

管道网络传输

但是服务端必须按照接受请求的顺序,来做出响应。如果处理前面的请求耗时较长,后面的请求就会被阻塞住,这种现象称为“队头阻塞”

5、队头阻塞

当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会招致客户端一直请求不到数据,这也就是「队头阻塞

本质原因是 「请求 - 应答」的模式

6、性能提升与瓶颈

相比于1.0

  • 长连接改善了短连接造成的无谓的性能开销

瓶颈

  • 请求头未经压缩,首部信息越多延迟越大,(只能压缩body部分)
  • 服务器按请求顺序响应,可能造成「队头阻塞」
  • 没有请求优先级控制

二、http 2.0

HTTP/2 协议是基于 HTTPS 的

HTT/1 ~ HTTP/2

特点:

  • 头部压缩
  • 二进制格式
  • 并发传输
  • 服务器主动推送

1、头部压缩

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分

这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度

2、二进制格式

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

3、并发传输

HTTP1.1之前采用的是「请求-响应」模型,因此有「队头阻塞」的问题

HTTP2.0引出了Stream的概念,多个Stream复用一条TCP连接

img

  • 一个TCP连接包含多个Stream
  • 一个Stream包含一个或多个Message(Message对应HTTP1中的请求或响应)
  • 一个Message包含一个或多个Frame帧,

针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应

4、服务器推送

HTTP/2,服务器可以主动向客户端发送消息

img

三、http 3.0

特点:

  • 基于UDP和QUIC协议
  • 无队头阻塞,得益于UDP的只阻塞丢包的流,其它流不受影响的特点
  • 更快的连接建立,QUIC内部包含了TLS,握手过程一起完成
  • 连接迁移,UDP通过「连接ID」来标记通信的两个节点(TCP通过「源地址、源端口、目标地址、目标端口」标记),因此IP地址的变化(从移动通信切换到wifi)不需要重新建立连接。

QUIC是新协议,很多设备还不支持,所以HTTP3.0的普及进度缓慢。

参考文章:

3.1 HTTP 常见面试题 | 小林coding (xiaolincoding.com)


HTTP版本比较
http://timegogo.top/2022/10/05/HTTP/HTTP版本比较/
作者
丘智聪
发布于
2022年10月5日
更新于
2023年7月16日
许可协议