我们以访问 www.baidu.com 为例,从「客户端发起请求」到「服务器返回数据」,拆解每一步细节。
前置知识:核心术语准备
- TCP 三次握手:所有 HTTP/HTTPS 连接的基础,用于建立客户端和服务器的可靠传输通道。
- CA 证书:百度的服务器证书,由权威 CA 机构(如 GlobalSign)颁发,包含百度公钥、域名、有效期、数字签名等信息。
- 浏览器根证书:浏览器预装的全球权威 CA 根证书(如 GlobalSign 根证书),用于验证百度证书的合法性。
- 对称密钥 / 非对称密钥:HTTPS 专用,非对称密钥用于传输对称密钥,对称密钥用于加密实际数据。
一、 HTTP 协议连接建立完整流程
HTTP 连接是无状态、明文传输的,连接建立 + 数据传输仅需「TCP 三次握手 + HTTP 请求响应」两步,无任何认证 / 加密步骤。
步骤 1:DNS 解析(获取百度服务器 IP)
- 客户端(浏览器)输入
www.baidu.com,首先向 DNS 服务器 发送请求:www.baidu.com 的 IP 是多少? - DNS 服务器返回百度服务器的 IP 地址(如
180.101.50.242)。
这一步是所有网络请求的前置步骤,HTTP/HTTPS 都需要。
步骤 2:TCP 三次握手(建立可靠传输通道)
客户端通过 IP 地址与百度服务器建立 TCP 连接,这是 HTTP 连接的基础:
- 第一次握手(客户端→服务器) :客户端发送
SYN报文(同步报文),附带随机序列号seq=x,请求建立连接。 - 第二次握手(服务器→客户端) :服务器收到
SYN后,返回SYN+ACK报文,确认序列号ack=x+1,同时附带自己的随机序列号seq=y。 - 第三次握手(客户端→服务器) :客户端收到
SYN+ACK后,返回ACK报文,确认序列号ack=y+1。
三次握手完成后,客户端与服务器的 TCP 连接正式建立,可以双向传输数据。
步骤 3:构造 HTTP 请求头,发送请求
客户端(浏览器)构造 HTTP 请求报文,明文发送给服务器,请求报文结构如下:
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,*/*
GET /:请求方法为 GET,请求路径为根路径(首页);Host: www.baidu.com:指定目标域名(一台服务器可能托管多个域名);User-Agent:告诉服务器客户端是 Chrome 浏览器。
步骤 4:服务器处理请求,返回 HTTP 响应
-
百度服务器接收 HTTP 请求,解析请求头,处理业务逻辑(如生成首页 HTML);
-
服务器构造 HTTP 响应报文,明文返回给客户端,响应报文结构如下:
HTTP/1.1 200 OK
<!DOCTYPE html> <html> <head><title>百度一下,你就知道</title></head> <body>...</body> </html>
Content-Type: text/html; charset=utf-8
Content-Length: 12345
200 OK:响应状态码,表示请求成功;Content-Type:告诉客户端响应内容是 HTML 格式;- 响应体是百度首页的 HTML 代码。
步骤 5:TCP 四次挥手(断开连接,可选)
HTTP 是无状态协议,默认请求响应完成后会断开 TCP 连接(可通过 Connection: keep-alive 保持连接):
- 客户端发送
FIN报文,请求断开连接; - 服务器返回
ACK报文,确认断开; - 服务器发送
FIN报文,告知客户端数据已传输完毕; - 客户端返回
ACK报文,TCP 连接正式断开。
HTTP 流程核心缺陷
- 所有数据(请求头、响应体)明文传输,黑客可通过抓包工具直接查看;
- 无服务器身份认证,客户端无法确认连接的是「真实百度服务器」还是「中间人伪造的服务器」;
- 无数据完整性校验,传输过程中数据被篡改也无法发现。
二、 HTTPS 协议连接建立完整流程
HTTPS = HTTP + TLS/SSL,连接建立流程比 HTTP 多了关键的 TLS 握手步骤(核心是认证服务器 + 协商加密密钥)。
百度使用的是 GlobalSign 颁发的 CA 证书,浏览器预装了 GlobalSign 的根证书,这是验证的基础。
步骤 1:DNS 解析(同 HTTP)
客户端解析 www.baidu.com 得到服务器 IP 地址(如 180.101.50.242)。
步骤 2:TCP 三次握手(同 HTTP)
客户端与百度服务器完成 TCP 三次握手,建立可靠传输通道 ------HTTPS 必须先建立 TCP 连接,才能进行 TLS 握手。
步骤 3:TLS 握手(核心!认证 + 密钥协商,以 TLS 1.2 为例)
这是 HTTPS 与 HTTP 的核心区别,目的是:① 验证百度服务器身份;② 协商出后续加密用的对称密钥。
阶段 1:客户端发起 TLS 握手请求(Client Hello)
客户端(浏览器)向百度服务器发送 Client Hello 报文,内容包括:
- 支持的 TLS 版本(如 TLS 1.2);
- 支持的加密套件列表(如
TLS_RSA_WITH_AES_256_CBC_SHA256,表示「RSA 非对称加密 + AES 对称加密 + SHA256 哈希」); - 客户端随机数
Client Random(后续生成对称密钥用); - 其他扩展信息(如 SNI,用于指定目标域名
www.baidu.com)。
阶段 2:服务器响应 TLS 握手(Server Hello + 证书)
百度服务器接收请求后,返回 3 个关键报文:
- Server Hello :确认使用的 TLS 版本(TLS 1.2)、加密套件(如
TLS_RSA_WITH_AES_256_CBC_SHA256)、服务器随机数Server Random(后续生成对称密钥用)。 - Certificate(核心!百度 CA 证书) :服务器发送自己的 CA 证书,证书包含以下关键信息:
- 证书持有者:
www.baidu.com; - 服务器公钥:百度的 RSA 公钥(用于加密预主密钥);
- 颁发机构:GlobalSign;
- 有效期:证书的生效 / 过期时间;
- 数字签名:GlobalSign 用自己的根私钥对「证书内容 + 哈希摘要」加密后的结果。
- 证书持有者:
- Server Hello Done:服务器告知客户端,TLS 握手的服务器端信息已发送完毕。
阶段 3:客户端验证百度证书(HTTPS 认证的核心!)
客户端(浏览器)收到证书后,必须验证其合法性 ------验证失败则直接终止连接,验证步骤如下:
- 解析证书:提取证书中的「服务器公钥、域名、颁发机构、数字签名」等信息。
- 验证证书链 :
- 浏览器检查本地是否有「GlobalSign 根证书」(预装的,默认信任);
- 用 GlobalSign 根公钥解密证书的「数字签名」,得到 GlobalSign 生成的「证书哈希摘要」;
- 客户端对证书内容(公钥 + 域名等)重新计算哈希,生成「本地摘要」;
- 对比「GlobalSign 摘要」和「本地摘要」:一致则证书未被篡改,不一致则证书伪造。
- 额外校验 :
- 证书是否过期?
- 证书的域名是否与请求域名
www.baidu.com匹配? - 证书是否被列入黑名单?
以百度为例:如果验证通过,浏览器地址栏会显示「小锁」图标,提示「连接安全」;如果验证失败,会弹出「该网站证书不受信任」的警告。
阶段 4:客户端生成并发送预主密钥
验证通过后,客户端继续执行:
- 生成 预主密钥(Pre-Master Secret):一串随机的加密字符串;
- 用百度服务器公钥(从证书中提取)加密预主密钥,生成「加密的预主密钥」;
- 向服务器发送
Client Key Exchange报文,内容是「加密的预主密钥」------只有百度的私钥能解密。 - 客户端发送
Change Cipher Spec报文:告知服务器「后续数据将用协商好的对称密钥加密」。 - 客户端发送
Finished报文:包含所有 TLS 握手信息的哈希值,用于服务器验证握手完整性。
阶段 5:服务器解密并生成对称密钥
百度服务器接收报文后:
- 用自己的私钥解密「加密的预主密钥」,得到原始预主密钥;
- 客户端和服务器分别执行相同的算法:
对称密钥 = f(Client Random + Server Random + Pre-Master Secret)------ 最终生成完全相同的对称密钥; - 服务器发送
Change Cipher Spec报文:告知客户端「后续数据将用对称密钥加密」; - 服务器发送
Finished报文:包含所有 TLS 握手信息的哈希值,用于客户端验证握手完整性。
阶段 6:TLS 握手完成
客户端和服务器互相验证 Finished 报文的哈希值,确认握手过程无篡改 ------HTTPS 安全通道正式建立!
步骤 4:构造 HTTP 请求,加密传输
客户端(浏览器)构造 HTTP 请求头(和 HTTP 一致),但会用对称密钥加密后,通过已建立的 TCP 通道发送给服务器:
[对称密钥加密后的内容]
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Chrome/120.0.0.0
...
步骤 5:服务器解密并返回响应
- 百度服务器用对称密钥解密客户端请求,解析 HTTP 内容;
- 服务器生成首页 HTML,用对称密钥加密后返回给客户端;
- 客户端用对称密钥解密响应,得到明文 HTML,渲染百度首页。
步骤 6:TCP 四次挥手(同 HTTP)
请求响应完成后,断开 TCP 连接(或通过 keep-alive 保持连接)。
HTTPS 的核心是 "HTTP+TLS 加密认证",流程可简洁总结为:百度先向权威 CA 机构提交身份信息,CA 验证通过后用自身私钥对百度公钥、域名等信息签名生成证书并下发;当浏览器访问百度 HTTPS 站点时,先经 DNS 解析获取百度 IP,完成 TCP 三次握手建立基础连接,随后发送 TLS 版本、加密套件等信息发起握手;百度返回 CA 证书(含自身公钥),浏览器用预装的 CA 根公钥验证证书合法性(确认是真实百度),验证通过后生成对称密钥,用百度公钥加密后发送给百度;百度用自身私钥解密得到对称密钥,后续双方所有 HTTP 请求与响应均通过该对称密钥加密传输,实现安全通信。
三、 HTTP 与 HTTPS 连接建立流程核心对比
| 流程阶段 | HTTP 协议 | HTTPS 协议 |
|---|---|---|
| 基础连接 | TCP 三次握手 | TCP 三次握手(必须前置) |
| 核心差异 | 无额外步骤,直接明文传输 | 增加 TLS 握手(认证服务器 + 协商对称密钥) |
| 数据传输 | 所有数据明文 | 用对称密钥加密 HTTP 请求 / 响应 |
| 身份认证 | 无服务器认证 | 基于 CA 证书验证服务器身份,防中间人攻击 |
| 关键保障 | 无安全保障 | 加密性、认证性、完整性 |
| 性能开销 | 低(无加解密) | 稍高(TLS 握手 + 加解密,TLS 1.3 已大幅优化) |