Fork me on GitHub

HTTP 1.0→1.1→2.0 & HTTPS

HTTP 1.0 → HTTP 1.1

长连接

HTTP 1.0需要使用keep-alive参数来告知服务器建立长连接,而HTTP 1.1默认支持长连接,减少了TCP连接次数,节约开销。

HTTP 1.0所保持的TCP每次只能处理一个请求,最典型的就是pipline管线化模型,虽然能一次性接收多个请求,但是还是得按顺序一次处理一个请求,这样很容易造成后续请求等待前序请求完成,造成阻塞,也就是我们常说的”线头阻塞”。
并且对于request和response,HTTP 1.0都是以文本的方式进行传输,这就导致数据必须按照顺序进行传输。

节约带宽

HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端只有接收到100,才开始把请求body发到服务器。当服务器返回401的时候,客户端就可以不用发送请求body了,这样节约了带宽。

HOST域

HTTP 1.1支持host域,服务端可以通过host域设置多个虚拟站点来共享一个ip和端口。

HTTP 1.1 → HTTP 2.0

多路复用

HTTP 2.0使用多路复用技术,使用一个TCP连接并发处理多个请求,不但节约了开销而且可处理请求的数量也比HTTP 1.1大了很多。

TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此使用一个连接可以大大提高数据传输效率。

头部压缩

HTTP 1.1不支持header数据压缩,HTTP 2.0使用HPACK算法对header的数据进行压缩,使得数据传输更快。

服务器推送

当我们对支持HTTP 2.0的服务器请求数据额时候,服务器会顺便把一些客户端需要的资源一起推送到服务器,这种方式适用于加载静态资源,节约带宽。

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

在讲 HTTPS 之前,我们先来看看 HTTP 有哪些不足:

  • 使用明文通信,内容可能会被窃听
  • 不验证通信双方身份,有可能遭遇伪装
  • 无法证明报文的完整性,内容可能遭到篡改

为了解决这些不足,HTTPS 应运而生,其相比 HTTP 多了以下特性:

  • TLS/SSL内容加密
  • 数字证书(CA)验明身份: 防范中间人攻击
  • MD5、SHA-1等散列值方法防止信息篡改

虽然TLS/SSL采用公开密钥这种非对称加密方式,但是HTTPS并不是全部使用非对称加密,而是使用混合加密方式,即:公开密钥(非对称加密)+共享密钥(非对称加密)

因为公开密钥与共享密钥加密相比,其处理速度要慢很多。所以HTTPS冲锋利用了两者各自的优势,将多种方法组合起来用于通信。在交换密钥环节使用公开密钥加密方式,之后建立的通信交换报文阶段则使用共享密钥加密方式

混合加密方式

通常我们会认为,使用HTTPS会导致网站加载速度变慢。实际上,只要我们合理优化使用HTTPS过程,使用HTTPS可能会比使用HTTP还快!

使用HTTPS相比于HTTP所增加的延迟点:

  • HTTP 302 跳转到 HTTPS 的耗时

  • CPU 进行 RSA 加解密运算的耗时

  • 请求和验证 CA 所花的时间

对应的优化方式:

  • 使用 HSTS 技术,去掉从80跳转到443的跳转(HSTS使用的是内部307跳转技术,不会产生多余的网络请求) PS:302 和 307 效果相同,只是307强制使用post

  • 使用专门的加解密硬件处理加解密,减轻CPU负担。这样不仅减少了处理时间,所能承受的qps也会增加。

  • 减少证书链,减少 CA 请求时间

  • session复用,减少建立连接的次数

HTTPS自身对于性能的优化

  • SSL压缩:除去 HTTP 的数据压缩,SSL 对于数据也有一次压缩,减少了传输时间

  • 使用HTTP/2:要使用HTTP/2就必须要使用 SSL/TLS,HTTPS 显然是最适合使用的

使用 HTTP/2 的好处包括但不限于:

  • 多路复用

    HTTP 2.0使用多路复用技术,使用一个TCP连接并发处理多个请求,不但节约了开销而且可处理请求的数量也比HTTP 1.1大了很多。

    TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此使用一个连接可以大大提高数据传输效率。

  • 头部压缩
    HTTP 1.1不支持header数据压缩,HTTP 2.0使用HPACK算法对header的数据进行压缩,使得数据传输更快。

  • 服务器推送
    当我们对支持HTTP 2.0的服务器请求数据额时候,服务器会顺便把一些客户端需要的资源一起推送到服务器,这种方式适用于加载静态资源,节约带宽。

返回顶部