HTTP

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

工作原理

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

报文内容

请求报文包含以下内容:

  • 请求的方法;
  • 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)

证书包含的内容

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

工作模式

建立 SSL 连接

SSL四次握手
  • 第一次握手

    • 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 会更多地消耗服务器和客户端的硬件资源, 导致负载增强。