做为一个常常和web打交道的程序员,了解这些协议是必须的,本文就向你们介绍一下这些协议的区别和基本概念,文中可能不局限于前端知识,还包括一些运维,协议方面的知识,但愿能给读者带来一些收获,若有不对之处还请指出。css
全称:超文本传输协议(HyperText Transfer Protocol) 伴随着计算机网络和浏览器的诞生,HTTP1.0也随之而来,处于计算机网络中的应用层,HTTP是创建在TCP协议之上,因此HTTP协议的瓶颈及其优化技巧都是基于TCP协议自己的特性,例如tcp创建链接的3次握手和断开链接的4次挥手以及每次创建链接带来的RTT延迟时间。html
早在HTTP创建之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来讲,咱们所写的HTML页面将要放在咱们的web服务器上,用户端经过浏览器访问url地址来获取网页的显示内容,可是到了WEB2.0以来,咱们的页面变得复杂,不只仅单纯的是一些简单的文字和图片,同时咱们的HTML页面有了CSS,Javascript,来丰富咱们的页面展现,当ajax的出现,咱们又多了一种向服务器端获取数据的方法,这些其实都是基于HTTP协议的,一样到了移动互联网时代,咱们页面能够跑在手机端浏览器里面,可是和PC相比,手机端的网络状况更加复杂,这使得咱们开始了不起不对HTTP进行深刻理解并不断优化过程当中。前端
影响一个HTTP网络请求的因素主要有两个:带宽和延迟。ios
一、浏览器阻塞(HOL blocking):浏览器会由于一些缘由阻塞请求。浏览器对于同一个域名,同时只能有 4 个链接(这个根据浏览器内核不一样可能会有所差别),超过浏览器最大链接数限制,后续请求就会被阻塞。程序员
二、DNS 查询(DNS Lookup):浏览器须要知道目标服务器的 IP 才能创建链接。将域名解析为 IP 的这个系统就是 DNS。这个一般能够利用DNS缓存结果来达到减小这个时间的目的。web
三、创建链接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的创建链接,可是这些链接没法复用会致使每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。ajax
HTTP1.0最先在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始普遍应用于如今的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为普遍的HTTP协议。算法
主要区别主要体如今:chrome
一、缓存处理,在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每次请求都要建立链接的缺点。如下是常见的HTTP1.0:
区别用一张图来体现:
一、上面提到过的,HTTP1.x在传输数据时,每次都须要从新创建链接,无疑增长了大量的延迟时间,特别是在移动端更为突出。
二、HTTP1.x在传输数据时,全部传输的内容都是明文,客户端和服务器端都没法验证对方的身份,这在必定程度上没法保证数据的安全性。
三、HTTP1.x在使用时,header里携带的内容过大,在必定程度上增长了传输的成本,而且每次请求header基本不怎么变化,尤为在移动端增长用户流量。
四、虽然HTTP1.x支持了keep-alive,来弥补屡次建立链接产生的延迟,可是keep-alive使用多了一样会给服务端带来大量的性能压力,而且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,由于它在文件被请求以后还保持了没必要要的链接很长时间。
为了解决以上问题,网景在1994年建立了HTTPS,并应用在网景导航者浏览器中。 最初,HTTPS是与SSL一块儿使用的;在SSL逐渐演变到TLS时(其实两个是一个东西,只是名字不一样而已),最新的HTTPS也由在2000年五月公布的RFC 2818正式肯定下来。简单来讲,HTTPS就是安全版的HTTP,而且因为当今时代对安全性要求更高,chrome和firefox都大力支持网站使用HTTPS,苹果也在ios 10系统中强制app使用HTTPS来传输数据,因而可知HTTPS势在必行。
一、HTTPS协议须要到CA申请证书,通常免费证书不多,须要交费。
二、HTTP协议运行在TCP之上,全部传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,全部传输的内容都通过加密的。
三、HTTP和HTTPS使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
四、HTTPS能够有效的防止运营商劫持,解决了防劫持的一个大问题。
若是一个网站要全站由HTTP替换成HTTPS,可能须要关注如下几点:
一、安装CA证书,通常的证书都是须要收费的,这边推荐一个比较好的购买证书网站:1)Let's Encrypt,免费,快捷,支持多域名(不是通配符),三条命令即时签署+导出证书。缺点是暂时只有三个月有效期,到期需续签。2Comodo PositiveSSL,收费,可是比较稳定。
二、在购买证书以后,在证书提供的网站上配置本身的域名,将证书下载下来以后,配置本身的web服务器,同时进行代码改造。
三、HTTPS 下降用户访问速度。SSL握手,HTTPS 对速度会有必定程度的下降,可是只要通过合理优化和部署,HTTPS 对速度的影响彻底能够接受。在不少场景下,HTTPS 速度彻底不逊于 HTTP,若是使用 SPDY,HTTPS 的速度甚至还要比 HTTP 快。
四、相对于HTTPS下降访问速度,其实更须要关心的是服务器端的CPU压力,HTTPS中大量的密钥算法计算,会消耗大量的CPU资源,只有足够的优化,HTTPS 的机器成本才不会明显增长。
推荐一则淘宝网改造HTTPS(http://velocity.oreilly.com.cn/2015/ppts/lizhenyu.pdf)的文章。
2012年google如一声惊雷提出了SPDY的方案,你们才开始从正面看待和解决老版本HTTP协议自己的问题,SPDY能够说是综合了HTTPS和HTTP二者有点于一体的传输协议,主要解决:
一、下降延迟,针对HTTP高延迟的问题,SPDY优雅的采起了多路复用(multiplexing)。多路复用经过多个请求stream共享一个tcp链接的方式,解决了HOL blocking的问题,下降了延迟同时提升了带宽的利用率。
二、请求优先级(request prioritization)。多路复用带来一个新的问题是,在链接共享的基础之上有可能会致使关键请求被阻塞。SPDY容许给每一个request设置优先级,这样重要的请求就会优先获得响应。好比浏览器加载首页,首页的html内容应该优先展现,以后才是各类静态资源文件,脚本文件等加载,这样能够保证用户能第一时间看到网页内容。
三、header压缩。前面提到HTTP1.x的header不少时候都是重复多余的。选择合适的压缩算法能够减少包的大小和数量。
四、基于HTTPS的加密协议传输,大大提升了传输数据的可靠性。
五、服务端推送(server push),采用了SPDY的网页,例如个人网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就能够直接从缓存中获取到,不用再发请求了。SPDY构成图:
SPDY位于HTTP之下,TCP和SSL之上,这样能够轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时可使用已有的SSL功能。
兼容性:
十、HTTP2.0的前世此生
顾名思义有了HTTP1.x,那么HTTP2.0也就瓜熟蒂落的出现了。
HTTP2.0能够说是SPDY的升级版(其实本来也是基于SPDY设计的),可是,HTTP2.0 跟 SPDY 仍有不一样的地方,主要是如下两点:
更多关于HTTP2的问题能够参考:HTTP2奇妙平常(http://www.alloyteam.com/2015/03/http2-0-di-qi-miao-ri-chang/),以及HTTP2.0的官方网站。
关于HTTP2和HTTP1.x的区别大体能够看下图:
十二、HTTP2.0的升级改造
对比HTTPS的升级改造,HTTP2.0或许会稍微简单一些,你可能须要关注如下问题:
一、前文说了HTTP2.0其实能够支持非HTTPS的,可是如今主流的浏览器像chrome,firefox表示仍是只支持基于 TLS 部署的HTTP2.0协议,因此要想升级成HTTP2.0仍是先升级HTTPS为好。
二、当你的网站已经升级HTTPS以后,那么升级HTTP2.0就简单不少,若是你使用NGINX,只要在配置文件中启动相应的协议就能够了,能够参考NGINX白皮书,NGINX配置HTTP2.0官方指南。
三、使用了HTTP2.0那么,本来的HTTP1.x怎么办,这个问题其实不用担忧,HTTP2.0彻底兼容HTTP1.x的语义,对于不支持HTTP2.0的浏览器,NGINX会自动向下兼容的。
以上就是关于HTTP,HTTP2.0,SPDY,HTTPS的一些基本理论,有些内容没有深刻讲解,你们能够跟进参考链接具体查看。
关于HTTP1.x的一些优化方式,例如文件合并压缩,资源cdn,js,css优化等等一样使用与HTTP2.0和HTTPS,因此web前端的优化,仍是要继续进行。
其实WEB发展如此迅速的今天,有些技术是真的要与时俱进的,就像苹果宣布ios 10必须使用HTTPS开始,关于web协议革新就已经开始了,为了更好的性能,更优越的方式,如今就开始升级改造吧