{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
作为一个经常和web打交道的程序员,了解这些协议是必须的,本文就向大家介绍一下这些协议的区别和基本概念,文中可能不局限于前端知识,还包括一些运维,协议方面的知识,希望能给读者带来一些收获,如有不对之处还请指出。
web始祖http全称:超文本传输协议(hypertexttransferprotocol)伴随着计算机网络和浏览器的诞生,http1.0也随之而来,处于计算机网络中的应用层,http是建立在tcp协议之上,所以http协议的瓶颈及其优化技巧都是基于tcp协议本身的特性,例如tcp建立连接的3次握手和断开连接的4次挥手以及每次建立连接带来的rtt延迟时间。
http与现代化浏览器早在http建立之初,主要就是为了将超文本标记语言(html)文档从web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的html页面将要放在我们的web服务器上,用户端通过浏览器访问url地址来获取网页的显示内容,但是到了web2.0以来,我们的页面变得复杂,不仅仅单纯的是一些简单的文字和图片,同时我们的html页面有了css,javascript,来丰富我们的页面展示,当ajax的出现,我们又多了一种向服务器端获取数据的方法,这些其实都是基于http协议的。同样到了移动互联网时代,我们页面可以跑在手机端浏览器里面,但是和pc相比,手机端的网络情况更加复杂,这使得我们开始了不得不对http进行深入理解并不断优化过程中。
http的基本优化影响一个http网络请求的因素主要有两个:带宽和延迟。
带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。延迟:浏览器阻塞(holblocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。dns查询(dnslookup):浏览器需要知道目标服务器的ip才能建立连接。将域名解析为ip的这个系统就是dns。这个通常可以利用dns缓存结果来达到减少这个时间的目的。建立连接(initialconnection):http是基于tcp协议的,浏览器最快也要在第三次握手时才能捎带http请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
缓存处理,在http1.0中主要使用header里的if-modified-since,expires来做为缓存判断的标准,http1.1则引入了更多的缓存控制策略例如entitytag,if-unmodified-since,if-match,if-none-match等更多可供选择的缓存头来控制缓存策略。带宽优化及网络连接的使用,http1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(partialcontent),这样就方便了开发者自由的选择以便于充分利用带宽和连接。错误通知的管理,在http1.1中新增了24个错误状态响应码,如409(conflict)表示请求的资源与资源的当前状态发生冲突;410(gone)表示服务器上的某个资源被永久性的删除。host头处理,在http1.0中认为每台服务器都绑定一个唯一的ip地址,因此,请求消息中的url并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(multi-homedwebservers),并且它们共享一个ip地址。http1.1的请求消息和响应消息都应支持host头域,且请求消息中如果没有host头域会报告一个错误(400badrequest)。长连接,http1.1支持长连接(persistentconnection)和请求的流水线(pipelining)处理,在一个tcp连接上可以传送多个http请求和响应,减少了建立和关闭连接的消耗和延迟,在http1.1中默认开启connection:keep-alive,一定程度上弥补了http1.0每次请求都要创建连接的缺点。以下是常见的http1.0:
区别用一张图来体现:
http1.0和1.1现存的一些问题上面提到过的,http1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出。http1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。http1.x在使用时,header里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量。虽然http1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。
https应声而出为了解决以上问题,网景在1994年创建了https,并应用在网景导航者浏览器中。最初,https是与ssl一起使用的;在ssl逐渐演变到tls时(其实两个是一个东西,只是名字不同而已),最新的https也由在2000年五月公布的rfc2818正式确定下来。简单来说,https就是安全版的http,并且由于当今时代对安全性要求更高,chrome和firefox都大力支持网站使用https,苹果也在ios10系统中强制app使用https来传输数据,由此可见https势在必行。
https与http的一些区别https协议需要到ca申请证书,一般免费证书很少,需要交费。http协议运行在tcp之上,所有传输的内容都是明文,https运行在ssl/tls之上,ssl/tls运行在tcp之上,所有传输的内容都经过加密的。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。https可以有效的防止运营商劫持,解决了防劫持的一个大问题。
https改造如果一个网站要全站由http替换成https,可能需要关注以下几点:
安装ca证书,一般的证书都是需要收费的,这边推荐一个比较好的购买证书网站:1)let'sencrypt,免费,快捷,支持多域名(不是通配符),三条命令即时签署+导出证书。缺点是暂时只有三个月有效期,到期需续签。2comodopositivessl,收费,但是比较稳定。在购买证书之后,在证书提供的网站上配置自己的域名,将证书下载下来之后,配置自己的web服务器,同时进行代码改造。https降低用户访问速度。ssl握手,https对速度会有一定程度的降低,但是只要经过合理优化和部署,https对速度的影响完全可以接受。在很多场景下,https速度完全不逊于http,如果使用spdy,https的速度甚至还要比http快。相对于https降低访问速度,其实更需要关心的是服务器端的cpu压力,https中大量的密钥算法计算,会消耗大量的cpu资源,只有足够的优化,https的机器成本才不会明显增加。推荐一则淘宝网改造https的文章。
降低延迟,针对http高延迟的问题,spdy优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了holblocking的问题,降低了延迟同时提高了带宽的利用率。请求优先级(requestprioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。spdy允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。header压缩。前面提到http1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。基于https的加密协议传输,大大提高了传输数据的可靠性。服务端推送(serverpush),采用了spdy的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。spdy构成图:
spdy位于http之下,tcp和ssl之上,这样可以轻松兼容老版本的http协议(将http1.x的内容封装成一种新的frame格式),同时可以使用已有的ssl功能。
兼容性:
http2.0支持明文http传输,而spdy强制使用httpshttp2.0消息头的压缩算法采用hpack,而非spdy采用的deflate
header压缩,如上文中所言,对前面提到过http1.x的header带有大量信息,而且每次都要重复发送,http2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份headerfields表,既避免了重复header的传输,又减小了需要传输的大小。服务端推送(serverpush),同spdy一样,http2.0也具有serverpush功能。目前,有大多数网站已经启用http2.0,例如youtube,淘宝网等网站,利用chrome控制台可以查看是否启用h2:
更多关于http2的问题可以参考:http2奇妙日常,以及http2.0的官方网站。
关于http2和http1.x的区别大致可以看下图:
前文说了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发展如此迅速的今天,有些技术是真的要与时俱进的,就像苹果宣布ios10必须使用https开始,关于web协议革新就已经开始了,为了更好的性能,更优越的方式,现在就开始升级改造吧
参考资料: