HTTP2.0探究

 

      http1.1和http2.0在请求379张图片的对比演示(HTTP2.0性能惊人)html

 

   HTTP2.0是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY(读speedy)。  该协议在2015年以RFC 7540正式发表git

  

基本介绍

HTTP/1.1 时代

HTTP/1.1 对 HTTP/1.0 作了许多优化,也是当今使用得最多的 HTTP 协议github

  1. 持久化链接(keep-alive)以支持链接重用
  2. 分块传输编码(chunked)以支持流式响应
  3. 请求管道以支持并行请求处理
  4. 字节服务以支持基于范围的资源请求
  5. 改进的更好的缓存机制

   这里所说的持久连接是指:在HTTP1.0时代,每个请求都会从新创建一个TCP链接,一旦相应返回,就关闭连接,而创建一个连接,须要进行三次握手,这极大的浪费了性能。而HTTP1.1新增了【keep-alive】功能,当浏览器创建一个TCP连接时,多个请求都会使用这个链接。 (如今大多数浏览器都是默认开启的。)  算法

  而咱们所说的pipeLining管道是解决另外一个问题:在TCP连接中,同一时间内只可以发送一个请求,而且须要等到响应完成以后才能发送第二个请求。所以HTTP/1.1制定了Pipelining管道,经过这个管道,浏览器的多个请求能够同时发送到服务器,可是服务器的响应只能一个接着一个的返回(可是各大浏览器不支持/默认关闭,因此这个功能就是鸡肋了)。 
浏览器

   因此,因为鸡肋的功能,最终HTTP/1.1仍是一条连接只能返回一个响应,所以浏览器为了改善这种状况,会同时开启4~8个TCP连接进行发送请求。缓存

  

如何使用上 HTTP/2.0

  1. 须要浏览器的支持,目前最新版的 Chrome、Opera、 FireFox、 IE十一、 edge 都已经支持了
  2. 须要 WEB 服务器的支持,好比 Nginx , H20

  若是浏览器或服务器有一方不支持,那么会自动变成 Http/1.1性能优化

 

HTTP的基本优化

  影响一个HTTP网络请求的因素主要有两个:带宽和延迟。服务器

  • 带宽:若是说咱们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,可是如今网络基础建设已经使得带宽获得极大的提高,咱们再也不会担忧由带宽而影响网速,那么就只剩下延迟了。
  • 延迟:
    1. 浏览器阻塞(HOL blocking):浏览器会由于一些缘由阻塞请求。浏览器对于同一个域名,同时只能有 4 个链接(这个根据浏览器内核不一样可能会有所差别)超过浏览器最大链接数限制,后续请求就会被阻塞
    2.  DNS 查询(DNS Lookup):浏览器须要知道目标服务器的 IP 才能创建链接。将域名解析为 IP 的这个系统就是 DNS。这个一般能够利用DNS缓存结果来达到减小这个时间的目的。
    3.  创建链接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文达到真正的创建链接,可是这些链接没法复用会致使每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。

 

 

  一、链接和拼接网络

  连接或者拼接JS和CSS文件,雪碧图,以减小HTTP请求,同时浏览器能够缓存这些静态资源,为下次访问节约时间。可是这样带来的反作用是,维护成本高,其中某一个小改动都会使得整个拼接后的文件发生改变,从新缓存。tcp

  固然并非说无止境的拼接,建议大小为: 30~50 KB

  

  

     二、域名分区

  因为浏览器的限制,同一个域下最多只能创建6个链接。咱们一般使用子域名来减小全部资源在只有一个链接时的产生的排队延迟

 

  

  三、资源内嵌

  对于不经常使用的,较小大资源内嵌在文档中,好比base64的图片,以减小HTTP请求,可是这样的资源不能在浏览器中缓存,也不可能被其余页面共享,同时还有可能编码以后的资源变等更大了。

 

 

SPDY 时代

  因为现代网页的不断丰富, HTTP/1.1 协议的性能也逐渐吃不消,所以2012年google如一声惊雷提出了SPDY的方案,实际上,HTTP/2.0 也是以 SPDY 做为原型进行开发的

  

SPDY基础功能

多路复用(multiplexing)

多路复用经过多个请求stream共享一个tcp链接的方式,解决了http1.x holb(head of line blocking)的问题,下降了延迟同时提升了带宽的利用率。

请求优先级(request prioritization)

多路复用带来一个新的问题是,在链接共享的基础之上有可能会致使关键请求被阻塞。SPDY容许给每一个request设置优先级,这样重要的请求就会优先获得响应。好比浏览器加载首页,首页的html内容应该优先展现,以后才是各类静态资源文件,脚本文件等加载,这样能够保证用户能第一时间看到网页内容。

header压缩

前面提到过几回http1.x的header不少时候都是重复多余的。选择合适的压缩算法能够减少包的大小和数量。SPDY对header的压缩率能够达到80%以上,低带宽环境下效果很大

SPDY 现已经被大多数浏览器以及 WEB 服务器所支持,但为了推动 HTTP/2.0, Google 已经宣布在 2016年对其中止开发

 

 

HTTP/2.0 时代

二进制分帧

在应用层与传输层之间增长一个二进制分帧层,以此达到“在不改动HTTP的语义,HTTP 方法、状态码、URI及首部字段的状况下,突破HTTP1.1的性能限制,改进传输性能,实现低延迟和高吞吐量。”

在二进制分帧层上,HTTP2.0会将全部传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.x的首部信息会被封装到Headers帧,而咱们的request body则封装到Data帧里面。

 

压缩头部

HTTP/2.0规定了在客户端和服务器端会使用而且维护「首部表」来跟踪和存储以前发送的键值对,对于相同的头部,没必要再经过请求发送,只需发送一次

事实上,若是请求中不包含首部(例如对同一资源的轮询请求),那么首部开销就是零字节。此时全部首部都自动使用以前请求发送的首部。

若是首部发生变化了,那么只须要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP2.0的链接存续期内始终存在,由客户端和服务器共同渐进地更新。

 

 

多路复用

  HTTP/2.0 时代拥有了「多路复用」功能,意思是: 在一条链接上,我能够同时发起无数个请求,而且响应能够同时返回。(这个难点终于被解决了)

 

 

客户端和服务器能够把HTTP消息分解为互不依赖的帧,而后乱序发送,最后再在另外一端把它们从新组合起来。注意,同一连接上有多个不一样方向的数据流在传输。客户端能够一边乱序发送stream,也能够一边接收者服务器的响应,而服务器那端同理。

注意,对一个域名,只须要开启一条 TCP 链接,请求都在这条 TCP 链接上干活

所以在 HTTP/2.0 时代,以前的合并 JS、CSS 文件技巧,反而不适用了。

 

 

请求优先级

  既然全部资源都是并行发送,那么就须要「优先级」的概念了,这样就能够对重要的文件进行先传输,加速页面的渲染。

 

 

服务器推送

  在 HTTP2.0中,服务器推送是指在客户端请求以前发送数据的机制。若是一个请求是由你的主页发起的,服务器极可能响应主页内容、logo以及样式表,由于它知道客户端会用到这些东西。这至关于在一个 HTML 文档内集合了全部的资源,不过与之相比,服务器推送有一个很大的优点:能够缓存!

 

  

强制 SSL

  虽然 HTTP/2.0 协议并没声明必定要用 SSL,可是 Google Chrome 等浏览器强制要求使用 HTTP/2.0 必需要用上 SSL, 也就是说必需要: https://

 

对优化的影响:

  1. 由于“全部的HTTP2.0的请求都在一个TCP连接上”,“资源合并减小请求”,好比CSS Sprites,多个JS文件、CSS文件合并等手段没有效果,或者说没有必要。
  2. 由于“多路复用”,采用“cdn1.cn,cdn2.cn,cdn3.cn,打开多个TCP会话,突破浏览器对同一域名的连接数的限制”的手段是没有必要的。由于由于资源都是并行交错发送,且没有限制,不须要额外的多域名并行下载。
  3. 由于“服务器推送”,内嵌资源的优化手段也变得没有意义了。并且使用服务器推送的资源的方式更加高效,由于客户端还能够缓存起来,甚至能够由不一样的页面共享(依旧遵循同源策略)

 

 

 

HTTP2.0与SPDY的区别

  SPDY是谷歌公司2012年推出的一个新的协议,而HTTP2.0是基于SPDY的协议,因此HTTP2.0是SPDY的升级版!  因此,二者必然有不一样之处。

  • 新的二进制形式HTTP1.x的解析是基于文本。而基于文本协议的格式解析自然就存在缺陷,文本的表现形式有多样性,要作到健壮性考虑的场景不少 ,即要考虑不少;而二进制形式则不一样,只认0和1的组合,因此这种协议解析实现方便并且健壮 。
  • 多路复用。 即连接共享,每个request都是用连接共享机制的, 一个request对应一个id这样一个链接上能够有多个request, 每一个连接的request能够随机的混杂在一块儿,接收方能够根据request的id将request再归属到不一样的服务器请求了
  • header压缩HTTP2.0经过HPACK进行压缩,这种压缩方法是特地为HTTP2.0设定的。
  • 服务器推送。同SPDY同样,HTTP2.0也具备server push功能。

 

 

 

为何须要头部压缩?

假定一个页面有100个资源须要加载(这个数量对于今天的Web而言仍是挺保守的), 而每一次请求都有1kb的消息头(这一样也并很多见,由于Cookie和引用等东西的存在), 则至少须要多消耗100kb来获取这些消息头。HTTP2.0能够维护一个字典,差量更新HTTP头部,大大下降因头部传输产生的流量。

 

HTTP2.0多路复用有多好?

以前就提到了,http性能取决于带宽和延迟连个方面,如今带宽已经很好了,几乎再也不是阻碍,真正的阻碍是延迟!   HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 链接会随着时间进行自我「调谐」,起初会限制链接的最大速度,若是数据成功传输,会随着时间的推移提升传输的速度。这种调谐则被称为 TCP 慢启动。因为这种缘由,让本来就具备突发性和短时性的 HTTP 链接变的十分低效。HTTP/2 经过让全部数据流共用同一个链接,能够更有效地使用 TCP 链接,让高带宽也能真正的服务于 HTTP 的性能提高

 

 

 

参考文章: HTTP2.0简单总结 、HTTP1.0/1.1/2.0的区别

相关文章
相关标签/搜索