HTTP2:如何提升⽹络速度?

虽然HTTP/1.1已经做了⼤量的优化,但是依然存在很多性能瓶 颈,依然不能满⾜我们⽇益变化的新需求,所以就有了今天要聊的HTTP/2。


HTTP/1.1为⽹络效率做了⼤量的优化,最核⼼的有如下三种⽅式:

1.增加了持久连接

2.浏览器为每个域名最多同时维护6个TCP持久连接;

3.使⽤CDN的实现域名分⽚机制。


HTTP/1.1的主要问题

HTTP/1.1对带宽的利⽤率却并不理想,这也是HTTP/1.1的⼀个核⼼问题。

带宽是指每秒最⼤能发送或者接收的字节数。我们把每秒能发送的最⼤字节数称为上⾏带宽,每秒能够接收的最⼤字节数称为下⾏带宽

⽐如我们常说的100M带宽,实际的下载速度能达到12.5M/S,⽽采⽤HTTP/1.1时,也许在加载⻚⾯资源时最⼤只能使⽤到2.5M/S,很难将12.5M全部⽤满。

之所以会出现这个问题,主要是由以下三个原因导致的。

第⼀个原因,TCP的慢启动。

⼀旦⼀个TCP连接建⽴之后,就进⼊了发送数据状态,刚开始TCP协议会采⽤⼀个⾮常慢的速度去发送数 据,然后慢慢加快发送数据的速度,直到发送数据的速度达到⼀个理想状态,我们把这个过程称为慢启动。

慢启动是TCP为了减少⽹络拥塞的⼀种策略,我们是没有办法改变的。

⽽之所以说慢启动会带来性能问题,是因为⻚⾯中常⽤的⼀些关键资源⽂件本来就不⼤,如HTML⽂件、 CSS⽂件和JavaScript⽂件,通常这些⽂件在TCP连接建⽴好之后就要发起请求的,但这个过程是慢启动, 所以耗费的时间⽐正常的时间要多很多,这样就推迟了宝贵的⾸次渲染⻚⾯的时⻓了。


第⼆个原因,同时开启了多条TCP连接,那么这些连接会竞争固定的带宽。

系统同时建⽴了多条TCP连接,当带宽充⾜时,每条连接发送或者接收速度会慢慢向上增 加;⽽⼀旦带宽不⾜时,这些TCP连接⼜会减慢发送或者接收的速度。

这样就会出现⼀个问题,因为有的TCP连接下载的是⼀些关键资源,如CSS⽂件、JavaScript⽂件等,⽽有 的TCP连接下载的是图⽚、视频等普通的资源⽂件,但是多条TCP连接之间⼜不能协商让哪些关键资源优先 下载,这样就有可能影响那些关键资源的下载速度了


第三个原因,HTTP/1.1队头阻塞的问题。

在HTTP/1.1中使⽤持久连接时,虽然能公⽤⼀个TCP管道,但是在⼀个管道中同 ⼀时刻只能处理⼀个请求,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。

但队头阻塞使得这些数据不能并⾏请求,所以队头阻塞是很不利于浏览器优化的。


HTTP/2的多路复⽤

慢启动和TCP连接之间相互竞争带宽是由于TCP本⾝的机 制导致的,⽽队头阻塞是由于HTTP/1.1的机制导致的。

虽然TCP有问题,但是我们依然没有换掉TCP的能⼒,所以我们就要想办法去规避TCP的慢启动和TCP连接 之间的竞争问题。

基于此,HTTP/2的思路就是⼀个域名只使⽤⼀个TCP⻓连接来传输数据,这样整个⻚⾯资源的下载过程只需要⼀次慢启动,同时也避免了多个TCP连接竞争带宽所带来的问题

另外,就是队头阻塞的问题,等待请求完成后才能去请求下⼀个资源,这种⽅式⽆疑是最慢的,所以 HTTP/2需要实现资源的并⾏请求,也就是任何时候都可以将请求发送给服务器,⽽并不需要等待其他请求 的完成,然后服务器也可以随时返回处理好的请求资源给浏览器。

HTTP/2的解决⽅案可以总结为:⼀个域名只使⽤⼀个TCP⻓连接和消除队头阻塞问题

该图就是HTTP/2最核⼼、最重要且最具颠覆性的多路复⽤机制

从图中会发现每个请求都有⼀个对应的 ID,如stream1表⽰index.html的请求,stream2表⽰foo.css的请求。这样在浏览器端,就可以随时将请求 发送给服务器了。

HTTP/2使⽤了多路复⽤技术,可以将请求分成⼀帧⼀帧的数据去传输,这样带来了⼀个额外的好处,就是 当收到⼀个优先级⾼的请求时,⽐如接收到JavaScript或者CSS关键资源的请求,服务器可以暂停之前的请 求来优先处理关键资源的请求。


多路复⽤的实现


HTTP/2添加了⼀个⼆进制分帧层,结合图来分析下HTTP/2的请求和接收过程。

  • ⾸先,浏览器准备好请求数据,包括了请求⾏、请求头等信息,如果是POST⽅法,那么还要有请求体
  • 这些数据经过⼆进制分帧层处理之后,会被转换为⼀个个带有请求ID编号的帧,通过协议栈将这些帧发送 给服务器。
  • 服务器接收到所有帧之后,会将所有相同ID的帧合并为⼀条完整的请求信息。
  • 然后服务器处理该条请求,并将处理的响应⾏、响应头和响应体分别发送⾄⼆进制分帧层。
  • 同样,⼆进制分帧层会将这些响应数据转换为⼀个个带有请求ID编号的帧,经过协议栈发送给浏览器。
  • 浏览器接收到响应帧之后,会根据ID编号将帧的数据提交给对应的请求。

HTTP/2其他特性

多路复⽤是HTTP/2的最核⼼功能,它能实现资源的并⾏传输

基于⼆进制分帧层,HTTP/2还附带实现了很多其他功能。

可以设置请求的优先级

浏览器中有些数据是⾮常重要的,但是在发送请求时,重要的请求可能会晚于那些不怎么重要的请 求,如果服务器按照请求的顺序来回复数据,那么这个重要的数据就有可能推迟很久才能送达浏览器,这对 于⽤⼾体验来说是⾮常不友好的

为了解决这个问题,HTTP/2提供了请求优先级,可以在发送请求时,标上该请求的优先级,这样服务器接 收到请求之后,会优先处理优先级⾼的请求。


服务器推送

除了设置请求的优先级外,HTTP/2还可以直接将数据提前推送到浏览器。

可以想象这样⼀个场景,当⽤ ⼾请求⼀个HTML⻚⾯之后,服务器知道该HTML⻚⾯会引⽤⼏个重要的JavaScript⽂件和CSS⽂件,那么在接收到HTML请求之后,附带将要使⽤的CSS⽂件和JavaScript⽂件⼀并发送给浏览器,这样当浏览器解析完HTML⽂件之后,就能直接拿到需要的CSS⽂件和JavaScript⽂件,这对⾸次打开⻚⾯的速度起到了⾄关重要的作⽤。


头部压缩

⽆论是HTTP/1.1还是HTTP/2,它们都有请求头和响应头,这是浏览器和服务器的通信语⾔。

HTTP/2对请求头和响应头进⾏了压缩,提升了传输效率。