当我们输入网址的时候,以这两张图片为例,浏览器上方会出现安全或者不安全的提示,这就是分别采用HTTPS和HTTP的不同结果,可以简单的理解http和https的最大差异就是http是不安全的,https是安全的因为采用了ssl协议,接下来我们就来仔细的分析这两个协议。
HTTP协议
称为超文本传输协议,主要是提供发布和接受html页面的方法,是一种无状态,无连接的协议,底层还是基于TCP/IP来实现。
采用明文传输,基于请求和响应,即客户端发起请求,服务端响应。
http协议由http1.0发展到现在的http2.0,http1.0的特色是传输内容不受限制,增加了put,head,delate,patch,options等方法。
http2.0则是在这个基础上新增了一些特性,如
(1)多路复用
每次http的请求方式不再是每次请求单个html文件或css文件,而是并行执行,多个请求共享一个tcp连接,可以同时请求多个资源文件。如图所示
(2)首部压缩
实现首部压缩的是http/2和SPDY,SPDY采用的是DEFLATE算法,后来http/2设计了HPACK算法来进行压缩,可以看出经压缩后首部长度明显减少很多。
(3)服务端推送
服务端推送是在客户端发送请求之前发送数据的机制,在http2.0,服务端可以对客户端的请求发送多个响应,不管是当前页面用到的资源还是可能以后需要的资源都会发送给客户端,另外服务端推送还能够缓存,这让不同页面共享资源成为可能。
(4)二进制分帧
在应用层和传输层之间建立一个二进制分帧层,http/2会将传输的信息分为更小的信息和帧,然后对每部分进行二进制编码。然后首部信息会放入headers frame中,request body中的信息会放入data frame。
这就是http2.0的新特性了,但是http说到底还是无状态的协议,如果我们想让它保持状态,比如我登入一个系统,三天之类不想重新登录呢?这又是怎么解决的呢?
对于http无状态的解决策略,我们可以采用两种方式
(1)cookie和session技术
(2)http的长连接(keep-alive方法),只要一方没有提出中断连接,就让彼此保持连接。
HTTPS
https和http相比,除了http拥有的一切,它还有自己的特性,那就是它实现采用了ssl安全协议,从而多了以下特点:
(1)内容加密:采用混合加密技术,中间者无法直接查看明文。
(2)验证身份:通过证书认证客户端访问的是自己的服务器。
(3)保护数据完整性:防止和中间被别人修改。
ssl实现原理
- 客户端请求网址https://baidu.com,首先连接到服务端的443端口,然后发送一个随机数1和加密算法。
- 服务端响应客户端,返回有个随机数2和协商好的加密算法,并且是客户端发送的加密算法的子集
- 然后服务端给客户端发送的第二个就是数字证书。服务端必须有一套数字证书,可以自己制作,也可以申请,但是需要费用。这套证书包含私钥和公钥,给客户端发送的就是公钥。
- 客户端接受数字证书,解析成功后判断数字证书是否合法,比如有没有过期,颁发机构等。如果证书没有问题就会生成一个随机值(预主密钥)
- 然后利用随机数1,2和预主密钥组装会话密钥,然后通过公钥加密会话密钥
- 传送加密信息,主要是传送加密后的会话密钥,然后服务端解密后得到随机数1,2,预主密钥,然后组装会话密钥,与客户端会话密钥相同。
- 消息的传递就是采用加密后的会话密钥进行加密,然后发送给服务端。
- 服务端也通过会话密钥加密一条信息给客户端,如果客户端能接受说明ssl成功建立。
但是https也有自己的不足:
(1)SL证书需要购买申请,功能越强大的证书费用越高
(2)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗
(3)HTTPS连接缓存不如HTTP高效,流量成本高。
(4)HTTPS协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。比较好的方式是采用分而治之,类似12306网站的主页使用HTTP协议,有关于用户信息等方面使用HTTPS。