学学HTTP2.0的特性

引言

秋招来临,在面试过程中不仅会问到前端知识、算法问题,网络相关的内容也会多少涉及,被问的最多的就是“你了解HTTP2.0吗?”由于这个问题并不能很完美的回答出来,因此特地查阅了相关资料、博客,最终整理出一份通俗易懂的HTTP2.0入门文章,也算是学习笔记,希望能给看到该文章的你带来一些收获。

什么是HTTP2.0

想要了解一个事物,首先就要知道它是什么。

简单来说,HTTP/2(超文本传输协议第2版,最初命名为HTTP2.0),是HTTP协议的第二个主要版本。HTTP/2是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY协议。
HTTP2.0的特点是:在不改动HTTP语义、方法、状态码、URI及首部字段的情况下,大幅度提高了web性能。

什么是SPDY协议

刚刚对HTTP2.0的介绍中引出了一个名词 —— SPDY协议,这又是什么呢?

SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。

HTTP1.x的缺点

任何事物的更新都是为了弥补或修复上个版本的某些问题,那么我们来看看HTTP1.x都有哪些缺点以至于我们要使用HTTP2.0。

HTTP1.x有以下几个主要缺点:

HTTP/1.0一次只允许在一个TCP连接上发起一个请求,HTTP/1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队列头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
单向请求,只能由客户端发起。
请求报文与响应报文首部信息冗余量大。
数据未压缩,导致数据的传输量大。
我们可以通过一个链接来对比一下HTTP2.0到底比HTTP1.x快了多少。链接地址

HTTP2.0特点
通过以上内容,你应该已经对HTTP2.0有了初步认识,并且了解了HTTP1.x的缺点。那么下面我们就来了解一下HTTP2.0的特点。
在这里插入图片描述

二进制传输

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

为了保证HTTP不受影响,那就需要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。

多路复用

在HTTP1.0中,我们经常会使用到雪碧图、使用多个域名等方式来进行优化,都是因为浏览器限制了同一个域名下的请求数量,当页面需要请求很多资源的时候,队头阻塞(Head of line blocking)会导致在达到最大请求时,资源需要等待其他资源请求完成后才能继续发送。
HTTP2.0中,有两个概念非常重要:帧(frame)和流(stream)。
帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。
所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。
图片描述

Header压缩

在HTTP1.0中,我们使用文本的形式传输header,在header中携带cookie的话,每次都需要重复传输几百到几千的字节,这着实是一笔不小的开销。
在HTTP2.0中,我们使用了HPACK(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。并在两端维护了索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。

服务器Push

在HTTP2.0中,服务端可以在客户端某个请求后,主动推送其他资源。
可以想象一下,某些资源客户端是一定会请求的,这时就可以采取服务端push的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间。在浏览器兼容的情况下也可以使用prefetch。

更安全
HTTP2.0使用了tls的拓展ALPN做为协议升级,除此之外,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法。

额外补充:QUIC
这里额外给大家介绍一个协议,是由Google基于UDP实现的同为传输层的协议,目标是希望替代TCP协议。
该协议支持多路复用,虽然说HTTP2.0也支持多路复用,但是下层仍然是TCP,因为TCP的重传机制,只要一个包丢失就得判断丢包并且重传,导致发生队头阻塞的问题,但是UDP没有这个限制。除此之外,它还有如下特点:

实现了自己的加密协议,通过类似TCP的TFO机制实现0-RTT,当然TLS1.3已经实现了0-RTT。
支持重传和纠错机制,在只丢失一个包的情况下不需要重传,使用纠错机制恢复丢失的包。

纠错机制:通过异或的方式,算出发出去的数据的异或值并单独发出一个包,服务端在发现有一个包丢失的情况下,通过其他数据包的异或值包算出丢失包。
在丢失两个包及以上的情况就是用重传机制,因为算不出来了。

总结:

HTTP/1.0一次只允许在一个TCP连接上发起一个请求;HTTP/1.1流水线技术也只能部分处理请求并发,并仍然存在队列头阻塞问题,因此客户端在需要发起多次请求时,典型情况下,通常采用建立多连接来减少延迟。

单向请求,请求只能由客户端发起。

请求报文与响应报文首部信息冗余量大。

数据未压缩,数据传输量大。

SPDY正是Google在HTTP即将从1.1向2.0过渡之际推出的协议,长期以来一直被认为是HTTP 2.0可行选择。

SPDY与HTTP相比,具有如下优点:

SPDY支持多路复用,实现请求优化;

SPDY支持服务器推送技术;

SPDY压缩了HTTP报文首部信息,节省了传输数据带宽;

SPDY强制使用SSL传输协议,全部请求由SSL加密,信息传输更安全。

HTTP/2协议通过定义一个HTTP语义向底层连接的优化映射,来解决这些问题。HTTP/2允许在同一连接上交错地发送/接收请求报文和响应报文,使用高效的HTTP报头字段编码,还支持请求优先级,使让更重要的请求能更快速被处理,从而进一步提升性能。另外,HTTP/2通过使用二进制的消息帧,实现消息的高效处理。

HTTP/2 提供了HTTP语义的优化传输。HTTP/2支持所有HTTP/1.1的核心特征,并且在不同的方面做的更高效。

HTTP/2的基本协议单元是帧(frame),每个类型帧用于不同用途。例如, HEADERS帧和DATA帧构成基本的HTTP请求报文和响应报文,其他类型帧,如SETTINGS帧、WINDOW_UPDATE帧和PUSH_PROMISE帧用于支持HTTP/2的其他特性。

HTTP/2的请求多路复用是通过将每个HTTP请求/响应交换与其自身的流进行关联来实现的。流在很大程度上是相互独立的,因此一个阻塞或终止的请求/响应并不会影响其他流。

HTTP/2的流量控制和优先级能确保高效地使用复用流。流量控制有助于确保只传输接收方使用的数据,优先级可以确保有限的资源被优先用于最重要的流。
HTTP/2添加了一种新的交互模式,即服务器可以向客户端推送消息。服务器推送允许服务端预测客户端需要来发送数据给客户端,平衡网络利用率以及潜在的延迟。

HTTP/2帧包含的HTTP报头字段是压缩的。HTTP请求有可能是高度冗余的,因此压缩能显著减少请求和响应的大小。

HTTP/2使用与HTTP/1.1相同的“http”和“https”URI方案,并且共享相同的默认端口号:“http” URI的默认端口号为80,“https” URI的默认端口号为443。HTTP/2可以使用加密(推荐),也可以不使用加密,“h2”标识使用TLS的HTTP/2(即安全的HTTP/2),“h2c”则标识运行在明文TCP之上的HTTP/2(即非加密的HTTP/2)。

例题:

下面关于HTTP/2的描述中,错误的是?

A.HTTP/2基于SPDY协议,充分解决了TCP连接的限制,它允许多个并发HTTP请求公用一个TCP会话

B.针对只能由客户端发起请求的问题,HTTP/2添加了一种新的交互模式,即服务器推送

C.HTTP/2提供了HTTP语义的传输优化,支持HTTP/1.1的所有核心特征,并且在其他方面做得更高效

D.HTTP/2是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层

该题为楚楚街笔试题,根据前文的分析,可见选项A、B、C均是正确叙述,只有选项D的叙述不准确。

来源:https://www.jianshu.com/p/d352b4c9e26a

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页