HTTP/HTTPS工作原理

AmsChan ... 2021-09-17 网络协议
  • HTTP
  • HTTPS
大约 6 分钟

# HTTP

超文本传输协议(HyperText Transfer Protocol,HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。
1

# 工作原理

HTTP协议采用了请求/响应模型,由客户端向服务器发送一个请求报文,然后服务端返回一个响应报文。
1

# 报文内容

请求报文包含以下内容:

  • 请求的方法;
  • URL;
  • 协议版本;
  • 请求头部;
  • 请求数据。

响应报文包含以下内容:

  • 协议的版本;
  • 成功或者错误代码;
  • 服务器信息;
  • 响应头部;
  • 响应数据。

# 请求/响应步骤

  1. 客户端连接Web服务器
  2. 客户端发送HTTP请求
    • 客户端向Web服务器发送一个文本的请求报文。
    • 一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
  3. 服务端接收请求并返回HTTP响应
    • Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。
    • 一个响应由状态行、响应头部、空行和响应数据4部分组成。
  4. 释放TCP连接
    • 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接。
    • 若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
  5. 客户端浏览器解析HTML内容

# HTTP的五大特点

  1. 支持C/S模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GETHEADPOST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过 Connection: Keep-Alive 实现长连接
  5. 无状态HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

# HTTP的缺点

  • 通信使用明文(不加密),内容可能会被窃听。
  • 不验证通信方的身份,因此有可能遭遇伪装。
  • 无法证明报文的完整性,所以有可能已遭篡改。

# HTTPS

# 加密方式

  • 加密方式有两种:对称加密和非对称加密
    • 对称加密:加密和解密使用的密钥是相同的,这种加密方式的安全性在于密钥是否做好保密;
    • 非对称加密:加密和解密使用的密钥是不相同的,两个密钥分别是公钥和私钥,公钥用于加密(可公开),私钥用于解密(不可公开)
  • 区别:对称加密算法相比非对称加密算法来说,效率要高得多,性能也好,所以交互的场景下多用对称加密。

# 证书

由权威部门颁发的称为证书(Certificate)
1

# 证书包含的内容

  • 公钥
  • 证书所有者
  • 证书的发布机构
  • 证书有效期
  • 签名算法
  • 证书的指纹和计算指纹所使用的指纹算法
  • ……

# 工作模式

# 建立SSL连接

SSL四次握手
1
  • 第一次握手

    • Client发送 Client Hello(包含一个随机数N1)报文开始 SSL通信。报文中包含Client支持的 SSL的指定版本、 加密组件(Cipher Suite) 列表。
  • 第二次握手

    1. Server可进行 SSL通信时, 会以 Server Hello(包含一个随机数N2)报文作为应答。 和Client一样, 在报文中包含 SSL版本以及加密组件。 Server的加密组件内容是从接收到的客户端加密组件内筛选出来的。
    2. 然后Server发送 Certificate 报文。 报文中包含公开的证书。
    3. 最后Server发送 Server Hello Done 报文通知Client, 最初阶段的 SSL握手协商部分结束。
  • 第三次握手(证书校验)

    1. Client以 Client Key Exchange 报文作为回应。 报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串(N3)。 该报文已用步骤 3 中的公开的证书进行加密(N1+N2+N3 => 对称密钥);Server同时进行该加密计算步骤。
    2. 接着Client继续发送 Change Cipher Spec 报文。 该报文会提示服务器, 在此报文之后的通信会采用Pre-master secret 加密。
    3. Client发送消息进行加密传输测试(Encrypted Handshake Message)
    4. Client发送 Finished 报文。 该报文包含连接至今全部报文的整体校验值。 这次握手协商是否能够成功, 要以服务器是否能够正确解密该报文作为判定标准。
  • 第四次握手

    1. Server同样发送 Change Cipher Spec 报文。
    2. Server同样发送 Encrypted Handshake Message 报文。
    3. Server同样发送 Finished 报文。

整体流程

交换协议版本号 => 选择一个通信双方都支持的加密方式 => 对两端实现身份验证 =>

# 建立TCP连接,发送HTTP请求

  1. Server和Client的 Finished 报文交换完成后,通信会受到SSL的保护,接下来开始应用层协议的通信,发送HTTP请求。
  2. 应用层协议通信,发送HTTP响应。

# 断开连接

  1. Client主动断开连接。Client发送 close_notify 报文。
  2. 然后Client发送 TCP FIN 报文来关闭与 TCP的通信。

# SSL的缺点

  • 通信慢:和HTTP相比,网络负载会变慢2~100倍(除去和TCP 连接、 发送 HTTP 请求 • 响应以外, 还必须进行 SSL通信,因此整体上处理通信量不可避免会增加)。
  • 处理速度慢:由于SSL必须进行加密处理,要大量消耗CPU 及内存等资源, 导致处理速度变慢。在服务器和客户端都需要进行加密和解密的运算处理。 因此从结果上讲, 比起 HTTP 会更多地消耗服务器和客户端的硬件资源, 导致负载增强。