早在HTTP创建之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来讲,咱们所写的HTML页面将要放在咱们的web服务器上,用户端经过浏览器访问url地址来获取网页的显示内容,可是到了WEB2.0以来,咱们的页面变得复杂,不只仅单纯的是一些简单的文字和图片,同时咱们的HTML页面有了CSS,Javascript,来丰富咱们的页面展现,当ajax的出现,咱们又多了一种向服务器端获取数据的方法,这些其实都是基于HTTP协议的。一样到了移动互联网时代,咱们页面能够跑在手机端浏览器里面,可是和PC相比,手机端的网络状况更加复杂,这使得咱们开始了不起不对HTTP进行深刻理解并不断优化过程当中。css
HTTP1.0 | HTTP1.1 | HTTP2.0 | |
---|---|---|---|
Host头 | ✗ | ✔ | ✔ |
Range头 | ✗ | ✔ | ✔ |
长链接 | ✗ | ✔ | ✔ |
request method | GET HEAD POST | 以上+ OPTIONS PUT DELETE TRACE CONNECT | 以上所有 |
cache | Expire Last-Modefied Pragma | 以上+ETag Cache-Control | 以上所有 |
header压缩 | ✗ | ✗ | ✔ |
多路复用 | ✗ | ✗ | ✔ |
服务器推送 | ✗ | ✗ | ✔ |
咱们这里主要选取了几个点来进行分析前端
这里的Range 和 Content-Range 是针对于HTTP1.0的宽带浪费现象而提出来的一个解决方案。nginx
在这里,咱们接触的最多的即是断点续传了, 咱们在请求下载某一个较大文件的时候,秉着耐心终于等到了99%了,可是这时候却忽然断网了,若是再让你等待几十分钟去等待他从新下载完成,咱们估计都要爆发了,而若是客户端,知道本地已经下了99%,只去请求服务端剩余的部分,这样不只节约了用户的时间,还解决了服务器传输多余的重复数据而致使的宽带浪费web
一个web页面上面可能包含几十个图片文件或js、css文件,在HTTP1.0的时代,规定了浏览器与服务器只能保持短暂的链接,浏览器的每一个请求都要与服务器创建一个新的TCP链接,TCP的链接须要三次握手,https还须要校验证书,那么问题就暴漏出来了,这几十次图片、js、css文件实际上是在同一个web页面里面的,若是咱们去除多余的几十次三次握手,那么访问速度就会提高上来,HTTP1.1使用了长链接来解决这个问题,咱们能够配置后台服务器的长链接的时间,超时无内容传输才会断开链接,从而,在必定时间内的浏览器的请求可使用同一个TCP链接或者几个TCP链接,减小了握手带来的时间损耗ajax
既然上面解析了长链接,这里就把多路复用提上来吧。HTTP2.0使用了多路复用的技术,作到同一个链接并发处理多个请求,并且并发请求的数量比HTTP1.1大了好几个数量级。算法
以chrome为例,每一个页面,浏览器最多容许创建6个TCP链接,发起请求->服务端处理->响应请求 这样算是完成了一个浏览器请求。可是若是一个页面同时发起几百个请求,其中前几个请求又比较耗时,则会把这6个TCP链接所有占用,同时阻塞了后面的请求,这样总体请求都会慢下来了。chrome
HTTP2采用多路复用是指,在同一个域名下,开启一个TCP的connection,每一个请求以stream的方式传输,每一个stream有惟一标识,connection一旦创建,后续的请求均可以复用这个connection而且能够同时发送,server端能够根据stream的惟一标识来相应对应的请求。这样上面请求阻塞的问题就能够获得解决。浏览器
意思是说,当咱们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端须要的资源一块儿推送到客户端,省得客户端再次建立链接发送请求到服务器端获取。这种方式很是合适加载静态资源。服务器
咱们在传输文本等静态资源的时候,通常会开启压缩,gzip等,这样会减小宽带的占用,对于一些较大的文本文件,压缩后会减小的特别明显,相应也会感受提高了不少。而header头信息的传输却一直使用字符串来传输,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。网络
https://http2.akamai.com/demo 是Akamai公司创建的一个官方演示,咱们能够很明显的看出HTTP2.0对HTTP1.1上的性能提高
server { listen 83 http2; }
在你的nginx配置文件的 listen
后面加上 http2
就能够启用HTTP2.0了,请放心使用,HTTP2.0已经兼容了HTTP1.1,若是你的浏览器不支持HTTP2.0的话,服务器使用HTTP1.1的协议进行传输