文章目录
-
-
- [HTTP 与 HTTPS 的三次握手与四次挥手详解](#HTTP 与 HTTPS 的三次握手与四次挥手详解)
- [一、HTTP 的三次握手与四次挥手](#一、HTTP 的三次握手与四次挥手)
-
- [1. HTTP 三次握手](#1. HTTP 三次握手)
- [2. HTTP 四次挥手](#2. HTTP 四次挥手)
- [二、HTTPS 的三次握手与四次挥手](#二、HTTPS 的三次握手与四次挥手)
-
- [1. HTTPS(无证书)的三次握手与 SSL/TLS 握手](#1. HTTPS(无证书)的三次握手与 SSL/TLS 握手)
- [2. HTTPS(有证书)的三次握手与 SSL/TLS 握手](#2. HTTPS(有证书)的三次握手与 SSL/TLS 握手)
- [3. HTTPS 的四次挥手](#3. HTTPS 的四次挥手)
- 总结
-
HTTP 与 HTTPS 的三次握手与四次挥手详解
在互联网的世界中,HTTP(HyperText Transfer Protocol)和 HTTPS(HTTP Secure)是我们常见的两种网络协议。HTTP 是一种用于传输网页数据的协议,而 HTTPS 是在 HTTP 基础上加入了 SSL/TLS 加密层以确保数据安全的协议。两者都基于 TCP/IP 协议,因此在建立和断开连接时,都会经历"三次握手"与"四次挥手"的过程。本文将详细讲解这两种协议的三次握手与四次挥手的过程,并对 HTTPS 中有证书与无证书的情况进行区分。
我们先看看基本的计算机网络中的TCP连接建立和断开的过程。
一、HTTP 的三次握手与四次挥手
HTTP 基于 TCP 协议,使用 TCP 的三次握手建立连接,使用四次挥手断开连接。由于 HTTP 不涉及加密或证书,因此整个连接流程相对简单,直接使用 TCP 进行通信。
1. HTTP 三次握手
HTTP 的三次握手过程如下:
-
第一次握手(SYN):
- 客户端发送一个 SYN(同步序列编号)包,请求建立连接。
- 此时,客户端进入 "SYN_SENT" 状态。
-
第二次握手(SYN + ACK):
- 服务器收到 SYN 包后,回复一个 SYN + ACK 包,表示确认收到客户端的请求,并发送了自己的 SYN 请求。
- 服务器进入 "SYN_RECV" 状态。
-
第三次握手(ACK):
- 客户端收到服务器的 SYN + ACK 包后,再次发送一个 ACK(确认)包给服务器,表示连接建立成功。
- 此时,客户端和服务器都进入 "ESTABLISHED" 状态,可以进行数据传输。
2. HTTP 四次挥手
HTTP 的四次挥手用于安全地断开 TCP 连接,确保双方的数据传输完毕,并安全释放资源。
-
第一次挥手(FIN):
- 客户端发送一个 FIN(结束)包给服务器,表示自己已经没有数据要发送了,要求断开连接。
- 发送完 FIN 后,客户端进入 "FIN_WAIT_1" 状态。
-
第二次挥手(ACK):
- 服务器收到 FIN 包后,回复一个 ACK 包给客户端,表示确认收到断开请求,但服务器可能还有数据要传输。
- 服务器进入 "CLOSE_WAIT" 状态,客户端进入 "FIN_WAIT_2" 状态。
-
第三次挥手(FIN):
- 服务器确认数据传输完毕后,向客户端发送 FIN 包,表示同意断开连接。
- 服务器进入 "LAST_ACK" 状态。
-
第四次挥手(ACK):
- 客户端收到服务器的 FIN 包后,回复一个 ACK 包给服务器,表示确认断开连接。
- 客户端进入 "TIME_WAIT" 状态,等待一段时间(通常是 2 倍的最大报文段生存时间),确保服务器收到了 ACK 包后再彻底关闭连接。
- 服务器收到 ACK 包后进入 "CLOSED" 状态,连接正式关闭。
二、HTTPS 的三次握手与四次挥手
HTTPS 在 HTTP 的基础上增加了 SSL/TLS 层进行加密通信。HTTPS 不仅仅是 TCP 的三次握手,还涉及 SSL/TLS 握手,用于确定双方使用的加密协议和密钥。因此,我们需要区分有证书和无证书的情况。
1. HTTPS(无证书)的三次握手与 SSL/TLS 握手
在一些特殊情况下(例如本地测试环境中),可能不会使用正式的 SSL/TLS 证书。此时的流程主要依赖于 TCP 三次握手和简单的加密协议协商,证书验证的部分被简化或跳过。
TCP 三次握手:
- 无证书情况下,HTTPS 的 TCP 三次握手步骤与 HTTP 相同,先通过 TCP 连接建立通信。
TLS 握手过程:
-
SSL/TLS 握手开始在 TCP 三次握手之后,负责协商加密算法和生成加密密钥。无证书情况下,流程相对简化,跳过证书验证部分。
- ClientHello :客户端发送一个
ClientHello
消息,其中包含支持的加密算法和随机数。 - ServerHello :服务器响应
ServerHello
,确认加密算法,并提供另一随机数。 - 密钥生成:双方基于这两个随机数,结合协商的加密算法生成共享密钥,用于后续通信的数据加密。
- ClientHello :客户端发送一个
2. HTTPS(有证书)的三次握手与 SSL/TLS 握手
在正式应用中,HTTPS 通常需要服务器端证书,客户端也可能需要证书。在这种情况下,SSL/TLS 握手会更加复杂,涉及证书的验证过程。
TCP 三次握手:
- HTTPS 有证书情况下,TCP 三次握手的步骤与 HTTP 相同,先建立 TCP 连接。
SSL/TLS 握手过程:
-
连接建立后,SSL/TLS 握手开始,其主要目的是在双方之间建立安全的加密通道,以下是详细步骤:
-
ClientHello:
- 客户端发送
ClientHello
消息,包含支持的 TLS 版本、加密算法、一个客户端随机数等。
- 客户端发送
-
ServerHello:
- 服务器收到
ClientHello
后,回复ServerHello
消息,确认 TLS 版本、加密算法,并提供一个服务器随机数。
- 服务器收到
-
服务器发送证书:
- 服务器发送其数字证书(通常是 CA 签发的),用于验证其身份。
-
客户端验证证书:
- 客户端验证服务器证书的合法性,确保其是由可信的证书颁发机构(CA)签发的,并且证书没有过期或被篡改。
- 如果证书验证成功,继续握手流程;如果验证失败,握手失败,连接中断。
-
生成预主密钥:
- 客户端生成一个称为预主密钥的随机数,并使用服务器的公钥加密该随机数,发送给服务器。只有服务器可以使用其私钥解密该密钥。
-
双方生成主密钥:
- 服务器和客户端使用之前生成的随机数和预主密钥,基于协商的加密算法,生成主密钥。该密钥用于对接下来的通信进行加密。
-
ClientFinished & ServerFinished:
- 客户端和服务器分别发送
Finished
消息,通知对方握手过程已完成,此时双方可以使用对称加密进行通信。
- 客户端和服务器分别发送
-
3. HTTPS 的四次挥手
HTTPS 的四次挥手与 HTTP 的四次挥手基本相同,因为它们都依赖于 TCP 的连接断开机制。唯一的区别在于 HTTPS 在断开连接前,确保所有加密数据都已成功传输且解密完成,之后才进行四次挥手的过程。
总结
HTTP 的三次握手和四次挥手:
- 直接基于 TCP 进行通信,无加密层。
- TCP 三次握手建立连接,四次挥手断开连接。
HTTPS 的三次握手和四次挥手:
- 增加了 SSL/TLS 握手过程,确保数据的加密传输。
- 有证书情况下,SSL/TLS 握手涉及证书验证和密钥交换过程。
- 无证书情况下,SSL/TLS 握手流程简化,可能跳过证书验证,但仍然需要协商加密协议和密钥。
通过三次握手和四次挥手,HTTP 和 HTTPS 确保了可靠的连接建立与关闭,而 HTTPS 进一步通过 SSL/TLS 协议实现了数据加密和安全性提升。在实际应用中,HTTPS 应用广泛,因为它能够有效保护数据隐私,确保数据的安全传输。理解三次握手和四次挥手的机制,有助于我们更好地把握网络协议的工作原理,为开发和维护网络应用打下坚实的基础。