首页/安全/加密与证书速查/TLS 记录层格式与分片
TLS 与 HTTPS60 条

TLS 记录层格式与分片

记录层把上层数据切成记录传输:每条约 5 字节头(内容类型、版本、长度)加上载荷;单条记录明文上限 16KB,应用数据会被拆成多条记录发送。

加密与证书速查安全更新于 2026-10-13

记录层是什么

TLS 记录层是协议的最外层封装:握手消息、告警与应用数据在这里统一切分成记录(record)传输。每条记录由 5 字节头加载荷组成,头里写明内容类型、兼容用的协议版本与载荷长度;明文的载荷上限为 2^14 字节即 16KB,加密后还要附加 AEAD 认证标签或填充,所以线缆上的记录可能更大。记录是 TLS 自己的分片单位,与 TCP 分段不是一一对应:一条 TCP 段里可能挤着多条记录,一条记录也可能跨多个 TCP 段。

基本信息

头部长度5 字节:content_type(1) + legacy_record_version(2) + length(2)
明文上限2^14 = 16384 字节
密文上限TLS 1.3 规定不超过 2^14 + 256 字节
内容类型change_cipher_spec(20)、alert(21)、handshake(22)、application_data(23)
关系一条 TCP 段可承载多条记录,记录与 TCP 包不一一对应

典型使用场景

  • 抓包排障:区分握手记录与应用数据记录,快速定位卡在握手的哪一步。
  • 性能调优:分析记录尺寸与数量对 MTU、往返次数的实际影响。
  • 中间设备排查:识别设备是否重新分片或拆改记录,导致两端观察不一致。
  • 容量规划:TLS 卸载与解密设备的吞吐按记录开销评估,而不是只看净荷带宽。
  • 旁路解密方案设计:明确记录边界才能正确重组被截获的会话。

观察记录行为

观察记录行为
openssl s_client -connect example.com:443 -servername example.com -msg </dev/null 2>&1 | head -10
# 抓包统计各内容类型记录条数
# tshark -r tls.pcap -Y 'tls' -T fields -e tls.record.content_type | sort | uniq -c
# 看应用数据记录长度分布,判断是否被中间设备重分片
# tshark -r tls.pcap -Y 'tls.record.content_type == 23' -T fields -e tls.record.length | sort -n | uniq -c | tail

记录头逐字段读法

字段常见取值含义与判断
content_type20/21/22/2320 为兼容用、21 告警、22 握手、23 应用数据
legacy_record_version0x0301 / 0x0303TLS 1.3 中固定填 0x0303,真实版本看 supported_versions
length最大 16384 以上超过 2^14 说明该记录是密文,或抓包解析有误
握手消息内长度3 字节握手消息可跨多条记录,需按此字段拼接
TLS 1.3 仍可能发送 change_cipher_spec 记录,纯粹为了兼容老中间设备;看到它不代表连接跑在 TLS 1.2。判断版本请看 ServerHello 的 supported_versions 扩展。
记录尺寸策略会影响延迟与吞吐:过大容易触发 IP 分片,过小则协议开销占比升高。TLS 1.3 允许在应用数据内填充,记录长度与明文长度的对应关系不再直接可见。

易错点

  • 把 TCP 包数量当作记录数量:存在合并与拆分,统计口径错了会得出错误的开销结论。
  • 看到 change_cipher_spec 就判定为 TLS 1.2:1.3 为兼容中间设备也会发送该记录,需查 supported_versions。
  • 按明文 16KB 上限估算吞吐:加密后的记录还要加认证标签与填充,实际线缆负载更大。
  • 忽略中间设备重分片:两端记录边界不一致会让基于记录的解密与统计方案失效。

数据来源与参考

  • RFC 5246 §6.2(记录层)
  • RFC 8446 §5(记录层)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌