前言
HTTP 是互联网的基石,但它存在天生的安全缺陷。HTTPS 在 HTTP 之上加了一层 TLS 加密,解决了安全问题,但也带来了性能开销。
本文从0到1,彻底讲清楚:
-
HTTP 是什么、怎么工作、各版本演进
-
HTTPS 的密码学基础(对称/非对称/哈希/证书)
-
HTTPS 完整握手流程(6阶段图解)
-
HTTP/1.0 → 1.1 → 2.0 → 3.0 核心变化对比
无论你是前端、后端、还是运维,这些知识都是面试常客,也是理解网络通信的必备功底。
一、HTTP 基础详解
1.1 HTTP 是什么
HTTP(HyperText Transfer Protocol,超文本传输协议) ,应用层协议,是浏览器和服务器之间明文传输数据的基础规则。
核心特点(必记):
-
无状态 :服务器不记录客户端任何信息,每次请求独立
-
无连接 :默认一次请求响应后断开 TCP 连接(1.0),1.1 后支持长连接
-
明文:数据以文本格式传输,不加密
默认端口:80
作用:传输网页、图片、接口数据等超文本内容。
1.2 HTTP 核心工作流程
一次完整的 HTTP 请求分为 6 步:
客户端(浏览器)→ 建立 TCP 连接(三次握手)
客户端 → 发送 HTTP 请求报文(请求资源)
服务器 → 解析请求、处理业务、查询数据
服务器 → 返回 HTTP 响应报文(返回结果)
客户端 → 解析响应、渲染页面 / 处理数据
断开 TCP 连接(HTTP 1.0 默认)
1.3 HTTP 报文结构
请求报文(客户端 → 服务器)
请求行:请求方法(GET/POST)+ 请求地址 + 协议版本
请求头:Cookie、User-Agent、Host、Accept 等(附加信息)
请求体:POST 数据、表单参数(GET 无请求体)
示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: session_id=abc123
响应报文(服务器 → 客户端)
响应行:协议版本 + 状态码(200/404/500)+ 描述
响应头:Content-Type、Set-Cookie、Cache-Control 等
响应体:网页 HTML、JSON 数据、图片二进制流(核心数据)
示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1024
Set-Cookie: session_id=abc123; Path=/
<html>
<body>Hello World</body>
</html>
1.4 HTTP 无状态的问题与解决方案
问题:无状态意味着服务器不记得你------登录完了下一页又要登录,购物车加了刷新一下没了。
解决方案:
| 方案 | 原理 | 特点 |
|---|---|---|
| Cookie + Session | 服务端存 Session,客户端存 Cookie(存 Session ID) | 传统方案,服务端有状态 |
| JWT(Token) | 客户端持有加密 Token,服务端无状态验证 | 分布式友好,无需 Session 存储 |
| OAuth / SSO | 统一认证授权,第三方登录 | 跨系统、跨平台 |
二、HTTP 版本演进对比
2.1 HTTP/1.0 vs HTTP/1.1
| 特性 | HTTP/1.0 | HTTP/1.1 |
|---|---|---|
| 连接方式 | 短连接,每次请求独立 TCP | 长连接(Keep-Alive),复用 TCP |
| 缓存控制 | 无缓存优化 | 引入 Cache-Control、ETag |
| 断点续传 | 不支持 | 支持(Range 头) |
| Host 头 | 无 | 必填(虚拟主机支持) |
| 核心问题 | 建连消耗大、延迟高 | 队头阻塞:同一 TCP 请求串行处理,前一个阻塞后一个 |
HTTP/1.0 的痛点:每个请求都要三次握手 + 四次挥手,页面加载 10 个资源就要建连 10 次。
HTTP/1.1 的改进 :Keep-Alive 复用 TCP 连接,但队头阻塞依然存在------同一连接上请求必须排队。
2.2 HTTP/1.1 vs HTTP/2.0
| 特性 | HTTP/1.1 | HTTP/2.0 |
|---|---|---|
| 多路复用 | ❌ 串行请求,队头阻塞 | ✅ 单 TCP 并行多路传输,互不干扰 |
| 数据格式 | 文本报文,体积大、解析慢 | 二进制帧,紧凑高效、解析快 |
| 头部压缩 | 仅 Body 压缩,Header 明文 | HPACK 算法压缩 Header |
| 服务器推送 | ❌ 客户端逐个请求资源 | ✅ 服务器主动推送关联资源 |
| 连接数限制 | 浏览器 6-8 个连接上限 | 单连接即可多路复用 |
二进制帧工作原理:
HTTP/1.1: GET /a → GET /b → GET /c(排队)
HTTP/2.0: ┌─帧1(a)─┐ ┌─帧2(b)─┐ ┌─帧3(c)─┐(并行)
└────────┘ └────────┘ └────────┘
同一条 TCP 连接,同时传输
HPACK 头部压缩:HTTP/1.1 的 Header 每次都是明文重复(Cookie、User-Agent 等),HTTP/2.0 用 HPACK 压缩+索引,重复字段只传索引号,Header 体积减少 80%+。
2.3 HTTP/2.0 vs HTTP/3.0
| 特性 | HTTP/2.0 | HTTP/3.0 |
|---|---|---|
| 传输协议 | TCP | QUIC(基于 UDP) |
| 建连耗时 | TCP 三次握手 + TLS 握手 = 2-RTT | 0-RTT(重连)/ 1-RTT(新连) |
| 头部压缩 | HPACK | QPACK(更高效,适配 QUIC) |
| 队头阻塞 | TCP 层存在(丢包阻塞所有请求) | 彻底解决(各流独立,丢包不影响其他) |
| 连接迁移 | ❌ 依赖四元组,IP/端口变则断连 | ✅ 64 位连接 ID,网络切换不断连 |
队头阻塞的致命差异:
- HTTP/2.0 的队头阻塞 :虽然应用层多路复用,但 TCP 本身是顺序传输的。只要丢一个包,TCP 会等待重传,阻塞整条连接上的所有请求。
- HTTP/3.0 彻底解决:QUIC 的每个数据流独立,流 A 丢包只影响流 A,流 B/C/D 继续传输。
连接迁移 :TCP 靠 源 IP + 源端口 + 目的 IP + 目的端口 四元组标识连接,WiFi 切移动数据,IP 变了,TCP 连接立即断开。QUIC 用 64 位连接 ID,网络切换后 ID 不变,连接自动恢复------刷抖音、看视频、打语音切网络不中断的原理。
三、QUIC 底层核心
QUIC(Quick UDP Internet Connections)是 HTTP/3.0 的底层传输协议,站在 UDP 肩膀上实现 TCP 的功能,还更强:
| 特性 | TCP | QUIC(基于 UDP) |
|---|---|---|
| 传输层 | 内核态,难以升级 | 应用层,随时迭代 |
| 握手 | 3 次握手 | 0-RTT / 1-RTT |
| 丢包影响 | 阻塞整个连接 | 只阻塞单个流 |
| 连接迁移 | 四元组,断了重建 | 连接 ID,无缝切换 |
| 加密 | 依赖 TLS 层 | 内建 TLS,天然加密 |
| 拥塞控制 | 内核实现,难以定制 | 应用层,可自定义策略 |
一句话总结 QUIC:UDP 做底层,应用层自己实现流量控制、拥塞控制、重传机制,集成 TLS 天然加密,每个数据流独立不相互阻塞。
四、HTTPS 密码学基础(核心底层)
HTTPS 的安全建立在密码学四大基石上。不理解这块,HTTPS 握手流程看了也是白看。
4.1 对称加密
| 项目 | 说明 |
|---|---|
| 定义 | 加密和解密用同一把密钥 |
| 特点 | ⚡ 速度极快、计算简单 |
| 缺点 | 密钥传输不安全(中途可能被截获) |
| 用途 | 大数据加密(通信主体) |
| 例子 | AES(HTTPS 主流)、DES、3DES |
问题:既然对称加密快,为什么不用它直接加密所有数据?------密钥怎么安全地传给对方?
4.2 非对称加密
| 项目 | 说明 |
|---|---|
| 定义 | 一对密钥:公钥(Public Key)+ 私钥(Private Key) |
| 规则 | 公钥加密 → 私钥解密;私钥加密 → 公钥解密 |
| 特点 | 🔒 安全,但速度慢、计算复杂 |
| 用途 | 加密小数据(密钥、签名) |
| 例子 | RSA(HTTPS 主流)、ECC |
公私钥的唯一性原则 :
-
公钥:公开给全世界,谁都可以拿
-
私钥:只有自己保管,绝不泄露
4.3 哈希算法
| 项目 | 说明 |
|---|---|
| 定义 | 任意长度数据 → 固定长度摘要 |
| 核心特性 | ① 不可逆(摘要推不出原文)② 数据改 1 位,摘要全变 |
| 用途 | 校验数据完整性、数字签名 |
| 例子 | SHA-256、MD5(已淘汰) |
哈希算法不加密,它做的是指纹校验------确保数据在传输中没有被篡改。
4.4 数字证书
核心问题:非对称加密里,你拿到的公钥怎么确定是服务器本人的,而不是中间人伪造的?
答案就是数字证书。
| 项目 | 说明 |
|---|---|
| 颁发者 | CA(Certificate Authority,权威机构) |
| 内容 | 绑定服务器域名 + 服务器公钥 + CA 签名 |
| 作用 | 证明公钥是真实服务器的,不是黑客伪造的 |
| 验证 | 客户端校验证书域名、有效期、CA 签名(防篡改) |
一句话:数字证书就是服务器的"身份证",CA 就是"公安局"。
CA 证书防篡改的核心:浏览器 / 操作系统里「预装了 CA 根证书的公钥」,用它验签名、确认证书没被改、没被伪造。
五、HTTPS 本质
HTTPS = HTTP + TLS(旧称SSL,已淘汰)
HTTP = 明文传输,易被窃听、篡改、劫持
HTTPS = HTTP数据经TLS加密传输,端口443(HTTP是80)
核心矛盾解决 :
-
对称加密:快 但密钥传输不安全
-
非对称加密:安全 但太慢
-
HTTPS 组合拳:非对称加密传密钥,对称加密传数据
六、HTTPS 完整加密流程(6 阶段详解)
这是面试高频考点,也是理解 HTTPS 最关键的部分。
阶段 1:客户端发起 TLS 握手
客户端向服务器发送:
-
客户端随机数 (Client Random)
-
支持的加密套件(对称 + 非对称的组合)
Client → Server: Client Random + 支持的加密套件
阶段 2:服务器响应握手
服务器返回:
-
服务器随机数 (Server Random)
-
选中的加密套件
-
服务器数字证书(含服务器公钥)
Server → Client: Server Random + 选中加密套件 + 数字证书
阶段 3:客户端验证证书
客户端校验证书 3 个关键点:
- 是否过期 → 证书有有效期
- 域名是否匹配 → 和访问的域名一致
- CA 签名是否合法 → 防伪造
✅ 验证通过:信任服务器公钥,继续握手
❌ 验证失败:直接断开连接,浏览器显示"不安全"
Client: 验证证书 → 通过则信任公钥
阶段 4:密钥交换(非对称加密上场)
Client: 生成预主密钥(Pre-Master Key)
用服务器公钥 + 非对称加密 → 加密预主密钥
发送给服务器
Server: 用自己的私钥解密 → 拿到预主密钥
关键点:预主密钥全程用公钥加密传输,黑客截获了没有私钥也解不开。
阶段 5:生成会话密钥
客户端和服务器各自独立计算,用相同的三个数据:
会话密钥 = 算法(Client Random + Server Random + Pre-Master Key)
双方计算出的会话密钥完全一致 ,而且这个密钥从未在网络中传输过------黑客无从得知。
Client: 计算 → 会话密钥 A
Server: 计算 → 会话密钥 A(完全相同)
阶段 6:加密通信
双方用会话密钥 + 对称加密(AES) 传输 HTTP 数据。
Client ↔ Server: HTTP数据(AES加密传输)
为什么这里用对称加密?------速度快!大数据传输用非对称加密太慢。
完整的 HTTPS 握手图解
客户端 服务器
│ │
│ ① Client Random + 加密套件 │
│ ──────────────────────────────► │
│ │
│ ② Server Random + 证书 + 加密套件│
│ ◄────────────────────────────── │
│ │
│ ③ 验证证书(域名/有效期/CA签名) │
│ │
│ ④ 生成预主密钥, 用公钥加密 │
│ ──────────────────────────────► │
│ │
│ ⑤ 各自计算会话密钥 │
│ 3 个输入: │
│ Client Random │
│ Server Random │
│ Pre-Master Key │
│ │
│ ⑥ 会话密钥 + AES 加密通信 │
│ ◄════════════════════════════► │
│ HTTP 数据(加密传输) │
SSL/TLS握手就那么一次,后续通信全走对称加密,又快又安全。
七、总结对比表
HTTP 各版本一句话总结
| 版本 | 核心特点 | 最大缺陷 |
|---|---|---|
| HTTP/1.0 | 短连接,请求完就断 | 建连成本高 |
| HTTP/1.1 | 长连接 Keep-Alive | 队头阻塞 |
| HTTP/2.0 | 多路复用 + 二进制帧 + HPACK 压缩 | TCP 层丢包仍阻塞 |
| HTTP/3.0 | QUIC (UDP) + 0-RTT + 连接迁移 | 部署成本高 |
HTTPS 密码学一句话总结
| 技术 | 一句话 |
|---|---|
| 对称加密 | 快但密钥怕截获 |
| 非对称加密 | 安全但速度慢 |
| 哈希算法 | 不可逆,做数据完整性校验 |
| 数字证书 | 服务器的"身份证",防中间人攻击 |
| HTTPS | 非对称加密传密钥 + 对称加密传数据 = 又快又安全 |