发布于 2019-09-24 07:41:04
上层(例如,但不限于TLS)作为单个单元提供的TCP是一种字节流协议.数据可以作为(使用)多个分组(多个段)发送,来自上层的多个数据单元可以在一个段/分组中发送。这就是为什么TLS记录层报头包含记录中字节的计数(在固定长度的5字节头之后),因此接收方知道一个记录的结束位置,以及是否必须读取更多的数据才能完成记录,或者更多构成另一个记录的数据已经可用。
如果您捕获并查看设置此会话的(完全)握手,您可能会看到另一种情况;正如BillThor提到的那样,TLS服务器通常使用一个由多个证书组成的证书链--尽管像照相机这样的IoT设备可能是一个例外,并且可能是一个私有或中间CA,而不是使用公开信任的证书--而且每个证书通常大约是1k或更多,所以完整链,加上服务器第一次飞行(如ServerKX和CertReq )的其他部分,通常比PMTU更多,因此必须作为多个数据包发送。在这种情况下,Wireshark将将一个或多个数据包显示为[TCP segment of reassembled PDU],然后是一个数据包,该数据包除了自己的数据外,还将显示和解码来自分组的组合(重新组装)数据。
建立在TCP上的许多其他协议和应用程序必须解决同样的问题,并使用多种方法。一些使用数量。有些人使用分隔符,例如SMTP传输电子邮件的内容,这些内容可能是千兆字节,并接受许多数据包,直到一行(由CRLF分隔)仅由句点(.)组成。有些使用这两种方法: HTTP/1.1可以通过一个连接发送多个请求和响应;每个标头块在第一行之后是822类格式的文本,并由空行(两个CRLF连续行)分隔,而主体(当存在时)通常是由标题块中的内容长度标头指定的,或者是通过数据传播的一系列块标头,每个标头都包含部分数据的计数。当然,有些应用程序,比如古老的TELNET,只是传输一系列字节,根本不提供有意义的记录。
注TLS (和它之前的SSL )类似地被定义为流协议,以提供替代传输,以便设计用于TCP (如HTTP )的应用程序或协议可以在SSL上工作-现在-TLS,并获得安全,没有或很少改变。虽然TLS确实在内部以应用程序数据记录的形式传输数据,其最大大小为2^14 (16384)字节,但不要求发送方提供的数据块成为一个TLS数据记录或将一个TLS数据记录作为一个数据块传递给接收方。
在您的例子中,连接使用TLS1.0。您没有显示或描述建立它的握手,但是我猜它没有使用RC4 (或者更确切地说,一个包含RC4的加密套件),它已经被攻击大大削弱了,现在通常禁止所有的使用,包括TLS。所以,它肯定是在使用一些CBC密码套件(在SSL3中,通过TLS1.1,这些是唯一的替代方案),我想这也是一个AES-CBC密码套件。TLS1.0 (和SSL3)受制于一个选择-被称为野兽的明文攻击,它导致大多数TLS1.0实现进行'1/n拆分‘(也称为分段) --当发送方提供一个数据块(超过1个字节)时,TLS堆栈实际上只作为一个应用程序数据记录发送数据的第一个字节(对于一个带有HMAC-SHA1的AES-CBC套件,获得HMACed、添加并加密到32字节记录),其余数据(在您的情况下最多为27个字节)作为另一个应用程序数据记录(或几个取决于长度)。由于TLS堆栈已经准备好同时发送这两个记录,而且它们都很适合(很容易)放在一个TCP段中,所以它们可能被作为一个segment=packet发送--但它们不必发送。当然,野兽的一个更简单的解决方法就是完全禁止TLS1.0,在猛兽之后的8年内,TLS1.3现在已经发布并被部署了,很多人都这样做。
其他堆叠物上的硬皮:
https://crypto.stackexchange.com/questions/41709/weird-size-of-data-transmitted-in-sslv3
https://stackoverflow.com/questions/33357924/mysterious-byte-after-tls-package
https://stackoverflow.com/questions/13528021/java-ssl-streaming-splitted-applicationdata/
https://serverfault.com/questions/985346
复制相似问题