http协议和https协议的连接流程

我们以访问 www.baidu.com 为例,从「客户端发起请求」到「服务器返回数据」,拆解每一步细节。

前置知识:核心术语准备

  1. TCP 三次握手:所有 HTTP/HTTPS 连接的基础,用于建立客户端和服务器的可靠传输通道。
  2. CA 证书:百度的服务器证书,由权威 CA 机构(如 GlobalSign)颁发,包含百度公钥、域名、有效期、数字签名等信息。
  3. 浏览器根证书:浏览器预装的全球权威 CA 根证书(如 GlobalSign 根证书),用于验证百度证书的合法性。
  4. 对称密钥 / 非对称密钥: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 连接的基础

  1. 第一次握手(客户端→服务器) :客户端发送 SYN 报文(同步报文),附带随机序列号 seq=x,请求建立连接。
  2. 第二次握手(服务器→客户端) :服务器收到 SYN 后,返回 SYN+ACK 报文,确认序列号 ack=x+1,同时附带自己的随机序列号 seq=y
  3. 第三次握手(客户端→服务器) :客户端收到 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 响应

  1. 百度服务器接收 HTTP 请求,解析请求头,处理业务逻辑(如生成首页 HTML);

  2. 服务器构造 HTTP 响应报文,明文返回给客户端,响应报文结构如下:

    HTTP/1.1 200 OK
    Content-Type: text/html; charset=utf-8
    Content-Length: 12345

    <!DOCTYPE html> <html> <head><title>百度一下,你就知道</title></head> <body>...</body> </html>
  • 200 OK:响应状态码,表示请求成功;
  • Content-Type:告诉客户端响应内容是 HTML 格式;
  • 响应体是百度首页的 HTML 代码。

步骤 5:TCP 四次挥手(断开连接,可选)

HTTP 是无状态协议,默认请求响应完成后会断开 TCP 连接(可通过 Connection: keep-alive 保持连接):

  1. 客户端发送 FIN 报文,请求断开连接;
  2. 服务器返回 ACK 报文,确认断开;
  3. 服务器发送 FIN 报文,告知客户端数据已传输完毕;
  4. 客户端返回 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 个关键报文:

  1. Server Hello :确认使用的 TLS 版本(TLS 1.2)、加密套件(如 TLS_RSA_WITH_AES_256_CBC_SHA256)、服务器随机数 Server Random(后续生成对称密钥用)。
  2. Certificate(核心!百度 CA 证书) :服务器发送自己的 CA 证书,证书包含以下关键信息:
    • 证书持有者:www.baidu.com
    • 服务器公钥:百度的 RSA 公钥(用于加密预主密钥);
    • 颁发机构:GlobalSign;
    • 有效期:证书的生效 / 过期时间;
    • 数字签名:GlobalSign 用自己的根私钥对「证书内容 + 哈希摘要」加密后的结果。
  3. Server Hello Done:服务器告知客户端,TLS 握手的服务器端信息已发送完毕。
阶段 3:客户端验证百度证书(HTTPS 认证的核心!)

客户端(浏览器)收到证书后,必须验证其合法性 ------验证失败则直接终止连接,验证步骤如下:

  1. 解析证书:提取证书中的「服务器公钥、域名、颁发机构、数字签名」等信息。
  2. 验证证书链
    • 浏览器检查本地是否有「GlobalSign 根证书」(预装的,默认信任);
    • 用 GlobalSign 根公钥解密证书的「数字签名」,得到 GlobalSign 生成的「证书哈希摘要」;
    • 客户端对证书内容(公钥 + 域名等)重新计算哈希,生成「本地摘要」;
    • 对比「GlobalSign 摘要」和「本地摘要」:一致则证书未被篡改,不一致则证书伪造
  3. 额外校验
    • 证书是否过期?
    • 证书的域名是否与请求域名 www.baidu.com 匹配?
    • 证书是否被列入黑名单?

以百度为例:如果验证通过,浏览器地址栏会显示「小锁」图标,提示「连接安全」;如果验证失败,会弹出「该网站证书不受信任」的警告。

阶段 4:客户端生成并发送预主密钥

验证通过后,客户端继续执行:

  1. 生成 预主密钥(Pre-Master Secret):一串随机的加密字符串;
  2. 百度服务器公钥(从证书中提取)加密预主密钥,生成「加密的预主密钥」;
  3. 向服务器发送 Client Key Exchange 报文,内容是「加密的预主密钥」------只有百度的私钥能解密
  4. 客户端发送 Change Cipher Spec 报文:告知服务器「后续数据将用协商好的对称密钥加密」。
  5. 客户端发送 Finished 报文:包含所有 TLS 握手信息的哈希值,用于服务器验证握手完整性。
阶段 5:服务器解密并生成对称密钥

百度服务器接收报文后:

  1. 自己的私钥解密「加密的预主密钥」,得到原始预主密钥;
  2. 客户端和服务器分别执行相同的算法:对称密钥 = f(Client Random + Server Random + Pre-Master Secret)------ 最终生成完全相同的对称密钥
  3. 服务器发送 Change Cipher Spec 报文:告知客户端「后续数据将用对称密钥加密」;
  4. 服务器发送 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:服务器解密并返回响应

  1. 百度服务器用对称密钥解密客户端请求,解析 HTTP 内容;
  2. 服务器生成首页 HTML,用对称密钥加密后返回给客户端;
  3. 客户端用对称密钥解密响应,得到明文 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 已大幅优化)

0voice · GitHub

相关推荐
松涛和鸣1 天前
44、HTML与HTTP服务器交互笔记
linux·运维·服务器·http·链表·html
居然是阿宋1 天前
DHCP深度解析:从自动连接到七层之谜
网络
源远流长jerry1 天前
WebSocket 消息传输:帧格式、掩码机制与代理污染攻击防护
网络·websocket·网络协议
Geometry Fu1 天前
《无线传感网络》WSN 第3讲 MAC协议 知识点总结+习题讲解
网络·网络协议·无线传感器网络·wsn
hxjhnct1 天前
https,WebSocket,tcp的关系
网络协议·tcp/ip·https
qq_310658511 天前
webrtc源码走读(五)核心引擎层——传输模块
服务器·网络·音视频·webrtc
hgz07101 天前
内存、磁盘、网络监控
网络
源远流长jerry1 天前
DNS解析过程以及CDN流程
http·缓存
Xの哲學1 天前
Linux SLUB 内存分配器深度剖析: 从设计哲学到实战调试
linux·服务器·网络·算法·边缘计算