# 次世代 HTTP -- HTTPS/HTTP 2.0

作为一个前端,在 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 通讯。

《# 次世代 HTTP -- HTTPS/HTTP 2.0》

HTTPS = HTTP + 加密 + 认证 + 完整性保护

HTTPS 加密的原理?

前面说到 HTTPS 是 over SSL 的,那么也就是说经过了 SSL 这一加密处理方式进行了通信过程的加密。

HTTPS 的加密包括了对称与非对称加密。由于对称加密,秘钥容易被泄露,而非对称加密解密的过程耗时又长,所以索性把这两者结合,利用非对称加密来加密对称加密的秘钥,即利用了非对称加密安全性高的特点,又利用了对称加密速度快,效率高的好处。也就是所谓的混合加密

  • 非对称加密

    • 首先,服务端保有公钥和私钥,提供公钥向数字认证机构申请证书,将证书发送给客户端
    • 客户端利用浏览器内置的 CA 公钥去解密证书
    • 如果证书没问题,客户端生成一个对称加密的随机秘钥,再利用刚刚解密的服务器端的公钥对随机秘钥进行加密,发送给服务器端
    • 服务端利用自己的私钥解密,得到随机秘钥
  • 对称加密

    • 之后客户端和服务端会利用这个非对称加密加密过的随机秘钥,对之后的请求进行对称加密。

如此一来,HTTPS 便解决了安全问题:

  • 所有信息都是加密传播,黑客无法窃听。
  • 具有校验机制,一旦被篡改,通信双方会立刻发现。
  • 配备身份证书,防止身份被冒充。

PS: 为什么 12306 改版以前,证书那块会显示一个红叉?

  1. 根证书不被操作系统信任,需要自行安装证书。
  2. 其证书使用了不安全的 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 可以随机的混杂在一起,并发响应。

《# 次世代 HTTP -- HTTPS/HTTP 2.0》

  • header 压缩
  • 服务端推送

HTTP 2.0 与 SPDY 不同的地方

  • 新的二进制格式
  • 支持明文传输
  • hedaer 压缩算法与 SPDY 不同

讲了这么多,希望能增强你对 HTTPS 和 HTTP 2.0 的了解。如有错误,恳请斧正!

    原文作者:HTTP
    原文地址: https://segmentfault.com/a/1190000017309635
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞