HTTP
超文本传输协议(HyperText Transfer Protocol,HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。
工作原理
协议采用了请求/响应模型,由客户端向服务器发送一个请求报文,然后服务端返回一个响应报文。
报文内容
请求报文包含以下内容:
- 请求的方法;
- URL;
- 协议版本;
- 请求头部;
- 请求数据。
响应报文包含以下内容:
- 协议的版本;
- 成功或者错误代码;
- 服务器信息;
- 响应头部;
- 响应数据。
请求/响应步骤
- 客户端连接 Web 服务器
- 客户端发送 HTTP 请求
- 客户端向 Web 服务器发送一个文本的请求报文。
- 一个请求报文由请求行、请求头部、空行和请求数据 4 部分组成。
- 服务端接收请求并返回 HTTP 响应
- Web 服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由客户端读取。
- 一个响应由状态行、响应头部、空行和响应数据 4 部分组成。
- 释放 TCP 连接
- 若 connection 模式为 close,则服务器主动关闭 TCP 连接,客户端被动关闭连接,释放 TCP 连接。
- 若 connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
- 客户端浏览器解析 HTML 内容
HTTP 的五大特点
- 支持C/S模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。 - 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。 - 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive
实现长连接 - 无状态:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 的缺点
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以有可能已遭篡改。
HTTPS
加密方式
- 加密方式有两种:对称加密和非对称加密
- 对称加密:加密和解密使用的密钥是相同的,这种加密方式的安全性在于密钥是否做好保密;
- 非对称加密:加密和解密使用的密钥是不相同的,两个密钥分别是公钥和私钥,公钥用于加密(可公开),私钥用于解密(不可公开)
- 区别:对称加密算法相比非对称加密算法来说,效率要高得多,性能也好,所以交互的场景下多用对称加密。
证书
由权威部门颁发的称为证书(Certificate)
证书包含的内容
- 公钥
- 证书所有者
- 证书的发布机构
- 证书有效期
- 签名算法
- 证书的指纹和计算指纹所使用的指纹算法
- ……
工作模式
建立 SSL 连接
SSL四次握手
- 第一次握手
- Client 发送
Client Hello
(包含一个随机数 N1)报文开始 SSL 通信。报文中包含 Client 支持的 SSL 的指定版本、 加密组件(Cipher Suite) 列表。
- Client 发送
- 第二次握手
- Server 可进行 SSL 通信时, 会以
Server Hello
(包含一个随机数 N2)报文作为应答。 和 Client 一样, 在报文中包含 SSL 版本以及加密组件。 Server 的加密组件内容是从接收到的客户端加密组件内筛选出来的。 - 然后 Server 发送
Certificate
报文。 报文中包含公开的证书。 - 最后 Server 发送
Server Hello Done
报文通知 Client, 最初阶段的 SSL 握手协商部分结束。
- Server 可进行 SSL 通信时, 会以
- 第三次握手(证书校验)
- Client 以
Client Key Exchange
报文作为回应。 报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串(N3)。 该报文已用步骤 3 中的公开的证书进行加密(N1+N2+N3 => 对称密钥);Server 同时进行该加密计算步骤。 - 接着 Client 继续发送
Change Cipher Spec
报文。 该报文会提示服务器, 在此报文之后的通信会采用 Pre-master secret 加密。 - Client 发送消息进行加密传输测试(Encrypted Handshake Message)
- Client 发送
Finished
报文。 该报文包含连接至今全部报文的整体校验值。 这次握手协商是否能够成功, 要以服务器是否能够正确解密该报文作为判定标准。
- Client 以
- 第四次握手
- Server 同样发送
Change Cipher Spec
报文。 - Server 同样发送
Encrypted Handshake Message
报文。 - Server 同样发送
Finished
报文。
- Server 同样发送
整体流程
交换协议版本号 => 选择一个通信双方都支持的加密方式 => 对两端实现身份验证 =>
建立 TCP 连接,发送 HTTP 请求
- Server 和 Client 的
Finished
报文交换完成后,通信会受到 SSL 的保护,接下来开始应用层协议的通信,发送 HTTP 请求。 - 应用层协议通信,发送 HTTP 响应。
断开连接
- Client 主动断开连接。Client 发送
close_notify
报文。 - 然后 Client 发送
TCP FIN
报文来关闭与 TCP 的通信。
SSL 的缺点
- 通信慢:和 HTTP 相比,网络负载会变慢 2~100 倍(除去和 TCP 连接、 发送 HTTP 请求 • 响应以外, 还必须进行 SSL 通信,因此整体上处理通信量不可避免会增加)。
- 处理速度慢:由于 SSL 必须进行加密处理,要大量消耗 CPU 及内存等资源, 导致处理速度变慢。在服务器和客户端都需要进行加密和解密的运算处理。 因此从结果上讲, 比起 HTTP 会更多地消耗服务器和客户端的硬件资源, 导致负载增强。