4. The "record_size_limit" Extension ("record_size_limit" 扩展)
4. The "record_size_limit" Extension ("record_size_limit" 扩展)
record_size_limit 扩展的 ExtensionData (扩展数据) 为 RecordSizeLimit:
uint16 RecordSizeLimit;
RecordSizeLimit 的取值表示端点愿意接收的记录最大大小, 以字节 (octet) 计. 该值用于限制在将应用数据与受保护握手消息编码为记录时所生成记录的大小.
当协商了 record_size_limit 扩展时, 端点绝对不能生成明文大于其从对端收到的 RecordSizeLimit 取值的受保护记录. 不受保护的消息不受此限制.
该值为受保护记录明文的长度. 该值包含 TLS 1.3 中添加的内容类型与填充 (即 TLSInnerPlaintext 的完整长度). 在 TLS 1.2 及更早版本中, 该限制涵盖进入压缩与加密的所有输入 (即最终产生 TLSCiphertext.fragment 的数据). 作为加密一部分添加的填充 (例如分组密码添加的填充) 不计入此计数 (见第 4.1 节).
支持所有记录尺寸的端点可以包含最高至协议定义的最大记录大小上限以内的任意限制. 对于 TLS 1.2 及更早版本, 该上限为 2^14 字节. TLS 1.3 使用 2^14+1 字节的上限. 更高的取值目前保留给可能允许更大记录的协议未来版本, 除非此类未来版本或扩展明确允许, 否则端点绝对不能发送高于协议定义的最大记录大小的值. 服务器不得强制执行此限制, 客户端可能通告服务器不理解之扩展或版本所启用的更高上限. 若 record_size_limit 扩展包含的值大于协商的协议版本与扩展所允许的最大记录大小, 客户端可以中止握手并发出 illegal_parameter 警报.
即使对端提供了更大的记录大小限制, 端点也绝对不能发送大于协议定义上限的记录, 除非未来 TLS 版本或扩展明确允许.
记录大小限制仅适用于发往通告该限制的端点的记录. 端点可以发送大于其自身通告限制的记录. 收到大于其通告限制的记录的 TLS 端点必须生成致命 record_overflow 警报, 收到大于其通告限制的记录的 DTLS 端点可以生成致命 record_overflow 警报或丢弃该记录.
即使不需要限制记录大小, 端点也应该通告 record_size_limit 扩展. 对客户端而言, 这使服务器可以酌情通告限制. 对服务器而言, 这使客户端能够知晓其限制将得到尊重. 若未协商此扩展, 端点可以发送协议或其他已协商扩展所允许任意大小的记录.
端点绝对不能发送取值小于 64 的 record_size_limit 扩展. 端点必须将收到更小取值视为致命错误并生成 illegal_parameter 警报.
在 TLS 1.3 中, 服务器在 EncryptedExtensions (加密扩展) 消息中发送 record_size_limit 扩展.
在重新协商 (renegotiation) 或恢复 (resumption) 期间, 会重新协商记录大小限制. 记录受产生用于保护这些记录之密钥的握手中设定的限制约束. 这带来一种可能, 即在重新协商或恢复连接时未必会协商该扩展.
DTLS 中的 Path Maximum Transmission Unit (路径最大传输单元, PMTU) 也会限制记录大小. 记录大小限制不影响 PMTU 发现, 应该独立设置. 记录大小限制在握手期间固定, 因此应基于端点处的约束而非当前网络环境设置. 相比之下, PMTU 由网络路径决定, 可随时间动态变化. 有关 PMTU 发现的更多细节见 [PMTU] 与 [DTLS] 第 4.1.1.1 节.
PMTU 约束 UDP 数据报的大小, 从而限制记录大小, 但并不阻止记录更小. 发送小记录的端点仍可在单个 UDP 数据报中发送多条记录.