作为一个前端,在 2018 年你肯定听过或者已经使用了 HTTPS 和 HTTP 2.0,如果你还没了解过的话,那我让我带你一探究竟吧~
HTTP
超文本传输协议 -- HTTP,是被广泛使用的用于 Web 浏览器和服务器之间通信的一个协议,它是无状态协议,不会在请求与请求之间保存状态和数据,通常基于 TCP/IP 层。
HTTP 从一开始的 0.9 版本,发展到 1.0/1.1 版本,其中经历了缓存处理的改进、method 的增加和长连接的支持等等。HTTP 1.x 版本已经被使用超过了 20 年,直至今天还仍然被广泛采用。但是,随着互联网的飞速发展,这个版本存在着一些问题:
- 基于 TCP/IP 的明文传输,可能会被窃听,缺少身份验证与加密,可能会被伪装,无法证明报文的完整,可能会被篡改,无法保证数据的安全性。
- 队头阻塞(head of line blocking),浏览器发出的请求都需要排队,依次进行处理和响应。
- 连接无法复用,每次请求都需要重新建立连接,都必须经过三次握手和慢启动,分别影响高延迟和大文件请求的场景。
安全问题首当其冲,在 1994 年的时候,为传输安全保驾护航的 HTTPS 诞生了。
HTTPS
HTTPS (HTTP over SSL/TLS),严格地讲,并不是一个单独的协议,而是对工作在一加密连接(TLS 或 SSL)上的常规 HTTP 协议的称呼。HTTP 先与 SSL 通讯,再有 SSL 和 TCP 通讯。
HTTPS = HTTP + 加密 + 认证 + 完整性保护
HTTPS 加密的原理?
前面说到 HTTPS 是 over SSL 的,那么也就是说经过了 SSL 这一加密处理方式进行了通信过程的加密。
HTTPS 的加密包括了对称与非对称加密。由于对称加密,秘钥容易被泄露,而非对称加密解密的过程耗时又长,所以索性把这两者结合,利用非对称加密来加密对称加密的秘钥,即利用了非对称加密安全性高的特点,又利用了对称加密速度快,效率高的好处。也就是所谓的混合加密。
-
非对称加密
- 首先,服务端保有公钥和私钥,提供公钥向数字认证机构申请证书,将证书发送给客户端
- 客户端利用浏览器内置的 CA 公钥去解密证书
- 如果证书没问题,客户端生成一个对称加密的随机秘钥,再利用刚刚解密的服务器端的公钥对随机秘钥进行加密,发送给服务器端
- 服务端利用自己的私钥解密,得到随机秘钥
-
对称加密
- 之后客户端和服务端会利用这个非对称加密加密过的随机秘钥,对之后的请求进行对称加密。
如此一来,HTTPS 便解决了安全问题:
- 所有信息都是加密传播,黑客无法窃听。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
PS: 为什么 12306 改版以前,证书那块会显示一个红叉?
- 根证书不被操作系统信任,需要自行安装证书。
- 其证书使用了不安全的 sha1 算法,未能通过浏览器验证。
解决完安全问题,我们来看看速度与延迟问题是如何被解决的。
搅局者 SPDY
2012 年,Google 提出 SPDY,为 HTTP 2.0 的诞生奠定了一个十分扎实的基础,(HTTP 2.0 的主要设计思想源自于 SPDY)它提出:
- 多路复用(multiplexing)
HTTP 1.x 在一条 TCP 连接上,多个请求只能串行执行。而 SPDY 使多个请求 stream 共享一个 tcp 连接的方式,做到了同时响应多个请求,解决了队头阻塞的问题。
- 请求优先级(request prioritization)
控制多路复用的请求优先级(例如设置 CSS 的优先级比图片高)
- header 压缩
顾名思义,对 header 进行压缩。HTTP1.x 的 header 很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。SPDY 对 header 的压缩率可以达到 80% 以上,低带宽环境下效果很大,对解决慢启动问题也有帮助。
- 服务端推送(server push)
服务端能够更快的把资源推送给客户端。
- 强制使用 HTTPS
HTTP 2.0
在 SPDY 的基础之上,HTTP 2.0 诞生了,为了给 HTTP 2.0 铺路,Google 甚至在后期停止对 SPDY 的支持。HTTP 2.0 可以说是 SPDY 的升级版,看看以下特性你就知道了:
- 多路复用
HTTP 2.0 让每个 request 对应一个 stream 并分配一个 id,通过一个连接多 stream 的方式,每个 stream 的 frame 可以随机的混杂在一起,并发响应。
- header 压缩
- 服务端推送
HTTP 2.0 与 SPDY 不同的地方
- 新的二进制格式
- 支持明文传输
- hedaer 压缩算法与 SPDY 不同
讲了这么多,希望能增强你对 HTTPS 和 HTTP 2.0 的了解。如有错误,恳请斧正!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。