由来
HTTP/1版本协议在数据传输过程中是透明的,通过各种各样的代理服务,可以轻松的获取到请求或响应的报文,并可以对报文字段的修改,或对返回结果进行篡改。安全性不够,并且性能一般,所以HTTPS出现了。它基于SSL/TLS协议,主要解决了HTTP/1安全性不足的问题,性能方面仅优化了握手和加密的环节,对整体的数据传输并没有更好的优化方案。
在这种背景下,Google率先扛起了大旗,发明了SPDY协议,刚开始主要是应用于自家的Chrome浏览器,随后,互联网标准化组织在SPDY协议的基础上,推出了HTTP/2。
版本
HTTP之前的版本号有0.9/1.0/1.1,那为啥新的版本不叫HTTP/1.2或HTTP/2.0,而直接叫HTTP/2。首先刚也说了,新的HTTP协议是基于Google的SPDY协议,所以不会延续之前的1.1版本号;其次称为HTTP/2,而不是HTTP/2.0,是工作组认为小版本好会给人造成混乱和误解,以后都只会有大版本,不会进行边边角角的小版本发布。也就是说HTTP后面都是HTTP/3、HTTP/4和HTTP/5 ...
兼容HTTP/1
HTTP/2作为升级版,对旧版本肯定是需要做兼容,要不然就会破坏掉现有的互联网资产,这个损失是无法承受的。
HTTP/2没有新造协议名,还是之前的http明文协议和https加密协议,客户端或服务器在协议上可以自选。
HTTP/2把HTTP/1分解成了语义和语法两个部分,对语义的请求方法、URI、状态码和报文字段等部分完全照搬,不做任何改动,这无疑减轻了学习的成本。
但对语法部分进行了大刀阔斧的改革。
头部压缩
在前面我们知道Content-Encoding这个字段,它主要是指定响应实体body的压缩方式,但我们对头部一直没提过什么优化手段。
HTTP/2就提出了对头部的优化手段,也是压缩,但压缩方式并非传统的算法,而是专门开发了HPACK算法来实现。
二进制格式
二进制其实本质上就是提前编译了报文,原来的HTTP协议的报文我们肉眼可见都是可识别的,现在HTTP/2全部编译成二进制,虽然对我们不友好,但对于机器来说更容易识别,相当于把原来TCP传输协议要做的事情提前到了HTTP/2应用层协议来完成了。
但是这样做会提高效率吗?因为一件事在整个流程中都需要完成,只是换了个对象去执行而已。
是这样的,但主要就看谁更容易解析,或者说谁更熟悉被编译的内容,因为报文中可能会出现大小写、空格、换行等场景。应该来说在应用层会更快更容易编译。
HTTPS
安全
我们在导言中说HTTP是不安全的,而HTTPS是安全的,那安全性具体体现在哪些方面呢?
-
机密性:对传输的数据进行保密,不能明文传输
-
完整性:对传输的数据不能被篡改或删除,保证其完整
-
身份认证:指的是确认对方的身份,防止黑客冒用对方的身份套取个人信息
-
不可否认:对发生过的行为都有记录
SSL/TLS
HTTPS的官方文档很少,主要原因是它是基于HTTP协议的,请求或响应报文字段都HTTP基本都一致,不同的主要有两点:
-
协议名不同
-
端口不同:HTTPS是443,HTTP是80
既然说HTTPS是安全的,而它和HTTP又没什么太大区别,那它是怎么做到的呢?
主要是因为HTTPS是基于TLS/SSL协议,而HTTP是直接基于TCP/IP协议的。说明安全传输的重任主要是由TLS/SSL来承担的。
SSL(Secure Sockets Layer):安全套接层。由网景公司于1994年发明,有v2和v3两个版本,由于v1版本的不安全性,从未公开过。
SSL由于其安全性良好,1999年被互联网工程组IETF改名为TLS(Transport Layer Security:传输层安全),正式标准化,版本从1.0开始,TLS1.0相当于SSL3.1版本。
TLS到现在为止,共开发出了另外地三个版本,分别是2006年的1.1,2008年的1.2和2018年的1.3版本,每个版本都是紧跟密码学和当时互联网的现状而改进,算是密码学的权威之作。
我们现在普遍使用的是TLS1.2版本,对于之前的版本包括SSL版本,都陆续被各浏览器抛弃,认为是不够安全的。
OpenSSL
看名称也知道,OpenSSL和SSL/TLS是有关系的,它是从另一个开源库SSLeay库发展出来的,是一个非常著名的密码学工程包,被众多加密算法和协议所应用。
由于当时TSL还未被正式确立,而SSL早已广为人知,所以就用了OpenSSL命名。我们现在最常用的是版本1.1.1,对于之前的1.0.2和1.1.0版本,截止到2019年就不再维护了。