VuePress 站点
首页
数学
计算机基础
Java后端
AI大模型
UI设计
首页
数学
计算机基础
Java后端
AI大模型
UI设计
  • 计算机基础
  • 计算机网络应用

    • 课程笔记:TCP三次握手建立连接
    • 课程笔记:TCP三次握手的必要性
    • 课程笔记:TCP协议缺陷与SYN Flood攻击
    • 课程笔记:TCP四次挥手释放连接
    • 课程笔记:TCP四次挥手释放连接的必要性
    • 课程笔记:TCP 报文段格式与 IP 分组
    • 课程笔记:HTTP/2 新特性——二进制分帧
    • 课程笔记:HTTP/2 新特性——多路复用
    • 课程笔记:HTTP/2 新特性——服务器推送(Server Push)
    • 课程笔记:HTTPS 简介与架构图
    • 课程笔记:HTTPS原理与传输层安全协议(TLS)
    • 课程笔记:HTTPS原理——对称加密算法
    • 课程笔记:HTTPS原理——非对称加密算法
    • 课程笔记:HTTPS 原理 —— 数字签名
    • 课程笔记:HTTPS 原理——证书与 CA
    • 课程笔记:完整的HTTPS协议通信流程
    • 课程笔记:HTTPS 协议的性能损耗
    • 课程笔记:TLS False Start 加速 HTTPS
    • 课程笔记:升级 HTTP 协议到 HTTP/2
    • 课程笔记:通过会话恢复加速 HTTPS
    • 课程笔记:OWASP 组织与十大 Web 安全漏洞
    • 课程笔记:XSS 跨站脚本攻击
    • 课程笔记:存储型XSS跨站脚本攻击
    • 课程笔记:XSS攻击窃取Cookie
    • 课程笔记:反射型XSS跨站脚本攻击
    • 课程笔记:DOM型XSS跨站脚本攻击
    • 课程笔记:植入 JS、HTML 代码攻击
    • 课程笔记:XSS攻击的防护策略
    • 课程笔记:XSS攻击的输入环节防护
    • 课程笔记:XSS 劫持 Cookie 的防护策略
    • 课程笔记:XSS 内容输出防护方案
    • 课程笔记:CSP 内容安全策略
    • 课程笔记:CSP 内容安全策略的应用方式
    • 课程笔记:CSRF 跨站请求伪造攻击原理
    • 课程笔记:CSRF 跨站点请求伪造攻击案例
    • 课程笔记:CSRF 跨站请求伪造防护方案
    • 课程笔记:OWASP CSRFTester 工具的原理与使用
    • 课程笔记:点击劫持攻击原理
    • 课程笔记:点击劫持防护方案
    • 课程笔记:URL 跳转漏洞原理与防护
    • 课程笔记:Session 认证与会话劫持
    • 课程笔记:Session固定与Session保持攻击
    • 课程笔记:注入攻击与 OWASP 靶机平台
    • 课程笔记:SQL盲注与ORM注入攻击及防护
    • 课程笔记:XML注入、代码注入、OS命令注入攻击
    • 课程笔记:文件上传漏洞与文件下载/目录浏览漏洞
    • 课程笔记:访问控制与权限访问漏洞
    • 课程笔记:DDoS 分布式拒绝服务攻击原理与防护
    • 课程笔记:CC(Challenge Collapsar)攻击与防护
    • 课程笔记:CDN 的工作原理
    • 课程笔记:CDN的网络架构和术语说明
    • 课程笔记:CDN应用场景与阿里云CDN
    • 课程笔记:如何使用阿里云CDN服务
    • 课程笔记:CDN 刷新与预热
    • 课程笔记:阿里云 CDN 回源配置
    • 课程笔记:CDN 缓存配置
    • 课程笔记:CDN 访问控制与性能优化
  • 计算机网网络

    • 📖 教材介绍与课程导言
    • 📖 1.1 信息时代的计算机网络
    • 📖 1.2 因特网概述
    • 📖 1.3 电路交换、分组交换和报文交换
    • 📖 1.4 计算机网络的定义和分类
    • 📖 1.5 计算机网络的性能指标(1)
    • 📖 1.5 计算机网络的性能指标(2)
    • 📖 1.6.1 常见的三种计算机网络体系结构
    • 📖 1.6.2 计算机网络体系结构分层的必要性
    • 📖 1.6.3 计算机网络体系结构分层思想举例
    • 📖 计算机网络体系结构中的专用术语
    • 📖 物理层概述
    • 📖 物理层下面的传输媒体
    • 📖 传输方式
    • 📖 编码与调制
    • 📖 2.5 信道的极限容量
    • 📖 2.6 信道复用技术
    • 📖 3.1 数据链路层概述
    • 📖 3.2 数据链路层的三个重要问题
    • 📖 3.2.1 封装成帧和透明传输
    • 📖 3.2.2 差错检测
    • 📖 3.2.3 (1) 可靠传输的相关基本概念
    • 📖 3.2.3 (2) 可靠传输的实现机制 - 停止-等待协议(SW)
    • 📖 3.2.3 (3) 可靠传输的实现机制 - 回退N帧协议(GBN)
    • 📖 3.2.3 (4) 可靠传输的实现机制 - 选择重传协议(SR)
    • 📖 3.3 点对点协议 PPP
    • 📖 3.4 共享式以太网
    • 📖 3.4.1 网络适配器和 MAC 地址
    • 📖 3.4.2 (1) CSMA/CD 协议的基本原理
    • 📖 3.4.2 (2) 共享式以太网的争用期、最小帧长和最大帧长
    • 📖 3.4.2 (3) 共享式以太网的退避算法和信道利用率
    • 📖 3.4.3 使用集线器的共享式以太网
    • 📖 3.4.4 在物理层扩展以太网
    • 📖 3.4.5 (1) 网桥的主要结构和基本工作原理
    • 📖 3.4.5 (2) 透明网桥的自学习和转发帧的过程以及生成树协议STP
    • 📖 3.5 交换式以太网
    • 📖 3.5.1 以太网交换机
    • 📖 3.5.2 共享式以太网和交换式以太网的对比
    • 📖 3.6 以太网的MAC帧格式
    • 📖 3.7.1 虚拟局域网 VLAN 概述
    • 📖 3.7.2 虚拟局域网 VLAN 的实现机制
    • 📖 3.8 以太网的发展
    • 📖 3.9.1 802.11 无线局域网的组成
    • 📖 3.9.2 802.11 无线局域网的物理层
    • 📖 3.9.3 (1) 802.11 无线局域网的数据链路层 —— 使用 CSMA/CA 协议(而不使用 CSMA/CD 协议)
    • 📖 CSMA/CA(载波监听多址接入/碰撞避免)协议的基本工作原理
    • 📖 802.11 无线局域网的 MAC 帧格式
    • 📖 网络层概述
    • 📖 网际协议 IP(网际协议)与异构网络互连
    • 📖 IPv4 地址及其编址方法——概述
    • 📖 IPv4 地址的分类编址方法
    • 📖 IPv4 地址的划分子网编址方法
    • 📖 IPv4 地址的无分类编址方法(CIDR)
    • 📖 IPv4 地址的应用规划
    • 📖 IPv4 地址与 MAC 地址
    • 📖 地址解析协议 ARP
    • 📖 IP 数据报的发送和转发流程
    • 📖 IPv4 数据报的首部格式
    • 📖 静态路由配置
    • 📖 因特网的路由选择协议概述
    • 📖 路由信息协议 RIP(路由信息协议)
    • 📖 开放最短路径优先 OSPF(开放最短路径优先)
    • 📖 边界网关协议 BGP(边界网关协议)
    • 📖 路由器的基本工作原理
    • 📖 网际控制报文协议 ICMP(网际控制报文协议)
    • 📖 虚拟专用网 VPN 和网络地址转换 NAT
    • 📖 IP 多播技术的相关基本概念
    • 📖 在局域网上进行硬件多播
    • 📖 在因特网上进行 IP 多播需要的两种协议
    • 📖 网际组管理协议 IGMP
    • 📖 多播路由选择协议
    • 📖 移动 IP 技术概述
    • 📖 IPv6 引进的主要变化
    • 📖 IPv6 数据报的基本首部和扩展首部
    • 📖 IPv6 地址
    • 📖 从 IPv4 向 IPv6 过渡
    • 📖 网际控制报文协议 ICMPv6
    • 📖 软件定义网络 SDN
    • 📖 运输层概述 — 进程间基于网络的通信
    • 📖 TCP/IP 体系结构运输层中的两个重要协议
    • 📖 运输层端口号、复用与分用的概念
    • 📖 UDP 和 TCP 的对比
    • 📖 TCP 报文段的首部格式
    • 📖 "三报文握手"建立 TCP 连接
    • 📖 "四报文挥手"释放 TCP 连接
    • 📖 TCP 的流量控制 (Flow Control)
    • 📖 TCP 的拥塞控制 (Congestion Control) 及与网际层拥塞控制的关系
    • 📖 TCP 可靠传输的实现
    • 📖 TCP 超时重传时间 (RTO) 的选择
    • 📖 TCP 的选择确认 (SACK)
    • 📖 6.1 应用层概述
    • 📖 6.2 客户—服务器方式和对等方式
    • 📖 6.3 动态主机配置协议 DHCP
    • 📖 6.4 域名系统 DNS
    • 📖 6.5 文件传送协议 FTP
    • 📖 电子邮件
    • 📖 万维网 WWW
    • 📖 网络安全概述
    • 📖 密码学相关基本概念
    • 📖 对称密钥密码体制
    • 📖 公钥密码体制
    • 📖 报文摘要和报文鉴别码
    • 📖 数字签名(digital signature)
    • 📖 实体鉴别
    • 📖 密钥分发
    • 📖 访问控制
    • 📖 网络体系结构各层采取的安全措施—物理层和数据链路层
    • 📖 网络体系结构各层采取的安全措施—网络层
    • 📖 网络体系结构各层采取的安全措施—运输层
    • 📖 网络体系结构各层采取的安全措施—应用层
    • 📖 防火墙访问控制与入侵检测系统
    • 📖 常见的网络攻击及其防范
    • 📖 定长子网划分和变长子网划分的二叉树解法

课程笔记:通过会话恢复加速 HTTPS

课程名称:计算机网络应用 核心摘要:本节课讲解 HTTPS 性能优化中的"会话恢复(Session Resumption)"机制,包括基于 Session ID 与 Session Ticket 两种实现方式的原理、优劣对比及 Nginx 配置实践,并介绍 TLS 1.3 中取而代之的 PSK(Pre-Shared Key) 机制演进。


一、 核心概念与原理

1.1 什么是会话恢复(Session Resumption)

  • 会话恢复是 HTTPS(TLS/SSL)性能优化的重要手段,英文为 Session Resumption。
  • 核心目标:避免每次连接都进行完整的 TLS 握手,从而提升 HTTPS 访问效率。

1.2 为什么需要会话恢复

使用 HTTPS 时,理论情况下必须经历:

  1. TCP 三次握手
  2. TLS 三次握手(SSL 握手)
  3. 才能发送 HTTP 报文

若会话中断后能复用上一次的握手记录,即可跳过完整 TLS 握手,直接进行加密数据传输,显著降低**往返时间(RTT)**开销。

1.3 关键区分:HTTP Session vs TLS Session

对比项HTTP SessionTLS/SSL Session
所属协议基于 HTTP 协议基于 SSL/TLS 安全协议
存储内容登录信息等业务状态SSL 握手记录(安全上下文)
作用维护应用层状态复用加密通道,避免重复握手

⚠️ 本课所讲的"会话恢复"中的 session 指的是 SSL/TLS 中的 session,并非 HTTP session。

1.4 两种实现方式

  • 方式一:Session ID(基于服务端缓存)
  • 方式二:Session Ticket(基于客户端存储)

二、 技术细节与协议分析

2.1 Session ID 复用原理

  1. 一次完整的 TLS 握手完成后,建立一个加密数据通道。
  2. 该通道的握手记录(安全上下文)以 Session Cache(会话缓存)形式保存在服务端内存中。
  3. 服务端为该握手记录生成一个唯一 ID,即 Session ID。
  4. 服务端维护 Session ID → Security Context(安全上下文) 的键值对映射。
  5. 客户端与服务端双方都会维护该 Session ID。
  6. 下次请求时,客户端在 ClientHello 阶段携带 Session ID,服务端在缓存中查找对应上下文:
    • 命中:跳过完整握手,直接复用原有加密通道进行数据传输。
    • 未命中:重新执行完整 TLS 握手。

2.2 Session ID 的两大弊端

  1. 不能跨机器共享
    • 在负载均衡环境下,若第一次访问微服务 A,第二次访问微服务 B,Session ID 无法跨机器复用,会话恢复失效。
  2. 缓存有效期难以平衡
    • 过短:起不到复用作用。
    • 过长:占用服务器大量内存资源。

2.3 OpenSSL 与 Nginx 的 Session Cache 实现

  • OpenSSL 内置的 session cache 不能跨进程共享,只能被单个 worker 进程使用。
  • Nginx 采用多进程业务模型,若每个 worker 独立维护缓存,会导致:
    • 第一次请求由 worker1 处理并缓存;
    • 第二次请求由 worker2 处理,Session ID 无法复用。
  • Nginx 自实现的 session cache:跨进程共享,使用红黑树组织 session cache,解决上述问题。

2.4 Session Ticket 机制

核心思想:将 session 信息存储在客户端(浏览器),解决 Session ID 的两大弊端。

工作原理

  1. Session Ticket 是由仅服务端知道的安全密钥加密后的会话信息。
  2. 加密使用的不是私钥,而是专门的 STEK(Session Ticket Encryption Key)。
  3. 加密后的 Session Ticket 保存在浏览器端。
  4. 下次请求时,客户端在 ClientHello 阶段携带 Session Ticket。
  5. 服务端收到后用 STEK 解密:
    • 解密成功:证明该 ticket 由本服务端加密,双方曾通信过 → 跳过 TLS 握手。
    • 解密失败:重新执行完整握手。

Session Ticket 的弊端

  • 服务端无需管理 session cache,但每次需解密 ticket,有一定开销(但远小于完整 TLS 握手)。
  • 安全风险:所有 ticket 均由同一 STEK 加密,若 STEK 泄露,存在安全风险。
  • 缓解措施:定期更换 STEK。

2.5 Session ID vs Session Ticket 对比

对比维度Session IDSession Ticket
存储位置服务端缓存(内存)客户端(浏览器)
跨机器共享❌ 不支持✅ 支持(无需同步)
跨进程共享OpenSSL 不支持,Nginx 自实现支持✅ 天然支持
有效期管理服务端管理,需平衡长短客户端持有,不占服务端资源
服务端开销维护缓存、查找上下文解密 ticket
安全风险缓存泄露风险STEK 泄露风险,需定期更换
适用场景单体架构、并发量不大分布式环境(推荐)

2.6 TLS 1.3 的演进:PSK

  • 在 TLS 1.3 / HTTP 3 中,Session Cache 和 Session Ticket 已被完全取消。
  • 取而代之的是 PSK(Pre-Shared Key,预共享密钥)。
  • PSK 机制:
    • 不让所有浏览器使用同一个 session cache 或同一个 STEK/服务端密钥(避免安全风险)。
    • 由客户端与服务器在握手过程中协商出一个 key,安全性更高。
  • 当前市场上尚未完全铺开,了解即可。

三、 实践应用与配置命令

3.1 启用 Session ID 缓存(ssl_session_cache)

# 语法:ssl_session_cache off | none | builtin[:size] | shared:name:size;

# 推荐配置:使用 shared 模式,跨 worker 进程共享
ssl_session_cache shared:SSL:10m;
# shared:SSL:10m
#   - shared   表示跨所有 worker 进程共享(Nginx 自实现,官方推荐)
#   - SSL      共享缓存的唯一名称(无需手动维护)
#   - 10m      缓存大小,1m 约可存储 4000 个会话,10m 约可存储 40000 个会话

四种取值详解

取值含义是否启用说明
off明令禁止❌明确告知客户端不支持会话复用,不维护 Session ID
none默认值❌告知客户端"支持"但实际不维护缓存(不生效)
builtin[:size]OpenSSL 内置缓存✅不能跨进程共享,仅单个 worker 可用;默认 20480 个会话;可能引起内存碎片
shared:name:sizeNginx 自实现共享缓存✅跨所有 worker 共享,官方推荐;单位默认 byte,可指定 1m/10m/100m

⚠️ 不推荐 builtin 与 shared 并存的多份缓存配置方式,直接使用 shared 性能更佳。

3.2 设置缓存有效期(ssl_session_timeout)

# 语法:ssl_session_timeout time;

# 推荐配置:30 分钟
ssl_session_timeout 30m;
# 注意:此处的 m 代表"分钟",不是"月"
# 过短起不到复用作用,过长占用服务器资源,推荐 30m

3.3 启用 Session Ticket(ssl_session_tickets)

# 语法:ssl_session_tickets on | off;

# 开启 Session Ticket
ssl_session_tickets on;

指定 STEK(可选)

# 使用 OpenSSL 生成随机私钥文件作为 STEK
openssl rand 2048 > ticket.key
# 在 Nginx 中指定 STEK 文件(可选,不指定则使用 OpenSSL 随机生成的 key)
ssl_session_ticket_key /path/to/ticket.key;

若未指定 STEK,Nginx 会使用 OpenSSL 默认生成的随机 key。

3.4 完整推荐配置示例

# 单体架构 / 并发量不大:可使用 Session ID(shared 缓存)
ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 30m;

# 分布式环境:推荐启用 Session Ticket
ssl_session_tickets on;
# ssl_session_ticket_key /path/to/ticket.key;  # 可选:指定 STEK

四、 重点与难点提示

考点 / 易错点

  1. 会话恢复中的 session 指 TLS/SSL session,不是 HTTP session——务必区分清楚。
  2. Session ID 不能跨机器共享——负载均衡环境下的核心弊端。
  3. OpenSSL 内置 session cache 不能跨进程共享——Nginx 用 shared 模式解决。
  4. ssl_session_cache 的四种取值:off / none / builtin / shared,推荐 shared。
  5. ssl_session_timeout 的单位:m 是分钟,不是月;推荐 30m。
  6. Session Ticket 的加密密钥是 STEK,不是 SSL 私钥——易混淆点。
  7. Session Ticket 存储在客户端,解决跨机器同步与有效期管理两大问题。
  8. TLS 1.3 中 Session ID 和 Session Ticket 均被取消,改用 PSK。

面试题

  • 简述 HTTPS 会话恢复的两种方式及区别。
  • 为什么 Session ID 在负载均衡下会失效?如何解决?
  • Nginx 中 ssl_session_cache shared 相比 builtin 有何优势?
  • Session Ticket 如何保证安全性?STEK 的作用是什么?
  • TLS 1.3 中用什么机制替代了会话恢复?为什么?

五、 课后疑问/遗留问题

  1. PSK(Pre-Shared Key)机制的具体握手流程是什么?后续课程是否会深入讲解?
  2. HTTP/3 全面普及后,PSK 如何与 QUIC 协议协同工作?
  3. 生产环境中,STEK 的轮换周期一般设置为多久较为合理?多机环境下如何同步 STEK?
  4. shared 模式下红黑树的组织结构细节、缓存淘汰策略如何实现?
  5. Session Ticket 的前向安全性如何保障?若 STEK 泄露,历史流量是否可被解密?
最近更新: 2026/6/23 17:18
Contributors: yangwenguang
Prev
课程笔记:升级 HTTP 协议到 HTTP/2
Next
课程笔记:OWASP 组织与十大 Web 安全漏洞