HTTP/2,了解一下

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012194956/article/details/79848848

对于HTTP的版本了解,我个人是因为遇到了缓存相关的问题,所以了解了一些从HTTP 1.0到HTTP 1.1的的一些头信息,其实掌握的并不深入,但是只针对解决当前问题的范畴下,所了解的这些东西貌似也是足够的。然后这两天又看到了关于Web前端优化相关的方案,才知道HTTP/2 居然也发挥了作用,不得不说,我的知识更新很被动,都是需要的时候才知道,有点out啦。下面是HTTP/2的一些个人总结,了解一下。

毋庸置疑,从HTTP 1.0到HTTP 1.1,再到HTTP/2,在前端领域中,其实都是对web性能优化的一个进阶的过程。

维基百科来一下。HTTP/2是HTTP协议自1999年HTTP 1.1之后的首个更新,主要基于SPDY协议,于2015年以RFC 7540正式发表。

HTTP/2与HTTP 1.1比较:

HTTP/2保留了大部分HTTP 1.1的语义,其请求方法,状态码,URL以及绝大多数HTTP头部字段都与HTTP 1.1保持一致。不同之处在于HTTP/2采用了新的方法来编码,传输客户端——服务器之间的数据。

SPDY与HTTP 1.1比较:

SPDY是一个由Google主导的HTTP替代协议,主要关注降低延迟,采用了TCP通道,但是使用不同的协议来达到此目的,相对于HTTP 1.1的改变主要是:多路复用,帧机制(简化客户端和服务器开发的消息),强制性压缩(包括HTTP头),优先级排序,双向通讯。

HTTP/2与SPDY比较:

HTTP/2是基于SPDY的跃进式改进,其主要改进在于:使用基于霍夫曼编码的压缩算法(代替了SPDY的动态流压缩算法,避免对协议的Oracle攻击,以CRIME为代表),禁用了诸多加密包(保证给予TLS的连接的前向安全)

HTTP/2的几个新特性:

(1)二进制分帧

有别于HTTP 1.1在连接中的明文请求。HTTP/2性能增强的核心在于新增的二进制分帧层(位于应用层和传输层之间)。在二进制分帧层上,HTTP/2会将所有传输的信息分割成更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP 1.x的首部消息会被封装到Headers帧,而request body则封装到Data帧里面。然后HTTP/2通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应的,每个数据流以消息的形式发送,而消息由一个或多个帧组成,这些帧可以乱序发送,然后再根据帧首部的流标识符重新组装。

(2)多路复用

“线头阻塞”问题:单一TCP连接的问题在于每一次只能发送一个请求,所以客户端必须等到收到响应后才能发出另一个请求。

HTTP/2将消息分解为帧,为每帧分配一个流标识符,然后在一个TCP连接上独立发送它们(也可以理解为,客户端和服务器可以将HTTP消息分解成互不依赖的帧,然后交错发送,最后在另一端把它们重新组装起来),从而实现了完整的请求和响应复用。(就比如,我们请求一个页面http://www.baidu.com,页面上的所有资源请求都是客户端与服务器上的一条TCP连接上请求和响应的)。

另外,HTTP性能的关键在于低延迟而不是高带宽,大多数HTTP的连接时间都很短,而且是突发性的,然而TCP只在长时间传输大块数据时效率才最高,HTTP/2更好地利用了TCP连接。

(3)服务器推送(server push)

简单理解就是服务端向客户端发送比客户端请求更多的数据。服务器可以对一个客户端请求发送多个响应,换句话说,除了对最初请求的响应外,服务器还可以向客户端推送额外的资源,而无须客户端明确地请求。所有服务器推送数据流都由PUSH_PROMISE帧发起,表明服务器向客户端推送所属资源的意图,并且需要先于请求推送资源的响应数据传输(顺序很重要,客户端需要了解服务器打算推送哪些资源,以免为这些资源创建重复请求)。客户端完全掌控服务器推送的使用方式。

(4)首部压缩

每个HTTP传输都会携带一组首部,用于描述传输的资源及其属性。在HTTP 1.x中,这些元数据都是以纯文本形式发送的,通常会给每个请求增加500~800字节的负荷,如果算上HTTP cookie,增加的负荷通常会达到上千字节。

HTTP/2拥有配套的HPACK,其目的是减少客户端请求与服务器响应之间的头信息重复所导致的开销。一方面,头信息使用GZip或compress压缩后再发送,另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号。

(5)数据流(stream)

HTTP/2的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的响应。HTTP/2将每个请求或响应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号ID。数据包发送的时候,必须标记数据流ID,用来区分它属于哪一个数据流。

另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的则为偶数。

另外,数据流发送到一半的时候,客户端和服务器都可以通过RST_STREAM帧发送信号取消这个数据流,但同时保证TCP连接。

(6)请求优先级

把HTTP消息分解成很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序进一步提升性能。每个流都可以带一个31比特的优先值(0表示最高优先级,2^31~1表示最低优先级),服务器可以根据流的优先级,控制资源分配(CPU,内存,带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。


猜你喜欢

转载自blog.csdn.net/u012194956/article/details/79848848