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


  接收到的数据被解密,验证,解压缩,重新组合,
  然后交付给更高级别的客户。


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

struct {
    ContentType type;
    ProtocolVersion version;
    uint16 length;
    opaque fragment[TLSPlaintext.length];
} TLSPlaintext;


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


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


我希望在记录协议标题中看到完整的长度。 Google对此几乎没有给出任何结果,这让我感到我缺少明显的东西...

最佳答案

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

规范本身的内容如下:


  客户
     消息边界未保留在记录层中(即,
     可以合并多个相同ContentType的客户端消息
     成单个TLSPlaintext记录,或者单个消息可能是
     分散在几条记录中)。


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

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

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

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



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

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

10-08 06:34
查看更多