TLS 会话复用与预生成密钥的零 RTT 方案
利用 TLS 会话 ID 和预生成主密钥,实现客户端与服务端之间的 0-RTT 连接,大幅降低握手延迟。 · 难度:入门 · +10XP
TLS 会话复用与预生成密钥的零 RTT 方案
标准的 TLS 1.3 支持 0-RTT 但需要之前建立过会话。本教程探索在 Node.js 中手动管理 TLS 会话缓存,通过 tls.createSecureContext 的 sessionIdContext 和 sessionTimeout 控制复用。更进一步,预生成 TLS 票据(session ticket)并将其嵌入客户端,实现全新连接也能使用预协商密钥,绕过完整握手。
const tls = require('tls');
const fs = require('fs');
const options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
sessionIdContext: 'myapp',
sessionTimeout: 300
};
const server = tls.createServer(options, (socket) => {
// 手动管理 session 缓存
socket.on('session', (session) => {
// 存储 session 到外部缓存
});
});
// 客户端复用 session
const client = tls.connect({
host: 'localhost',
port: 443,
session: cachedSession
});