记录层是什么
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_type | 20/21/22/23 | 20 为兼容用、21 告警、22 握手、23 应用数据 |
| legacy_record_version | 0x0301 / 0x0303 | TLS 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 允许在应用数据内填充,记录长度与明文长度的对应关系不再直接可见。