HTTP2 和 HTTP3

HTTP2

http2 是对http1.1 的升级,对http1.1的性能做了优化。

http2 在底层传输做了很多的改进和优化,但是在语义上和HTTP /1.1 是完全兼容的。

http/1.1 的不足

并行处理能力弱

一个连接只能处理一个请求。每个连接只能处理一个请求,如果有多个请求需要建立多个连接,但是浏览器针对一个域名的连接数最大限制为 6 。所以最大只能并行处理6个请求。

只能客户端发起连接

http/1.1 为标准的请求/应答模式,请求和应答为成对出现,并且只允许客户端主动发起,不能服务端主动发起请求。

头部开销大

http 是无状态的,为了维持http的状态,http的每次请求都携带大量的header信息,这么多的头部信息也是一个比较大的网络开销。

SPDY 和 HTTP2

SPDY(speedy):一种开放网络传输协议,由Google开发,用来发送网页内容。基于传输控制协议(TCP)的应用层协议。SPDY也就是HTTP/2的前身。

在只有Http/1.1 的时候,谷歌为了优化http/1.1 的确定,开发了一个基于TCP的应用层协议,此协议应用在HTTP层的下面,对HTTP协议进行优化和改进,并且此协议必须使用SSL/TLS.

谷歌开发的SPDY 是在http协议之下 TLS层之上,增加一个一个层,这样即使增加了SPDY层,对应用户使用来说是没有感知的。方便快速的迁移。

HTTP/2的开发基于SPDY进行跃进式改进。在诸多修改中,最显著的改进在于,HTTP/2使用了一份经过定制的压缩算法,基于霍夫曼编码,以此替代了SPDY的动态流压缩算法,以避免对协议的Oracle攻击——这一类攻击以CRIME为代表。此外,HTTP/2禁用了诸多加密包,以保证基于TLS的连接的前向安全。

HTTP/2标准于2015年5月以RFC 7540正式发表。

HTTP2概念

数据流:已建立的连接内的双向字节流,可以承载一条或多条消息。(http2支持在一个连接内建立多个传输通道了,传输通道是一个逻辑的概念)

消息:就是http请求和响应消息,由一系列帧组成。

:http/2 通信的最小单位,每个帧都包含了帧头和帧的数据部分。帧头上包含了数据属于那个数据流。

在数据传输过程中,客户端和服务端可以建立多个连接,并且每个连接内可以传输不同的多个请求。

可以理解为假设有 5个请求的数据,把这5个请求的数据拆分成多个帧,帧头上标识了具体的某个帧是哪个请求,在传输过程中帧是乱序发送的,当发送完毕后再根据帧头将帧组成成请求。

这种传输方式可以避免传输等待,不用等着前一个数据传输完成后面的才能传输。

注意:数据流只是逻辑的概念

HTTP2特性 - 二进制格式

HTTP1.1的数据格式是文本格式,使用的是ASCII文本传输,使用文本格式方便调试的时候查看数据内容。

而HTTP2 使用了二进制的格式,二进制的格式更加方便计算机传输,体积上也比文本传输的数据量小。

在HTTP2 中,头部信息和数据部分 分为2个frame 进行传输。

HTTP2特性 - 多路复用

客户端和服务端将http消息拆分成互不依赖的帧,然后交错发送,最后在另一端把他们重新组装起来。

通过消息拆分的方式做到一个连接处理多个请求和响应。

​ http2的多路复用可以很好的减少连接数,高效的利用连接,并行发送多个数据

http2的多路复用的核心就是一个连接中能发送多个数据

HTTP2特性 - 优先级

因为不同的数据流可以同时在一个连接中传输,那么究竟那个数据流的传输先后顺序就值得商榷。

Http/2 标准允许每个数据流都有一个关联的权重和依赖关系,通过为流设置优先级,在传输能力有限的时候,根据流的优先级来发送流对应的帧。

给每个数据流分配一个 1-256 的整数值作为一个权重,并且可以显示的指定流之间的依赖关系。

客户端可以生成类似于上图的一个权重和依赖树。

此依赖树的主要特点是:

  • 处于同一级的2个流,权重高的优先传输
  • 如图 C 数据流 依赖 D 数据流,所以D 数据流优先于C 数据流发送。
  • A 和B 具有相同的传输优先级,但是A 的权重是 12 B的权重是 4,那么A 分配的传输资源是 12 / 16 B 分配的是 4 / 16

HTTP2特性 - 头部压缩

http/1.1中的数据传输过程中会有大量的头部信息被重复发送,这样有大量的网络资源被浪费。

而HTTP/2中支持头部压缩的特性,对传输头部数据做了优化。

HTTP/2 使用HPACK压缩请求头和响应头,减少了头部数据的传输。

​ 头部压缩示意图

客户端与服务端维护一份共同的静态字典,其中包含了常见头部名及常见头部名称与值的组合的代码;

客户端和服务端根据先入先出的原则,维护一份可动态添加内容的共同动态字典

动态字段每次传递的过程中进行更新,当再次发送到已经发送过的头部信息的时候,传输的头部信息的key 为字段的索引id。通过这种方式减少了数据传输。具体的实现原理可 查询 HPACK 算法

HTTP2特性 - 服务端推送

http/1.1只能一个请求一个响应,而http2 支持对一个请求发出多个响应。可以对客户端推送一些必要的资源,比如一个网页对应的内容css ,js等文件,在请求这个网页的时候,一并推送给客户端,减少了客户端再一个一个请求的开销。

HTTP2 的不足

http2相对于http/1.1 已经有了很大的提高,但是仍然还有未解决的性能问题。

队头阻塞问题

tcp的队头阻塞:

TCP协议是顺序发送,并有重发机制,数据传输过程中会有拥塞控制并且数据传输过程中也可能出现丢包,那么就需要等待前面丢失的数据重发,后面的数据就会发生阻塞。

http的队头阻塞:

在http/1.1 中,当多个请求先后调用http发送的时候,因为一个连接只能有一个请求,所以分配到一个连接上的请求,需要等待队列前面的请求完毕,才能继续发送请求,当前面发生阻塞,后续无法进行。

http 的队头阻塞问题,http2 中使用多路复用的请求方式已经改进。

http/1.1 和 http/2 都是基于 tcp协议进行传输的,所以tcp的队头阻塞问题,不管是http/1.1 还是http/2 都有此问题。

运输层的UDP协议没有队头阻塞问题,因为没有顺序重发机制

握手延迟

HTTP 每次请求的时候都需要经过3次握手。如果使用HTTPS还需要经过多次TLS 的握手网络请求,这些握手操作会带来很大的网络开销。

HTTP3

HTTP/3是第三个主要版本的HTTP协议。

http/3 由google开发,最大的改变是弃用了 TCP协议,改为基于UDP的QUIC协议实现。

HTTP/3 的主要特性

  • 运输层启用了TCP协议,而使用基于UDP的QUIC协议。

    这样就避免了TCP的队头阻塞问题。而关于TCP的相关特性,比如传输可靠性,流量控制等都由QUIC此协议来控制。QUIC协议在运输层之上,而在HTTP协议之下,HTTP/3的使用方式相对于之前的版本是完全兼容的,所以一部分之前运输层TCP要处理的事情都提到QUIC层来处理了。

  • 0RTT

    RTT (Round Trip Time) 指的往返的时延。

    http3 大量的减少因为握手导致的延时问题,通过缓存会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。

  • 向前纠错机制

    在tcp数据包丢失的后,需要将数据包重新发送,而QUIC协议中支持丢失少量的数据包而不需要重新发送。

    需要的做法是在相邻的数据包中互相冗余相邻数据包的内容,假设只丢失了1个数据包,可以根据周围数据包的冗余信息推算出丢失的这个数据包的内容。

  • 连接迁移

    tcp基于4要素进行连接(源ip,源端口,目标ip,目标端口),所以tcp一旦切换网络,会就导致连接发生变化,就需要等原来的连接发生超时后重新连接。

    而基于QUIC 协议不受此影响。是以为QUIC并不仅仅只以这4个要素作为一个标识,而是使用一组 Connection ID (连接 ID)来标识一个连接,即使网络发生了变化,只要Connection ID 没有发生变化,那么连接依然可以保持。

各个HTTP协议的对比