http/2.0时代已经来临了!

知识分享  文章转自:https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/78906348html

 

    如今是资源共享的时代,一样也是知识分享的时代,若是你以为本文能学到知识,请把知识与别人分享!编程

开篇HTTP发展的心路历程浏览器

 

640?wx_fmt=png&wxfrom=5&wx_lazy=1

上图:链接没法复用缓存

640?wx_fmt=png&wxfrom=5&wx_lazy=1

上图:设置Connection:Keep-Alive,保持链接在一段时间内不断开。服务器

640?wx_fmt=png

上图:HTTPpipelining:创建多个链接网络

640?wx_fmt=png

上图:多路复用架构

先对HTTP协议进行简单介绍并发

    1. HTTP协议 :Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。是互联网上应用最为普遍的一种网络协议。全部的WWW文件都必须遵照这个标准。socket

 

    2. HTTP是一个基于TCP/IP通讯协议来传递数据(HTML 文件, 图片文件, 查询结果等)。分布式

 

    3. HTTP是一个属于应用层的面向对象的协议,因为其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,通过几年的使用与发展,获得不断地完善和扩展。

 

    4. HTTP协议工做于客户端-服务端架构为上。浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

 

640?wx_fmt=png

 

HTTP 协议的版本

  1. HTTP 0.9做为HTTP协议的第一个版本。是很是弱的。请求(Request)只有一行,好比: GET www.leautolink.com

 

    2. HTTP1.0最先在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上。

 

    3. HTTP1.1则在1999年才开始普遍应用于如今的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为普遍的HTTP协议。

 

640?wx_fmt=png

 

HTTP 1.1 作了哪些升级:

 

  • 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来作为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

 

  • 带宽优化及网络链接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是须要某个对象的一部分,而服务器却将整个对象送过来了,而且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它容许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和链接。

 

  • 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

 

  • Host头处理,在HTTP1.0中认为每台服务器都绑定一个惟一的IP地址,所以,请求消息中的URL并无传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上能够存在多个虚拟主机(Multi-homed Web Servers),而且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中若是没有Host头域会报告一个错误(400 Bad Request)。

 

  • 长链接,HTTP 1.1支持长链接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP链接上能够传送多个HTTP请求和响应,减小了创建和关闭链接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,必定程度上弥补了HTTP1.0每次请求都要建立链接的缺点。

 

如何创建链接(三次握手)

    HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的创建链接,可是这些链接没法复用会致使每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。

 

  • 第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP链接成功)状态,完成三次握手。

 

完成三次握手,客户端与服务器开始传送数据。

 

640?wx_fmt=png

 

如何关闭链接(四次挥手):

 

    因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的链接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP链接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。

 

     TCP的链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。

 

  1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 

  2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN同样,一个FIN将占用一个序号。 

  3. 服务器B关闭与客户端A的链接,发送一个FIN给客户端A。 

  4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。 

 

640?wx_fmt=png

 

浏览器阻塞(HOL blocking):

    浏览器对于同一个域名,通常PC端浏览器会针对单个域名的server同时创建6~8个链接,手机端的链接数则通常控制在4~6个(这个根据浏览器内核不一样可能会有所差别),超过浏览器最大链接数限制,后续请求就会被阻塞。

 

在讲HTTP/2以前咱们先来讲说SPDY

    SPDY协议是Google提出的基于传输控制协议(TCP)的应用层协议,经过压缩、多路复用和优先级来缩短加载时间。该协议是一种更加快速的内容传输协议,于2009 年年中发布。

 

    GoogleChrome、MozillaFirefox以及Opera已默认开启SPDY。Google曾经称它的测试显示,页面载入提升了一倍。该协议是一种更加快速的内容传输协议。

 

SPDY协议设定的目标

    1. 页面加载时间(PLT,Page • Load Time)下降 50%;

    2. 无需网站做者修改任何内容;

    3. 最小化配置复杂度,无需变动网络基础设施;

 

注:为了达到下降50% 页面加载时间的目标,SPDY 引入了一个新的二进制分帧数据层,以实现多向请求和响应、优先次序、最小化及消除没必要要的网络延迟,目的是更有效地利用底层TCP 链接;

 

 

HTTP/2:SPDY的升级版

  • HTTP-WG(HTTP Working Group)在2012 年初把HTTP 2.0提到了议事日程,吸收SPDY 的经验教训,并在此基础上制定官方标准。

 

  • HTTP/2 的主要目标是改进传输性能,更有效地利用网络资源,实现低延迟和高吞吐量。从另外一方面看,HTTP 的高层协议语义并不会由于此次版本升级而受影响。全部HTTP 首部、值,以及它们的使用场景都不会变。

 

  • HTTP/2 致力于突破上一代标准众所周知的性能限制,但它也是对以前1.x 标准的扩展,而非替代。之因此要递增一个大版本到2.0,主要是由于它改变了客户端与服务器之间交换数据的方式

 

HTTP/2 是如何提升效率呢?

 

二进制分帧:HTTP 2.0 的全部帧都采用二进制编码

  • 帧:客户端与服务器经过交换帧来通讯,帧是基于这个新协议通讯的最小单位。

  • 消息:是指逻辑上的 HTTP 消息,好比请求、响应等,由一或多个帧组成。

  • 流:流是链接中的一个虚拟信道,能够承载双向的消息;每一个流都有一个惟一的整数标识符(一、2…N);

 

640?wx_fmt=png

 

多路复用 (Multiplexing)

    多路复用容许同时经过单一的 HTTP/2 链接发起多重的请求-响应消息。有了新的分帧机制后,HTTP/2 再也不依赖多个TCP 链接去实现多流并行了。每一个数据流都拆分红不少互不依赖的帧,而这些帧能够交错(乱序发送),还能够分优先级。最后再在另外一端把它们从新组合起来。HTTP 2.0 链接都是持久化的,并且客户端与服务器之间也只须要一个链接(每一个域名一个链接)便可。 

 

请求优先级

  • 把HTTP 消息分解为不少独立的帧以后,就能够经过优化这些帧的交错和传输顺序,每一个流均可以带有一个31 比特的优先值:0 表示最高优先级;2的31次方-1 表示最低优先级。

  • 服务器能够根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好以后,优先将最高优先级的帧发送给客户端。

  • HTTP 2.0 一举解决了全部这些低效的问题:浏览器能够在发现资源时当即分派请求,指定每一个流的优先级,让服务器决定最优的响应次序。这样请求就没必要排队了,既节省了时间,也最大限度地利用了每一个链接。

 

header压缩

    HTTP1.x的header带有大量信息,并且每次都要重复发送,HTTP/2使用encoder来减小须要传输的header大小,通信双方各自cache一份header fields表,既避免了重复header的传输,又减少了须要传输的大小。

 

服务端推送

  • 服务器能够对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确地请求。

  • HTTP 2.0 链接后,客户端与服务器交换SETTINGS 帧,借此能够限定双向并发的流的最大数量。

  • 全部推送的资源都遵照同源策略。换句话说,服务器不能随便将第三方资源推送给客户端,而必须是通过双方确认才行。

  • 服务器必须遵循请求- 响应的循环,只能借着对请求的响应推送资源

 

服务器推送究竟是什么?

    服务端推送能把客户端所须要的资源伴随着index.html一块儿发送到客户端,省去了客户端重复请求的步骤。正由于没有发起请求,创建链接等操做,因此静态资源经过服务端推送的方式能够极大地提高速度。

 

普通的客户端请求过程:

640?wx_fmt=png

 

服务端推送的过程:

640?wx_fmt=png

 

HTTP/2的多路复用和HTTP1.1中的长链接复用有什么区别?

  • HTTP/1.0 一次请求-响应,创建一个链接,用完关闭;每个请求都要创建一个链接;

 

  • HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能得到执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;

 

  • HTTP/2多个请求可同时在一个链接上并行执行。某个请求任务耗时严重,不会影响到其它链接的正常执行;

 

640?wx_fmt=png  

 

如何应用到本身的项目里

    现有的任何网站和应用,无需作任何修改均可以在HTTP 2.0 上跑起来。不用为了利用HTTP 2.0 的好处而修改标记。HTTP 服务器必须运行HTTP 2.0 协议,但大部分用户都不会所以而受到影响。

 

    若是你使用NGINX,只要在配置文件中启动相应的协议就能够了,能够参考NGINX白皮书,NGINX配置HTTP2.0官方指南。

 

    使用了HTTP2.0那么,本来的HTTP1.x怎么办,这个问题其实不用担忧,HTTP2.0彻底兼容HTTP1.x的语义,对于不支持HTTP2.0的浏览器,NGINX会自动向下兼容的。

相关文章
相关标签/搜索