关于 HTTP,HTTPS,HTTP2的认识

@sakila1012 2018-03-21 02:06:10发表于 sakila1012/blog

写在前面

在之前的工作中和面试的过程中,都会或多或少地涉及到这三方面的知识,但在遇到这些问题的时候,脑子确实一片空白,没有对这三个方面的内容有一个清晰的认识,仅仅停留在知道这三个字母而已。

需要对这三个方面的内容背景,功能,优势,不足深入的探究。

HTTP的基本优化

影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟

  • 带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础设施建设已经使得带宽得到极大的提升,我们不用担心由带宽而影响网速,那么只剩下延迟了。

  • 延迟:

  1. 浏览器阻塞:浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 4 个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接限制,后续请求就会被阻塞。

  2. DNS 查询:浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统时 DNS。这个通常可以利用 DNS 缓存结果来达到减少这个时间的目的。

  3. 建立连接:HTTP是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。

HTTP1.0 和 HTTP1.1 现存的一些问题

  1. HTTP1.x 在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出。
  2. HTTP1.x 在传输数据时,所有传输的内容都是明文的,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。
  3. HTTP1.x 在使用时,header 里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求header 基本不怎么变化,尤其在移动端增加用户流量
  4. 虽然 HTTP1.x 支持 keep-alive,来弥补多次创建连接产生的延迟,但是 keep-alive 使用多了同样会给服务器端带来大量的性能压力,并且对与单个文件不断请求的服务(例如图片存放网站),keep-alive 可能会极大地影响性能,因为它在文件被请求之后还保持了不必要的链接很长时间。

HTTPS

为了解决以上问题,网景公司在 1994 年创建了 HTTPS,并应用在网景导航者浏览器中,最初,HTTPS 是与 SSL 一起使用的,在 SSL 逐渐演变成 TLS 时(其实两个是一个东西,只是名字不同而已),最新的 HTTPS 也由 2000 年 5 月公布的 RFC 2018 正式确定下来。简单地说,HTTPS 就是安全版的 HTTP,并且由于当代对安全性要求更高,Chrome 和 Firefox 都大力支持网站使用 HTTPS,苹果也在 iOS 10 系统中强制 app 使用 HTTPS 来传输数据。

HTTPS 与 HTTP 的一些区别:

  1. HTTPS 协议需要到 CA 申请证书,一般免费证书很少,需要交费
  2. HTTP 协议运行在 TCP 之上,所有传输呢内容都是明文,HTTPS 运行在 SSL/TLS 之上,SSL/TLS 运行在 TCP 之上,所有传输的内容都是经过加密的
  3. HTTP 和 HTTPS 使用的是安全不同的连接方式,用的端口号也不一样,前者是 80,后者是 443。
  4. HTTPS 可以有效的防止运营商劫持,解决了防劫持的一个大问题。

image

改造成 HTTPS

如果一个网站要由 HTTP 换成 HTTPS,可能需要关注一下几点:

  1. 安装 CA 证书,一般证书都是需要收费的
  2. 在购买证书之后,在证书提供的网站上配置自己的域名,将证书下载下来之后,配置自己的 web 服务器,同时进行代码改造。
  3. HTTPS 降低用户访问速度。SSL握手,HTTPS 对速度会有一定程度的降低,但是只要经过合理优化和部署,HTTPS 对速度的影响完全是可以接受的。在很多场景下,HTTPS速度完全不逊于 HTTP,如果使用 SPDY,HTTPS 的速度甚至还要比 HTTP块。
  4. 相对于 HTTPS 降低访问速度,其实更需要关心的是服务器端的 CPU 压力,HTTPS 中大量的密钥算大计算,会消耗大量的 CPU 资源,只有足够的优化,HTTPS 的机器成本才不会明显增加。

使用 SPDY 加快你的网站速度

2012 年 Google 提出了 SPDY 的方案,它综合了 HTTPS 和 HTTP 两者优点于一体的传输协议,主要解决:

  1. 降低延迟,针对 HTTP 高延迟的问题,SPDY 优雅的采取了多路复用。多路复用通过多个请求 Stream 共享一个 TCP 连接,解决了 HOL blocking 问题,降低了延迟同时提高了带宽的利用率。
  2. 请求优先级。多路复用带来一个新的问题是,在连接共享的基础上有可能会导致关键请求被阻塞。SPDY 允许给每个 request 设置优先级,这样重要的请求就会优先得到相应。比如浏览器加载页,首页的 HTML 内容应该会优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页的内容。
  3. header压缩。前面提到 HTTP 1.x 的 header 很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
  4. 基于 HTTPS 的加密协议传输,大大提高了传输数据的可靠性。
  5. 服务器端推送,采用了 SPDY 的网页,例如我的网页有一个 style.css 请求,在客户端收到 style.css 数据的同时,服务器端会将 style.js 的文件推送到客户端,当客户端再次尝试获取 style.js 时,就可以从缓存中获取到,不用在发送请求了。SPDY 的构成图:

123

SPDY 位于 HTTP 之下,TCP 和 SSL之上,这样可以轻松兼容老版本的 HTTP 协议,同时可以使用已有的 SSL 功能。

HTTP 2.0 的新特性

  1. 新的二进制格式,HTTP 1.X的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定采用二进制格式,实现方便且健壮。
    2.. 多路复用,即链接共享,即每一个 request 都是用作连接共享机制。一个 request 对应一个 id,这样一个连接可以有多个 request,每个连接的 request 可以随机的混杂在一起,接收方可以根据 request 的 id 将request 再归属到各自不同的服务器端请求中。
  2. header 压缩,对前面提到的 HTTP 1.x 的 header 带有大量信息,而且每次都要重复发送,HTTP2.0 使用 encoder 来减少需要传输的 header 大小,通讯双方各自 cache 一份 header fileds表,既避免了重复 header 的传输,又减小了需要的传输的大小。
  3. 服务器端推送,同 SPDY 一样,HTTP 2.0 也具有 server push 功能。目前,有大多数网站已经启用 HTTP 2.0 ,例如:YouTuBe,淘宝网等网站,利用 Chrome 控制台可以查看是否启用 HTTP 2.0:

参考资料:

HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事