同一数据包中有 2 个 TLS 记录层

同一数据包中有 2 个 TLS 记录层

我正在分析来自智能摄像头的一些数据包,发现单个 IP 数据包包含 2 条 TLS 记录如图所示

我认为一个IP数据包只能包含一个数据段。

有人能向我解释一下为什么会这样吗?

答案1

TCP 是一种字节流协议。上层(例如但不限于 TLS)作为单个单元提供的数据可以作为(使用多个数据包的多个段)发送,而来自上层的多个数据单元可以在一个段/数据包中发送。这就是为什么 TLS 记录层标头包含记录中的字节数(在固定长度的 5 字节标头之后),这样接收方就知道一个记录在哪里结束,以及是否必须读取更多数据来完成一个记录,或者构成另一个记录的更多数据是否已经可用。

如果您捕获并查看设置此会话的(完整)握手,您可能会看到另一种情况;正如 BillThor 提到的,TLS 服务器通常使用由多个证书组成的证书链 - 尽管像相机这样的 IoT 设备可能是一个例外,并且可能会固定私有或中间 CA,而不是使用公开信任的证书 - 并且每个证书通常约为 1k 或更多,因此完整链,加上服务器首次飞行的其余部分(如 ServerKX 和 CertReq)的一小部分,通常比 PMTU 还要多,因此必须作为多个数据包发送。在这种情况下,Wireshark 将显示一个或多个数据包,后面跟着[TCP segment of reassembled PDU]一个数据包,该数据包除了自己的数据外,还将显示和解码数据包组中的组合(重新组装)数据。

许多其他基于 TCP 构建的协议和应用程序必须解决同样的问题,并使用各种方法。有些使用计数。有些使用分隔符,例如 SMTP 传输电子邮件的内容,内容可能为 GB,需要许多数据包,直到一行(由 CRLF 分隔)仅由句点 (.) 组成。有些同时使用两者:HTTP/1.1 可以通过一个连接发送多个请求和响应;每个标头块都是第一行之后的 822 格式的文本,并由空行(两个连续的 CRLF)分隔,而主体(如果存在)通常由标头块中的 Content-length 标头或分布在数据中的一系列块标头指定,每个块标头包含一个计数部分数据。当然,有些应用程序,比如古老的 TELNET,只是传输一系列字节,根本不提供有意义的记录。

注意 TLS(以及之前的 SSL)同样被定义为流协议,以提供替代传输,以便设计为通过 TCP 运行的应用程序或协议(如 HTTP)可以通过 SSL-now-TLS 运行,并获得安全性,而无需或只需很少的更改。尽管 TLS 确实在内部以应用程序数据记录的形式传输数据,但这些数据具有最大限度大小为 2^14 (16384) 字节,因此不要求发送方提供的数据块成为一个 TLS 数据记录,也不要求将一个 TLS 数据记录作为一个数据块传送给接收方。

就你的情况而言,连接正在使用TLS1.0。你没有展示或描述建立它的握手,但我猜它不是使用 RC4(或者更确切地说,包含 RC4 的密码套件),该密码套件已被攻击大大削弱,现在通常被禁止使用,包括 TLS。因此它必须使用一些加拿大广播公司密码套件(在 SSL3 到 TLS1.1 中,这些是唯一的替代方案),我猜它又是 AES-CBC 密码套件。TLS1.0(和 SSL3)受到选择明文攻击,称为 BEAST这导致大多数 TLS1.0 实现进行“1/n 分割”(又称碎片化)-- 当发送方提供数据块(超过 1 个字节)时,TLS 堆栈实际上只将第一个字节的数据作为一个应用程序数据记录发送(对于具有 HMAC-SHA1 的 AES-CBC 套件,该记录将被 HMAC 化、填充并加密为 32 字节记录),并将剩余数据(在您的情况下最多为 27 个字节)作为另一个应用程序数据记录(或多个,具体取决于长度)。由于 TLS 堆栈已准备好同时发送这两个记录,并且它们都(轻松)适合一个 TCP 段,因此它们大概作为一个段=数据包发送——但它们不必这样做。当然,对 BEAST 的一个更简单的修复方法是完全禁止 TLS1.0,在 BEAST 发布 8 年后,随着 TLS1.3 的发布和部署,许多人都这样做了。

其他堆栈上的近乎重复:
https://crypto.stackexchange.com/questions/41709/weird-size-of-data-transmitted-in-sslv3
https://crypto.stackexchange.com/questions/14349/do-both-client-and-server-need-to-implement-openssl-protections-to-protect-from
https://stackoverflow.com/questions/33357924/mysterious-byte-after-tls-package
https://stackoverflow.com/questions/13528021/java-ssl-streaming-splitted-applicationdata/
https://stackoverflow.com/questions/15224909/jsse-wrap-creates-two-tls-packets-requiring-two-unwraps-why/

相关内容