您的位置:首页> 前端教程> HTTP协议

HTTP2 协议

2019-5-7 08:24| 作者: admin| 查看: 686| 评论: 0|来自: 蚂蚁部落

关于HTTP协议版本的发展可以参阅HTTP 版本发展介绍一章节。

互联网飞速发展的今天,HTTP1.1版本的不足显现无疑,参阅HTTP1.1有点与缺点一章节。

一.HTTP2协议的目的:

(1).支持请求与响应的多路复用来减少延迟。

(2).压缩HTTP首部字段将协议开销降至最低。

(3).增加对请求优先级和服务器端推送的支持。

同时由于考虑到庞大的HTTP1.1协议用户,所以HTTP方法、状态码、URI及首部字段,等核心概念保持不变,也就是当前正在运行的网站不用做任何改变即可在HTTP2协议上运行。

二.HTTP2诞生过程:

谷歌公司于2009年发布名为SPDY的实验性协议,主要目的是为了解决HTTP1.1所存在的主要问题,由此减少网页加载的延迟,提升用户体验,所要达成的主要目标如下:

(1).页面加载时间缩小至原来一半作用,用户要有明显的感受。

(2).当前网站无需修改任何内容即可应用此协议,也就是保持HTTP 1.1的语义。

(3).测试新协议的有效性,进一步发展推广词协议。

由于SPDY协议能够大幅度提升性能,在随后的几年,此协议得到谷歌或者火狐等浏览器的支持,于是,它成为一种标准的条件逐步成熟,在2012年,HTTP-WG将HTTP2的开发提上日程,在SPDY的基础上指定官方标准,最终在2015年发布了HTTP2。

三.主要技术实现:

虽然HTTP1.1比较简单,但是以牺牲性能为代价,HTTP2主要目的是为了提升性能,下面就逐一介绍一下HTTP2主要采取哪些技术手段来达成目的。

1.二进制分帧层:

HTTP2性能之所以得到大幅度提高,主要因为增加了二进制分帧层,它定义如何封装HTTP消息并在客户端与服务器之间传输。

图示如下:

aid[3251]

二进制分帧层是位于TCP协议与HTTP应用层协议之间的一个新机制,它不会影响原有的HTTP语义。

不同的是传输期间对它们的编码方式变了。HTTP 1.x以换行符作为纯文本的分隔符,而HTTP2将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码。

2.流、消息和帧:

二进制分帧机制改变了客户端与服务器之间交互数据的方式,涉及到以下几个重要的概念:

(1).流:已建立的TCP连接上的双向字节流,逻辑上可看做一个较为完整的交互处理单元,即表达一次完整的资源请求-响应数据交换流程;一个业务处理单元,在一个流内进行处理完毕,这个流生命周期完结。

(2).消息:由一个或多个帧组合而成,例如请求和响应。

(3).帧:HTTP2通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流。

所有HTTP2通信都在一个连接上完成,此连接理论上可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。

图示如下:

aid[3252]

特别说明:HTTP2的所有帧都采用二进制编码,所有首部数据都会被压缩。

上图只是演示数据流、消息和帧之间的关系,而非实际传输时的编码结果。

3.多向请求与响应:

在HTTP1.1中,如果想使用多个并行request请求,必须多开TCP连接,但是一个域名对同一个浏览器客户端是有数量限制的(6个左右),同时,每一个连接中的响应是按照顺序排队进行的,容易导致队头堵塞。

二进制分帧层实现了多向请求和响应,客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。

图示如下:

aid[3253]

由上图可以看出,同一个TCP连接可以传输多个数据流,并且服务器到客户端方向有多个数据流,流是一个逻辑信道,所以属于它的帧可以乱序发送,最后再根据标记组合起来即可。把HTTP消息分解为独立的帧,交错发送,然后在另一端重新组装是HTTP2最重要的改进,带来了巨大的性能提升,主要因为如下几个原因:

(1).可以并行交错地发送请求,请求之间互不影响。

(2).可以并行交错地发送响应,响应之间互不干扰。

(3).只使用一个连接即可并行发送多个请求和响应。

(4).消除不必要的延迟,从而减少页面加载的时间。

二进制分帧机制解决了HTTP1.1对头阻塞问题,也消除了并行处理和发送请求及响应时对多个TCP连接的依赖。

4.请求优先级:

每个流都包含一个优先级,用来告诉对端哪个流更重要,当资源有限的时候,服务器会根据优先级来选择应该先发送哪些流。HTTP2中,每个请求都可以带一个31bit的优先值,0表示最高优先级。数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。

5.服务器推送:

当前web页面的功能越来越强大,排版越来越精美,所以需要引用的js文件、css文件或者图片等内容也越来越多,对每一个资源的外部引用,都是一次request请求。在HTTP1.1中,由于不具有多向请求与响应,所以可能需要额外的TCP连接,甚至导致队头堵塞,HTTP1.1对此问题的解决方案可以参阅HTTP请求延迟解决方案一章节。

当客户端获取服务器发送来的文档之后,通过分析获知需要引入额外的资源,然后再向服务器发送请求获取这些资源,如此大费周章,倒不如服务器主动推送这些额外资源。

推送资源的特点如下:

(1).客户端可以缓存推送过来的资源。

(2).客户端可以拒绝推送过来的资源。

(3).推送资源可以由不同的页面共享。

(4).服务器可以按照优先级推送资源。

6.首部压缩:

在HTTP1.1中,每次请求或者响应都会发送一组首部信息,同时这些信息都是以文本形式发送,如果带有cookie信息的话,那么发送首部信息就是一份相当大的额外开销。为减少这些开销并提升性能,HTTP2会压缩首部元数据,HTTP2在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键/值对,对于相同的数据,不再通过每次请求和响应发送,首部表在HTTP2的连接存续期内始终存在,由客户端和服务器共同渐进地更新。

图示如下:

aid[3254]

四.应用层协商:

客户端、服务器都需要升级才能支持HTTP 2.0,升级过程中就存在HTTP1.1、HTTP 2.0并存的情况,然而它们都使用的80端口,那么如何来选择使用什么协议通信呢,APLN(APLN:Aplication Layer Protocol Negotiation)就是为了解决这个问题的,通过协商来选择通信的协议:

(1).客户端发起请求,如果支持HTTP/2,则带upgrade头部:

[HTML] 纯文本查看 复制代码
GET /page HTTP/1.1 
Host: server.example.com 
Connection: Upgrade, HTTP2-Settings 
Upgrade: HTTP/2.0 
HTTP2-Settings: (SETTINGS payload)

(2).服务器不支持,则拒绝升级,通过HTTP1.1返回响应 :

[HTML] 纯文本查看 复制代码
HTTP/1.1 200 OK 
Content-length: 243 
Content-type: text/html 
/* HTTP 1.1 response */

(3).服务器支持,则接受升级,切换到新分帧,使用HTTP/2通信:

[HTML] 纯文本查看 复制代码
HTTP/1.1 101 Switching Protocols 
Connection: Upgrade 
Upgrade: HTTP/2.0 
/* HTTP 2.0 response */

使用协议协商,无论是哪一种情况,都不需要额外的往返,如果客户端通过记录或者其他方式,知道服务器支持HTTP/2,则直接使用HTTP/2通信,无需再协议协商。


鲜花

握手

雷人

路过

鸡蛋
上一篇:HTTPS 协议下一篇:HTTP Etag与If-None-Match

最新评论

返回顶部