
在深入探讨该主题之前,我们先来看一些常用的HTTP / 2术语。
· 流:已建立的双向连接,可以携带一个或多个消息
· 消息:代表请求或响应消息的完整帧序列
· 帧:HTTP / 2中的最小通信单位。 每个帧都包含一个帧头,可以识别该帧所属的流。
· h2:HTTP / 2的短期
注意:它最初被命名为HTTP / 2.0,但后来删除了" .0"部分,因为它引起了与HTTP / 1.x的混淆。 因此,我们不再使用HTTP / 2.0,简称HTTP / 2或h2
HTTP / 2概述
HTTP / 2是HTTP网络协议的主要修订版,至今仍在万维网上广泛使用。 开发它是为了克服HTTP / 1.0和HTTP / 1.1版本中的某些缺点。 重复标头的开销和行头阻止(HOL阻止-当一个请求阻止其他请求完成时)是解决的两个主要问题。
HTTP / 2可以更有效地利用网络资源,压缩标头字段,在同一连接上进行多个并发交换,从而大大减少了延迟。
HTTP / 2还引入了服务器推送,它允许服务器将期望的数据发送到服务器,该服务器预计客户端将来会需要该数据。 因此,HTTP / 2提供了增强的安全性,速度和可用性。
HTTP / 2使用相同的URI方案,并共享与HTTP / 1.1相同的默认HTTP端口。
所有通信都是通过单个TCP连接执行的,该TCP连接可以承载任意数量的双向流。 每个流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。 帧是通信的单位,并且有几种类型的帧,例如HEADER,DATA和SETTINGS。 对于请求和响应通信,主要使用HEADER和DATA帧。
HTTP / 2的主要优点
多路复用
与HTTP / 1.1中的每个传输都必须等到其他传输完成不同的是,在HTTP / 2中,与HTTP / 2不同,在同一连接上同时允许多个请求。
在HTTP / 1.x中,每个连接一次只能传递一个响应,如果客户端要发出多个并行请求,则必须使用多个TCP连接。 这也导致行头阻塞和底层TCP连接的低效使用。
HTTP / 2通过使用新的二进制框架层(所有HTTP / 2通信被拆分为较小的消息和帧,并且它们各自以二进制格式进行编码)克服了这些限制,因此客户端和服务器端都必须使用新的二进制编码机制 为了彼此理解,因此,HTTP / 1.x客户端将无法理解仅HTTP / 2的服务器,反之亦然。)通过允许客户端和服务器将消息分解为独立的帧,交织它们并重新组装它们, 在另一端。
例如,

上图说明了同一连接内的多个流。 客户端正在通过流5向服务器发送DATA帧,而服务器正在通过流1和3向客户端发送帧的交错序列。
这也带来了一些性能上的好处,例如消除了级联文件中不必要的HTTP / 1 / x解决方法,图像精灵和域分片(有关更多信息,请参阅:针对HTTP / 1.x进行优化),通过消除不必要的延迟来减少页面加载时间以及 提高可用网络容量的利用率。
标头压缩
随着网页增长到需要数十到数百个请求,这些请求中的冗余标头字段不必要地消耗了带宽,从而显着增加了延迟。 因此,HTTP / 2强制所有HTTP标头以压缩格式发送,从而减少了需要在客户端浏览器和服务器之间交换的信息量,而HTTP / 1.1不提供任何形式的标头压缩。
压缩基于每个连接进行。 即,一个连接中的所有流共享同一压缩器。 如果压缩程序意识到之前已发送过标头,则不会重发该标头,而是说"与以前相同的标头"。 因此,一些永不更改的标头(例如Host,Accept或Cookies)将不会被重新发送,这将节省很多字节!
服务器推送
通过服务器推送,可以在客户端甚至请求其他资源之前,将其他资源发送给客户端以供将来使用。
在这里,服务器在浏览器请求资源之前先了解浏览器需要哪些资源。 然后,服务器将在请求它们之前将这些资源推送到浏览器。 这使得检索所有资源的整个过程变得更快。
例如,当浏览器请求网页时,服务器以HTML页面作为响应,浏览器必须对其进行解析,然后再次请求所有嵌入式资产,例如图像,CSS和JavaScript文件。 在HTTP / 2中,使用服务器推送概念,可以将服务器配置为在客户端明确请求它们之前,根据客户端的请求发送所有必需的资产。
流优先级
通过多路复用可以同时发送多个请求,而流优先级则使您可以定义哪个响应优先。 即 它可以帮助您通过与每个流关联的权重和依赖性来定义一个流相对于同一连接上的其他流的重要性。 结果,我们可以通过控制CPU,内存,带宽和许多其他资源的分配来优化资源使用,同时确保将高优先级响应传递给客户端。
流量控制
引入这种方法是为了防止由于多路复用而导致的同一连接中的流之间的任何破坏性干扰,这种多路复用会导致在使用TCP连接时引起争用,从而导致流阻塞。 流控制既用于单个流,也用于整个连接。
错误处理
HTTP / 2处理两类错误。
· 连接错误-阻止进一步处理框架层或破坏任何连接状态的任何错误。
· 流错误-与特定流相关的错误,不影响其他流的处理。
我将在下一个故事中谈论如何编写HTTP / 2服务和客户端
(本文翻译自Varuni Punchihewa的文章《What is HTTP/2?》,参考:https:///what-is-http-2-380d277d208c)
















