详解HTTP,HTTPS,HTTP2的异同

139 阅读5分钟

前言

HTTP协议在前,HTTPS协议在后。那么HTTPS协议是为了解决什么问题才被提出的呢?

一言以蔽之:HTTPS = HTTP + 加密 + 认证 + 完整性保护

http-blog1-3.jpg

HTTP协议

HTTP(HyperText Transfer Protocol),超文本传输协议。用于客户端和服务器之间的通信。而用 HTTP 协议能够明确区分哪端是客户端,哪端是服务器端。

这里我们主要以HTTP/1.1为例。

HTTP/1.1的特点

http-blog1-1.jpg

  • HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了 Cookie再用HTTP协议通信,就可以管理状态了。

  • keep-alive: 持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。在 HTTP/1.1 中,所有的连接默认都是持久连接。

HTTP/1.1的缺点

  • 通信使用明文(不加密), 内容可能会被窃听。为了解决这个问题,一种方法是通信加密,一种方式是内容加密。
  • 不验证通信方的身份有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

URI 和 URL

因为与HTTP协议相关度很高,所以在这里,额外的引入URI和URL的概念。

  • URI(Uniform Resource Identifier):统一资源标识符。
  • URL(Uniform Resource Locator):统一资源定位符。URL正是使用 Web 浏览器等访问 Web 页面时需要输入的网页地址。
  • URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。

一张图表示绝对URI的格式

绝对 URI 的格式.png

SSL 和 TLS 协议

在讲述HTTPS之前,先引入SSL和TLS的概念。

  • SSL(Secure Socket Layer) 安全套接层,SSL 采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。
    • 公开密钥加密 = 公钥加密 + 私钥解密
  • TLS(Transport Layer Security) 安全传输层协议,TSL 是以 SSL 为原型开发的协议,有时会统一称该协议为 SSL。
  • 当前主流的版本是 SSL3.0 和 TLS1.0。
  • SSL 位于TCP协议之上,应用层之下。

ssl 层.png

HTTPS协议

HTTP/1.1有缺点,为了解决这些问题,HTTPS协议应运而生。HTTPS = HTTP + 加密 + 认证 + 完整性保护

http-blog1-2.jpg

HTTP/1.1通信使用明文(不加密), 内容可能会被窃听。

解决之道: HTTPS 采用混合加密机制 = 共享密钥加密 + 公开密钥加密。 在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段 则使用共享密钥加密方式。

HTTP/1.1不验证通信方的身份有可能遭遇伪装

解决之道:服务器端认证。

  1. 服务器把自己的公开密钥发给数字证书认证机构
  2. CA即数字证书认证机构,用它的私钥给服务器的公钥签发数字签名,颁发证书。
  3. 客户端用电脑内置的CA公钥验证证书的数字签名
  4. 客户端用服务器端的公钥对数据进行加密传送

CA 认证过程.png

HTTP/1.1无法证明报文的完整性,所以有可能已遭篡改

解决之道:HTTPS发送数据时会附加一种叫做MAC(Message Authentication Code)的报文摘要。 MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。

HTTPS的缺点

HTTPS也存在一些问题,那就是当使用SSL时,它的处理速度会变慢。SSL的慢分两种。一种是指通信慢,另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。

HTTP/1.1 VS HTTP2

HTTP/1.1

HTTP/1.1虽然应用广泛,不过也有其本身的缺点。

  1. 队头阻塞:HTTP请求在请求应答过程中,如果出现任何状况,剩下所有的工作都会被阻塞在那次请求应答之后。这就是“队头阻塞”,它会阻碍网络传输和 Web 页面渲染,直至失去响应。

  2. 低效的TCP利用:TCP协议保证了传输的准确性,传输速度并不是最快。

  3. 臃肿的消息首部:HTTP/1.1提供了压缩被请求内容的机制,但是消息首部却无法压缩。消息首部可不能忽略,尽管它比响应资源小很多,但它可能占据请求的绝大部分。

  4. 受限的优先级设置

HTTP2

HTTP/2 大致可以分为两部分:

  • 分帧层,即 HTTP/2 多路复用能力的核心部分
  • 数据层,其中包含传统上被认为是 HTTP 及其关联数据的部分。
  1. 二进制协议:h2的分帧层是基于帧的二进制协议。

  2. 多路复用:HTTP/2 规范对流 (stream)的定义是:“HTTP/2 连接上独立的、双向的帧序列交换。”你可以将流看作在连接上的一系列帧,它们构成了单独的 HTTP 请求和响应。如果客户端想要发出请求,它会开启一个新的流。然后,服务器将在这个流上回复。这与 h1 的请求 / 响应流程类似,重要的区别在于,因为有分帧,所以多个请求和响应可以交错,而不会互相阻塞。

  3. 首部压缩:仅仅使用二进制协议似乎还不够,h2 的首部还会被深度压缩。这将显著减少传输中的冗余字节。

  4. 优先级设置:h2 通过流的依赖关系来解决这个问题。通过 HEADERS 帧和 PRIORITY 帧,客户端可以明确地和服务端沟通它需要什么,以及它需要这些资源的顺序。这是通过声明依赖关系树和树里的相对权重实现的。

  5. 服务端推送