目录
HTTP 版本演进 请求响应模型 Cookie 与 Session 缓存机制 对称与非对称加密 TLS 握手过程 证书链
01

HTTP 版本演进

背景 Web 的诞生与扩张

1990 年,Tim Berners-Lee 在 CERN 发明了万维网(WWW),同时设计了 HTTP/0.9——一个极其简单的协议:客户端发送 GET 请求,服务器返回 HTML 文件,没有请求头、响应头、状态码。随着 Web 的迅速普及,HTTP 需要支持更多的功能:内容类型、缓存控制、身份认证、连接复用等。

第一性原理: HTTP 的每一次版本迭代都是为了解决「性能瓶颈」「功能需求」之间的矛盾。1.0 解决了功能缺失,1.1 解决了连接复用,2.0 解决了头部阻塞,3.0 解决了传输层阻塞。每一步都是在现有网络基础设施之上,针对 Web 应用规模的增长做出的优化。

原理 1.0 → 1.1 → 2.0 → 3.0 的核心改进

HTTP/1.0 (1996): 引入版本号、状态码、请求头、响应头、内容类型(Content-Type)。每个请求建立一个新的 TCP 连接,即短连接——请求完成后立即关闭。

HTTP/1.1 (1997): 引入持久连接 (Keep-Alive),允许在同一个 TCP 连接上发送多个请求和响应;增加管道化 (Pipelining),允许客户端连续发送多个请求而不等待响应;增加分块传输编码 (Chunked Transfer Encoding),支持动态内容。

HTTP/2.0 (2015): 基于 SPDY 协议,引入二进制分帧多路复用头部压缩 (HPACK)服务器推送。解决了 HTTP/1.1 的队头阻塞问题。

HTTP/3.0 (2022): 基于 QUIC 协议(UDP 之上),解决 HTTP/2.0 在传输层的队头阻塞问题,减少连接建立延迟,支持 0-RTT 快速连接。

HTTP 版本演进对比 HTTP/1.0 短连接 每次请求新建 TCP ✗ 连接开销大 ✗ 队头阻塞 ✗ 无持久连接 HTTP/1.1 持久连接 管道化 ✓ 连接复用 ✗ 队头阻塞 ✗ 头部冗余 HTTP/2.0 二进制分帧 多路复用 ✓ 解决队头阻塞 ✓ 头部压缩 ✗ TCP 队头阻塞 HTTP/3.0 基于 QUIC UDP + 多路复用 ✓ 无队头阻塞 ✓ 0-RTT 连接 ✓ 更优迁移 1996 1997 2015 2022 图:HTTP 版本演进,从短连接到 QUIC,性能和功能持续提升
图:HTTP 版本演进,从短连接到 QUIC,性能和功能持续提升
▸ HTTP/1.1 vs HTTP/2.0 对比示例
# HTTP/1.1 请求示例 (顺序发送,队头阻塞) GET /image1.jpg HTTP/1.1 Host: example.com GET /image2.jpg HTTP/1.1 Host: example.com GET /image3.jpg HTTP/1.1 Host: example.com # HTTP/2.0 帧结构 (二进制分帧,多路复用) # 每个请求/响应被拆分为帧,通过流 ID 标识 # 帧类型: HEADERS, DATA, SETTINGS, PRIORITY 等 # 不同流的帧交错发送,无队头阻塞 # 使用 curl 查看 HTTP/2.0 支持 curl --http2 -I https://example.com

演进 从文档传输到实时应用

  • HTTP/0.9 (1990): 仅支持 GET,返回纯 HTML
  • HTTP/1.0 (1996): 引入版本号、状态码、请求头、响应头,支持多种内容类型
  • HTTP/1.1 (1997): 持久连接、管道化、分块传输、Host 头,成为 Web 基石
  • HTTP/2.0 (2015): 二进制分帧、多路复用、头部压缩、服务器推送,提升性能
  • HTTP/3.0 (2022): 基于 QUIC (UDP),解决 TCP 队头阻塞,降低连接延迟
"HTTP 的演进是从『文档传输协议』『实时应用协议』的转变。每一次升级都是为了适应 Web 应用复杂度的提升,从静态网页到动态内容,再到实时交互和流媒体。"
—— Web 协议设计哲学

取舍 设计中的权衡

🔗 持久连接 vs 连接开销
持久连接减少 TCP 握手开销,但可能造成空闲连接占用资源。HTTP/1.1 通过 Keep-Alive 和 Connection 头控制连接生命周期。
⚡ 多路复用 vs 优先级
HTTP/2 多路复用解决了队头阻塞,但引入了流优先级和依赖关系管理。不当的优先级可能导致关键资源加载延迟。
📦 HTTP/3 的 UDP 挑战
QUIC 基于 UDP,避免了 TCP 队头阻塞,但需要在应用层实现可靠传输、拥塞控制,增加了实现复杂度。同时,部分防火墙和中间件可能阻挡 UDP 流量。
02

请求响应模型

背景 Web 通信的基本范式

HTTP 采用 客户端-服务器 架构,通信模式为 请求-响应 模型:客户端(通常是浏览器)发起请求,服务器接收请求、处理后返回响应。这种模型简单、明确,但也带来了服务器无法主动推送的限制(虽然 HTTP/2 的服务器推送解决了部分问题)。

第一性原理: 请求响应模型的本质是「同步的消息交换」。客户端必须等待服务器响应后才能发送下一个请求(在 HTTP/1.1 中),这导致了「请求-等待-响应」的循环。虽然 HTTP/2 和 HTTP/3 通过多路复用突破了这一限制,但核心的「一个请求对应一个响应」的映射关系从未改变。这种设计使得 Web 协议具有天生的可伸缩性——服务器不需要维护复杂的连接状态,只需对每个请求做出响应。

原理 报文结构 · 请求方法 · 状态码

请求报文结构:

  • 请求行:方法 + 路径 + 版本
  • 请求头:键值对,如 HostUser-AgentAccept
  • 请求体:可选,如 POST 请求的表单数据

响应报文结构:

  • 状态行:版本 + 状态码 + 状态描述
  • 响应头:键值对,如 Content-TypeContent-Length
  • 响应体:可选,如 HTML 页面、JSON 数据
HTTP 请求响应模型 客户端 Browser / App 服务器 Web Server 请求 (Request) GET /index.html HTTP/1.1 响应 (Response) HTTP/1.1 200 OK 状态码分类 1xx: 信息 2xx: 成功 3xx: 重定向 4xx: 客户端错误 5xx: 服务器错误 图:请求-响应模型,状态码分类标识响应结果类型
图:请求-响应模型,状态码分类标识响应结果类型

常用请求方法:

  • GET:获取资源,幂等、安全
  • POST:提交数据,非幂等
  • PUT:完整替换资源,幂等
  • DELETE:删除资源,幂等
  • PATCH:部分修改资源
  • HEAD:获取响应头,不返回响应体
▸ HTTP 请求与响应完整示例
# 请求报文 POST /api/users HTTP/1.1 Host: example.com Content-Type: application/json Content-Length: 45 User-Agent: Mozilla/5.0 { "name": "张三", "age": 28 } # 响应报文 HTTP/1.1 201 Created Location: /api/users/12345 Content-Type: application/json Content-Length: 30 { "id": "12345", "name": "张三" }

演进 从简单 GET 到复杂交互

  • HTTP/0.9: 仅支持 GET,无请求头、无状态码
  • HTTP/1.0: 引入 POST、HEAD,状态码 200/404/500
  • HTTP/1.1: 增加 PUT、DELETE、OPTIONS、PATCH,更多状态码
  • REST 架构 (2000): 将 HTTP 方法映射为 CRUD 操作,成为 Web API 设计标准
"请求响应模型虽然简单,却支撑了整个万维网。它的成功在于『无状态』『可缓存』——每个请求都包含足够的信息,服务器不需要记住之前的请求。这种设计让 Web 可以无限扩展。"
—— Web 架构设计哲学

取舍 设计中的权衡

📊 无状态 vs 有状态
HTTP 无状态设计提高了可扩展性,但需要额外的机制(Cookie、Session、Token)来保持用户状态。这增加了应用的复杂性。
🔧 方法选择
GET vs POST:GET 用于读取,可被缓存;POST 用于提交,不可被缓存。选择不当可能导致安全问题和性能问题。
⚠️ 状态码语义
状态码的语义有时不够精确,如 404 可能表示资源不存在,也可能表示权限不足。需要结合响应体或自定义头来补充信息。
04

缓存机制

背景 如何减少重复请求?

Web 页面包含大量资源(图片、CSS、JS),如果每个资源每次都要从服务器重新下载,将导致页面加载缓慢、服务器负载过高。HTTP 缓存通过在客户端和服务器之间引入缓存层,将资源存储在浏览器或中间代理中,大大减少重复请求。

第一性原理: 缓存的本质是「用空间换时间」——将之前获取的数据存储在本地,后续请求直接使用本地副本,避免网络传输。HTTP 缓存通过缓存策略(强缓存和协商缓存)来决定缓存的有效性。强缓存直接在本地生效,协商缓存需要向服务器验证有效性。这种「先验后询」的机制,在保证数据新鲜度的同时最大限度减少了网络请求。

原理 强缓存 · 协商缓存 · 缓存控制头

强缓存: 浏览器在缓存有效期内直接使用本地缓存,不发送任何请求。由 ExpiresCache-Control: max-age 控制。

协商缓存: 缓存已过期,浏览器向服务器发送验证请求,由服务器决定是否使用缓存。由 Last-Modified/If-Modified-SinceETag/If-None-Match 控制。

HTTP 缓存机制 强缓存 请求 → 检查缓存 Cache-Control: max-age=3600 有效期内 → 直接使用缓存 无网络请求 过期 → 进入协商缓存 请求服务器验证 协商缓存 发送验证请求 If-Modified-Since / If-None-Match 304 Not Modified 使用缓存,无响应体 200 OK (新资源) 下载新资源,更新缓存 图:强缓存 vs 协商缓存,缓存策略优化网络请求
图:强缓存 vs 协商缓存,缓存策略优化网络请求
▸ 缓存控制头示例
# 强缓存:max-age 指令 Cache-Control: public, max-age=86400 # 含义:缓存 24 小时,中间代理和浏览器均可缓存 # 不缓存 Cache-Control: no-cache, no-store, must-revalidate # no-cache:每次需验证;no-store:完全不缓存 # 协商缓存:ETag 和 Last-Modified ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT # 客户端验证头 If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4" If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

演进 Expires → Cache-Control → 缓存分级

  • Expires (HTTP/1.0): 绝对时间缓存,但依赖于客户端时钟,不准确
  • Cache-Control (HTTP/1.1): 相对时间缓存,更精确,支持 max-ages-maxage 等指令
  • ETag (HTTP/1.1): 内容哈希验证,比 Last-Modified 更精确
  • CDN 缓存 (2000s): 在 CDN 边缘节点缓存,减少回源请求
  • Service Worker (2015): 允许 JavaScript 控制缓存,实现离线缓存和精细化缓存策略
"HTTP 缓存的演进是从『时间驱动』『内容驱动』的转变。从绝对时间的 Expires,到相对时间的 Cache-Control,再到内容哈希的 ETag,缓存验证越来越精确,缓存利用率越来越高。"
—— Web 性能设计哲学

取舍 设计中的权衡

⏱ 新鲜度 vs 实时性
较长的缓存时间提高性能但降低实时性;较短的缓存时间保证实时性但增加请求。需要根据资源变化频率设置合适的缓存策略。
🔧 私有 vs 公共缓存
private 缓存仅限浏览器,适合用户个人数据;public 缓存可被 CDN 等共享,适合公共资源。选择错误可能导致数据泄露或缓存污染。
📊 缓存分级策略
现代 Web 应用通常使用多级缓存:CDN(边缘)、反向代理(如 Nginx 缓存)、应用缓存(Redis/内存)、浏览器缓存。每级缓存的配置需要协调,避免缓存不一致。
05

对称与非对称加密

背景 在不安全的网络上建立安全信道

互联网是公开的,数据在传输过程中可能被窃听、篡改。如何在不安全的网络上建立安全的通信信道?加密技术提供了解决方案。但加密本身面临一个核心问题:如何安全地交换密钥? 对称加密高效但密钥分发困难,非对称加密解决密钥交换问题但性能较差。

第一性原理: 对称加密和非对称加密解决的是「加密效率」「密钥分发」之间的矛盾。对称加密用同一个密钥加密解密,速度快但密钥需要保密;非对称加密用公钥加密、私钥解密,无需共享密钥但速度慢。TLS 的解决方案是混合加密:用非对称加密安全地交换一个对称密钥,然后用对称密钥加密实际传输的数据。这结合了两者的优点。

原理 对称加密 · 非对称加密 · 数字签名 · 密钥交换

对称加密 (Symmetric Encryption): 加密和解密使用同一个密钥。常见算法:AES (Advanced Encryption Standard)、ChaCha20。

非对称加密 (Asymmetric Encryption): 加密和解密使用不同的密钥(公钥和私钥)。常见算法:RSA、ECDSA (Elliptic Curve)。

数字签名: 用私钥对消息哈希进行加密,验证者用公钥解密和验证,确保消息完整性和来源可信。

对称 vs 非对称加密 对称加密 同一密钥加密解密 明文 加密 密文 解密 密钥 K ✓ 速度快 (AES) ✗ 密钥分发困难 非对称加密 公钥加密 · 私钥解密 明文 加密 密文 解密 公钥 私钥 ✓ 密钥分发简单 ✗ 速度慢 (RSA) 图:对称加密效率高但密钥分发难,非对称加密密钥分发易但效率低
图:对称加密效率高但密钥分发难,非对称加密密钥分发易但效率低
▸ 对称与非对称加密示例 (OpenSSL)
# 对称加密 (AES-256) # 加密:使用密码派生密钥 openssl enc -aes-256-cbc -salt -in plain.txt -out cipher.txt # 非对称加密 (RSA) # 生成密钥对 openssl genrsa -out private.pem 2048 openssl rsa -in private.pem -pubout -out public.pem # 使用公钥加密 openssl rsautl -encrypt -pubin -inkey public.pem -in plain.txt -out cipher.txt # 使用私钥解密 openssl rsautl -decrypt -inkey private.pem -in cipher.txt -out plain.txt

演进 DES → RSA → ECC → 量子密码

  • DES (1977): 56 位密钥,已被暴力破解
  • RSA (1977): 基于大整数分解难题,广泛使用,但密钥长度不断增加
  • AES (2001): 取代 DES,支持 128/256 位密钥,安全且高效
  • ECC (2004): 椭圆曲线密码,同等安全强度下密钥更短,性能更好
  • 量子密码 (未来): 基于量子力学原理,理论上可抗量子计算攻击
"加密技术的演进是一场『猫鼠游戏』——计算能力的提升不断挑战加密算法的安全性,而新算法又不断涌现。从 DES 到 AES,从 RSA 到 ECC,我们一直在寻找『更短密钥、更高安全、更快速度』的平衡点。"
—— 密码学设计哲学

取舍 设计中的权衡

⚡ 性能 vs 安全
高强度加密(如 AES-256)更安全但消耗更多 CPU。非对称加密比对称加密慢 1000 倍以上,因此 TLS 使用混合加密:非对称交换密钥,对称加密数据。
🔑 密钥长度
RSA-2048 是目前的最低安全标准,但 RSA-4096 更安全但更慢。ECDSA 提供相同的安全等级但密钥更短,性能更好。
📈 算法选择
算法选择需要平衡安全性、性能、兼容性。例如,ChaCha20 在移动设备上性能优于 AES,但硬件加速支持不如 AES 广泛。
06

TLS 握手过程

背景 HTTPS 的安全基石

HTTPS = HTTP + TLS(Transport Layer Security)。TLS 是 SSL 的后继者,在传输层提供加密、认证和完整性保护。TLS 握手是 HTTPS 连接建立的关键阶段,负责身份验证(服务器证书验证)、密钥协商(生成会话密钥)、密码套件协商(选择加密算法)。

第一性原理: TLS 握手的本质是「在不可信网络上建立可信信道」。通过证书链验证服务器身份,通过非对称加密安全交换对称密钥,通过密码套件协商安全参数。整个过程需要 2-3 个 RTT(往返时间),因此 TLS 1.3 通过简化握手和 0-RTT 显著减少了延迟。TLS 握手实际上是在「安全」「速度」之间寻找平衡。

原理 TLS 1.2 vs TLS 1.3 握手流程

TLS 1.2 完整握手 (4 步):

  1. Client Hello: 发送支持的 TLS 版本、密码套件、随机数
  2. Server Hello + Certificate + Server Hello Done: 选择密码套件、发送证书、协商参数
  3. Client Key Exchange + Change Cipher Spec + Finished: 发送加密的 Pre-Master Secret,切换加密
  4. Change Cipher Spec + Finished: 服务器切换加密,完成握手
TLS 1.2 完整握手流程 客户端 Client 服务器 Server Client Hello 版本 · 密码套件 · 随机数 Server Hello + Certificate 选择密码套件 · 发送证书 · Server Hello Done Client Key Exchange 加密 Pre-Master Secret · Change Cipher Spec Change Cipher Spec + Finished 服务器切换加密 · 完成握手 图:TLS 1.2 完整握手 4 步,共 2 RTT
图:TLS 1.2 完整握手 4 步,共 2 RTT

TLS 1.3 改进:

  • 减少到 1 RTT 完成握手
  • 0-RTT 模式(需前一次连接缓存)
  • 移除已废弃的密码套件(如 SHA-1、RC4)
  • 强制使用 PFS (Perfect Forward Secrecy)
▸ 查看 TLS 握手信息 (OpenSSL)
# 查看 TLS 握手详细信息 openssl s_client -connect example.com:443 -tls1_2 # 使用 TLS 1.3 连接 openssl s_client -connect example.com:443 -tls1_3 # 查看证书链 openssl s_client -connect example.com:443 -showcerts # 使用 curl 查看 TLS 版本 curl -v https://example.com # 输出中包含: * TLS version: TLSv1.3

演进 SSL 2.0 → SSL 3.0 → TLS 1.0 → TLS 1.3

  • SSL 2.0 (1995): 第一个商用协议,存在严重安全漏洞
  • SSL 3.0 (1996): 修复 SSL 2.0 漏洞,但已被 POODLE 攻击攻破
  • TLS 1.0 (1999): SSL 的继承者,逐步淘汰中
  • TLS 1.2 (2008): 支持 AEAD 加密模式,广泛使用
  • TLS 1.3 (2018): 大幅减少握手延迟,移除不安全算法,强制 PFS
"TLS 的演进是『简化』『强化』的统一。从 SSL 到 TLS 1.3,握手步骤从 4 步减少到 1-2 步,而安全性从 40 位加密增强到 256 位加密。我们不仅在增强安全性,还在提升性能——这打破了『安全一定慢』的刻板印象。"
—— 安全协议设计哲学

取舍 设计中的权衡

⏱ 延迟 vs 安全
TLS 1.3 通过减少 RTT 降低延迟,但也减少了握手信息的灵活性。0-RTT 虽快但存在重放攻击风险,需要谨慎使用。
🔧 密码套件选择
TLS 1.2 支持多种密码套件,但配置不当可能导致弱加密。TLS 1.3 强制使用安全套件,减少了配置错误的风险。
📈 兼容性
TLS 1.3 与旧版本不兼容,需要客户端和服务器同时支持。在大型部署中,升级 TLS 1.3 需要保证向后兼容性,通常需要保持 TLS 1.2 的支持。
07

证书链

背景 如何验证服务器身份?

在 TLS 握手中,服务器需要向客户端证明自己的身份。单纯使用公钥是不够的——任何人都可以生成密钥对。需要可信第三方 (CA, Certificate Authority) 对服务器的公钥进行签名认证。证书链是从根 CA服务器证书的一条信任链,每一级证书都经过上一级 CA 的签名。

第一性原理: 证书链的本质是「信任的传递」。浏览器信任根 CA(预装在系统中),根 CA 信任中间 CA,中间 CA 信任服务器证书。这种「链式信任」机制避免了所有证书都存储在浏览器中的问题,使得证书签发和管理具有可扩展性。证书链的安全性完全依赖于根 CA 的安全——如果根 CA 的私钥泄露,整个信任链将崩溃。

原理 证书结构 · 证书链验证 · 吊销

X.509 证书结构:

  • 版本号 (Version)
  • 序列号 (Serial Number)
  • 签名算法 (Signature Algorithm)
  • 颁发者 (Issuer)
  • 有效期 (Validity Period)
  • 主体 (Subject)
  • 主体公钥信息 (Subject Public Key Info)
  • 签名 (Signature)
证书链结构 根 CA 证书 自签名 · 预置在浏览器 中间 CA 证书 根 CA 签名 服务器证书 中间 CA 签名 签名 签名 证书验证流程 1. 浏览器加载服务器证书 2. 检查证书有效期 3. 验证证书签名 (中间 CA) 4. 中间 CA 证书是否在信任库? 5. 验证中间 CA 签名 (根 CA) 6. 根 CA 是否在信任列表? 7. 检查证书吊销状态 (OCSP/CRL) ✅ 验证通过,建立安全连接 图:证书链的信任传递与验证流程
图:证书链的信任传递与验证流程

证书吊销机制:

  • CRL (Certificate Revocation List): CA 定期发布吊销列表
  • OCSP (Online Certificate Status Protocol): 实时查询证书状态
  • OCSP Stapling: 由服务器从 CA 获取 OCSP 响应,随证书一起发送,提高查询效率
▸ 查看证书链信息
# 查看证书链 (使用 OpenSSL) openssl s_client -connect example.com:443 -showcerts # 查看证书详细信息 openssl x509 -in certificate.pem -text -noout # 查看 OCSP 状态 openssl ocsp -issuer issuer.pem -cert server.pem -url http://ocsp.example.com # 使用 curl 查看证书信息 curl -v https://example.com 2>&1 | grep -A 10 "Server certificate"

演进 自签名 → CA 签名 → 根证书预装

  • 自签名证书 (早期): 服务器自己签名,浏览器无法验证,需手动信任
  • CA 签名证书 (1990s): 引入第三方 CA,浏览器预装根证书,自动验证
  • 中间 CA (2000s): 扩展证书链,提高 CA 管理效率
  • 证书透明度 (CT, 2013): 防止 CA 错误签发,将证书发布到公开日志
  • 自动证书管理 (ACME, 2016): Let's Encrypt 实现自动签发和续期,降低证书成本
"证书链的设计是『以 CA 为中心』的信任模型。它的成功依赖于 CA 的可信度,但也存在中心化的弊端。证书透明度和 ACME 是社区对 CA 体系的重要改进,提高了透明度和自动化程度。"
—— PKI 设计哲学

取舍 设计中的权衡

🔒 信任 vs 去中心化
CA 体系依赖中心化的信任模型,存在单点故障风险。去中心化的 Web of Trust(如 PGP)虽然更灵活,但在 Web 浏览器中未被广泛支持。
⏱ 吊销时效性
CRL 更新频率低,时效性差;OCSP 实时性好但增加查询延迟。OCSP Stapling 结合了时效性和性能,但需要服务器支持。
📈 证书有效期
长期证书(1 年)减少续期频率,但私钥泄露风险大;短期证书(30 天)提高安全性但增加管理负担。ACME 让短期证书成为可能。