首页 > 技术文章 > HTTP 2.0标准针对HTTP 1.X的五点改进

JCpeng 2021-07-16 13:14 原文

HTTP 2.0兼容HTTP 1.X,同时大大提升了Web性能,进一步减少了网络延迟,减少了前端方面的工作。HTTP 1.X存在的缺点如下:

  1)HTTP 1.0一次只允许在一个TCP连接上发起一个请求,HTTP 1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队列头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
  2)单向请求,只能由客户端发起。
  3)请求报文与响应报文首部信息冗余量大。
  4)数据没有进行压缩处理,导致数据的传输量大

HTTP 2.0采用了新的二进制格式,解决了多路复用(连接共享)问题,可对Header进行压缩,使用较为安全的HPACK压缩算法,重置连接表现更好,有一定的流量控制功能,使用更安全的SSL。

一、二进制分帧

在尽可能兼容HTTP 1.X的前提下,为了解决HTTP 1.X存在的问题,改进传输性能,实现低延迟高吞吐量;HTTP 2.0在应用层(HTTP)和传输层(TCP)之间增加一个二进制分帧层

HTTP2.0中所有加强性能的核心是二进制传输,在HTTP1.x中,我们是通过文本的方式传输数据。基于文本的方式传输数据存在很多缺陷,文本的表现形式有多样性,因此要做到健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。
在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。

在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.X的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。

二、首部压缩

HTTP每次通信(请求或响应)都会携带首部信息用于描述资源属性。
在HTTP1.0中,使用文本的形式传输header,在header中携带cookie的话,每次都需要重复传输几百到几千的字节,这导致了极大的开销。
在HTTP2.0中,使用了HPACK(HTTP 2.0头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。并在两端维护了索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。

三、多路复用

HTTP2.0中,基于二进制分帧层,HTTP2.0可以在共享TCP连接的基础上同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发出去,在另一端根据流标识符和首部将他们重新组装起来。 通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。其中,帧、消息以及流的关系如下:

  1)帧:HTTP2.0通信的最小单位,所有帧都共享一个8字节的首部,其中包含帧的长度、类型、标志、还有一个保留位,并且至少有标识出当前帧所属的流的标识符,帧承载着特定类型的数据,如HTTP首部、负荷、等等。
  2)消息:比帧大的通信单位,是指逻辑上的HTTP消息,比如请求、响应等。每个消息由一个或多个帧组成。
  3)流:比消息大的通信单位。是TCP连接中的一个虚拟通道,可以承载双向的消息。每个流都有一个唯一的整数标识符。

四、请求优先级

把HTTP消息分为很多独立帧之后,就可以通过优化这些帧的交错和传输顺序进一步优化性能。

五、服务器推送

HTTP2.0新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。

服务端根据客户端的请求,提前返回多个响应,推送额外的资源给客户端。如下图,客户端请求stream 1(/page.html)。服务端在返回stream 1的消息的同时推送了stream 2(/script.js)和stream 4(/style.css)

服务端推送是一种在客户端请求之前发送数据的机制。在HTTP2.0中,服务器可以对一个客户端的请求发送多个响应。如果一个请求是由你的主页发送的,服务器可能会响应主页内容、logo以及样式表,因为他知道客户端会用到这些东西。这样不但减轻了数据传送冗余步骤,也加快了页面响应的速度,提高了用户体验。

推送的缺点:所有推送的资源都必须遵守同源策略。换句话说,服务器不能随便将第三方资源推送给客户端,而必须是经过双方的确认才行。

六、HTTPS与SSL/TLS协议

(1)https和http的区别:
  1)https需要ca证书,需要费用,http不用
  2)https是有安全性ssl加密传输协议,http是超文本传输,是明文的
  3)https和http的传输方式也不一样,端口也不一样,一个默认443,一个默认80
  4)https是又ssl和http组成的具有加密和身份安全认证的网络协议,http是无状态的

(2)SSL/TLS协议

  1)客户端给出一个协议版本号,一个客户端生成的随机数,以及客户端支持的加密方法
  2)服务端确认加密方法,发送数字证书,给出一个服务端生成的随机数
  3)客户端确认证书有效,生成一个新的随机数,并用证书内的公钥,加密这个随机数,发送给服务端,
  4)服务端用自己的私钥,获取这个随机数
  5)双方根据约定的加密方法,使用这三个随机数,生成"对话密钥",用来加密整个对话过程

推荐阅读