元:
这实际上不是一个编程问题。它可能更适合安全性。SX广泛涵盖SSL/TLS,还有一些DTL,尽管我记得不是SCTP。
TLS假设并要求TCP提供的服务,即(单个)顺序八位字节流,其中数据按顺序传输,无丢失、重复或重新排序,除非连接失败,在这种情况下,数据传输完全可检测地停止。记录格式和完整性检查算法(HMAC或AEAD)依赖于此。如果您通过流A发送TLS的“有线”格式的一部分,通过流B发送另一部分,并且B上的部分在A上的部分之前到达,或者A已交付,但B丢失,反之亦然,TLS将丢失大量时间。
有两种可能的解决方案:
-
不要完全握手。
TLS(以及之前的SSL)包括会话
“恢复”
它使用双方缓存的前一次握手的结果(主要是协商的主秘密),通常有一个小时或一天的时间限制。这避免了通常代价高昂的公钥加密(密钥加密或协议和证书验证)以及可能耗时的带外证书检查(未标记的OCSP或CRL或替代方案)。它使用
“缩写”
只有1.5次交换的握手:ClientHello、ServerHello加上CCS和Finished、CCS和Finished,所有这些都很短,除了
可能地
克利恩塞洛。
rfc3436第8.2节、第8.3节和第8.4节中的示例使用(并暗示建议)了这一点。
有一种可选的会话恢复替代形式,使用不多,它在多对一(或多对少)的情况下减少了服务器的负载,在这种情况下,服务器不是实际缓存其关于会话的信息,而是向客户端提供
an encrypted/sealed 'ticket'
客户端发送回的。
-
使用DTL。
还存在变体协议,
数据报
TLS
rfc4347 matching TLS1.1
或
rfc6347 matching TLS1.2
其执行其自身的分段(仅握手)和序列编号。这并不需要比UDP更好的传输,也就是说,任何传递的数据报都对应于发送的数据报,但数据报可能丢失、重复或排序错误。因此,它将在SCTP上工作,尽管这两个协议级别都增加了测序的开销,但效率低下。