TLS 记录协议如何重组接收到的数据?

kej*_*arn 5 ssl cryptography protocols tls1.2

我找不到有关 TLS 记录协议如何重组接收到的数据的详细信息。在 RFC 5246 中:

接收到的数据被解密、验证、解压缩、重组,然后传送给更高级别的客户端。

但如何呢?记录层数据如下所示:

struct {
    ContentType type;
    ProtocolVersion version;
    uint16 length;
    opaque fragment[TLSPlaintext.length];
} TLSPlaintext;
Run Code Online (Sandbox Code Playgroud)

长度字段只是片段的长度:

以下 TLSPlaintext.fragment 的长度(以字节为单位)

我希望在记录协议标头中看到完整的长度。谷歌几乎没有给出任何结果,这让我觉得我错过了一些明显的东西......

Maa*_*wes 2

TLS 在流上执行,这些流中的数据被放入一个或多个片段(最大 2^14 字节)中。这称为碎片化。

规范本身的内容如下:

记录层中不保留客户端消息边界(即,同一 ContentType 的多个客户端消息可以合并为单个 TLSPlaintext 记录,或者单个消息可以跨多个记录分段)。

这与将它们放入流中,然后再次将流分成单独的片段相同。

如果您通过 TLS 接收数据,则必须从单独的片段重新创建该流。因此,发生的“重组”是将片段简单地串联成流。

套接字包含输出和输入流。输出流需要分段,输入流需要重新组装。

没有什么神奇的事情发生,这可能就是为什么你找不到太多东西的原因。


然而,应用程序层通常会被给予 TLS 层一个相对较低级别的接口,这将允许它包装或发送自己的片段。例如,IBM 的这个 API表明它允许用户包装和发送或接收和解开每条消息本身。在这种情况下,库的用户需要处理任何消息碎片/重组。

由于 TLS 未指定分段/组装的实际方法,因此应将其视为特定于实现的方法。