知识分享 文章转自:https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/78906348html
如今是资源共享的时代,一样也是知识分享的时代,若是你以为本文能学到知识,请把知识与别人分享!编程
开篇HTTP发展的心路历程浏览器
上图:链接没法复用缓存
上图:设置Connection:Keep-Alive,保持链接在一段时间内不断开。服务器
上图:HTTPpipelining:创建多个链接网络
上图:多路复用架构
先对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服务器根据接收到的请求后,向客户端发送响应信息。
HTTP 协议的版本
HTTP 0.9做为HTTP协议的第一个版本。是很是弱的。请求(Request)只有一行,好比: GET www.leautolink.com
2. HTTP1.0最先在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上。
3. HTTP1.1则在1999年才开始普遍应用于如今的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为普遍的HTTP协议。
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链接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
如何关闭链接(四次挥手):
因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的链接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP链接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。
TCP的链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。
客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN同样,一个FIN将占用一个序号。
服务器B关闭与客户端A的链接,发送一个FIN给客户端A。
客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
浏览器阻塞(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);
多路复用 (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一块儿发送到客户端,省去了客户端重复请求的步骤。正由于没有发起请求,创建链接等操做,因此静态资源经过服务端推送的方式能够极大地提高速度。
普通的客户端请求过程:
服务端推送的过程:
HTTP/2的多路复用和HTTP1.1中的长链接复用有什么区别?
HTTP/1.0 一次请求-响应,创建一个链接,用完关闭;每个请求都要创建一个链接;
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能得到执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
HTTP/2多个请求可同时在一个链接上并行执行。某个请求任务耗时严重,不会影响到其它链接的正常执行;
如何应用到本身的项目里
现有的任何网站和应用,无需作任何修改均可以在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会自动向下兼容的。