HTTP 协议是一种明文传输协议
HTTPS=HTTP+SSL/TLS 非明文传输
SSL/TLS可以对数据进行加密、解密、签名和验证
http包括/1.1、http/2和http/3

HTTP

包括 HTTP/1.1、HTTP/2和HTTP/3

HTTP/1.1

发布于1999年,HTTP/1.1在HTTP/1.0的基础上进行了多项改进:

  • 持久连接(Keep-Alive):默认启用持久连接,允许在一个TCP连接上发送多个请求和响应,减少了连接建立和关闭的开销。
  • 管道化(Pipelining):客户端可以在收到前一个响应之前发送多个请求,但由于服务器必须按顺序处理请求,实际应用中此功能并未广泛使用。
  • 新增方法:引入了如PUTDELETE等方法,丰富了客户端与服务器的交互方式。

HTTP/2

于2015年发布,HTTP/2在HTTP/1.1的基础上进行了显著改进:

  • 多路复用(Multiplexing):在一个TCP连接中,客户端和服务器可以同时发送多个请求和响应,解决了HTTP/1.1中的队头阻塞问题,提高了传输效率。
  • 头部压缩:使用HPACK算法对头部信息进行压缩,减少了传输的数据量,加快了加载速度。
  • 服务器推送(Server Push):服务器可以在客户端请求之前主动推送资源,减少了延迟。例如,在客户端请求HTML页面时,服务器可以主动推送相关的CSS和JavaScript文件。

HTTP/3

作为最新版本,HTTP/3采用了与前版本不同的传输层协议:

  • 基于QUIC协议:HTTP/3使用基于UDP的QUIC协议,取代了之前的TCP。这使得连接建立更快,减少了延迟,并且解决了TCP层面的队头阻塞问题。
  • 集成TLS:QUIC协议将TLS集成在传输层,提供了更高效的加密和安全性。

HTTPS

HTTPS(超文本传输安全协议)是在HTTP的基础上加入SSL/TLS层,以确保数据传输的机密性和完整性。无论是HTTP/1.1、HTTP/2还是HTTP/3,都可以通过加入SSL/TLS层来实现HTTPS,从而提供安全的通信通道。

加密流程

如上图,HTTPS 流程包含握手和后续的数据传输,握手的目的是为了客户端与服务端协商加密算法等参数。

HTTPS 协议的工作原理大致如下:

  1. 客户端首次请求服务器,告诉服务器自己支持的协议版本,支持的加密算法及压缩算法,并生成一个随机数(client random)告知服务器。

客户端需要提供的信息:

  • 支持的协议版本,如 TSL1.0 版本
  • 客户端生成的随机数,用以稍后生成对称密钥
  • 支持的加密算法;支持的压缩方法等
  1. 服务器确认双方使用的加密方法,并返回给客户端证书以及一个服务器生成的随机数(server random)

服务器需要提供的信息:

  • 协议的版本
  • 加密的算法
  • 服务器生成的随机数
  • 服务器证书
  1. 客户端收到证书后,首先验证证书的有效性,然后生成一个新的随机数(premaster secret),并使用数字证书中的公钥,加密这个随机数,发送给服务器。

客户端会对服务器下发的证书进行验证,验证通过后,客户端会再次生成一个随机数(premaster secret),然后使用服务器证书中的公钥进行加密,以及放一个 ChangeCipherSpec 消息即编码改变的消息,还有整个前面所有消息的 hash 值,进行服务器验证,然后用新秘钥加密一段数据一并发送到服务器,确保正式通信前无误。

  1. 服务器接收到加密后的随机数后,使用私钥进行解密,获取这个随机数(premaster secret)。

  2. 最后,服务器和客户端根据约定的加密方法,使用前面提到的三个随机数(client random, server random, premaster secret),生成对称密钥,用来加密接下来的整个对话过程。服务端用对称密钥加密响应数据传给客户端,客户端用对称密钥解密响应数据,得到明文数据。