OpenSSL SSL_write 来自多个缓冲区 / SSL_writev

问题描述 投票:0回答:2

我编写了一个使用 OpenSSL 进行 SSL/TLS 的网络服务器。服务器发送和接收大数据块并在其间执行各种转换。出于性能原因,转换主要使用向量信息(请参阅 POSIX 中的 iovec)来完成,以避免昂贵的内存移动(memcpy() 等)。当数据准备好发送时,我使用 writev() POSIX 函数,该函数使用这些向量从内存中收集数据,并且通常将其作为一个网络数据包发送。

现在使用 OpenSSL,这并不完全可能,因为据我所知,OpenSSL 仅提供 SSL_write() 函数。这意味着我必须为每个要发送的向量条目调用此函数。不幸的是,它导致每个矢量数据块都在自己的 SSL 帧中传输,从而引入了不需要的和不必要的网络开销。

我的问题是:是否有 SSL_writev() 相当于 writev() ?或者一般来说,是否有一种技术可以告诉 OpenSSL 将 SSL_write() 数据存储到一个 SSL 应用程序记录(类型 22)中而不发送它(当然还有某种flush() 函数)?

编辑:如下所述,一种可行的方法是在最终的单个 SSL_write() 调用之前将矢量数据合并为一大块。然而,2 个副本会产生连接开销(第一个副本在合并期间,第二个副本在 SSL_write() 执行 AES 加密时)。 理论上的 SSL_writev() 调用不会引入这种开销。

c openssl posix
2个回答
0
投票

我的策略是使用 SSL 进行密钥交换,关闭 SSL 会话,然后在常规套接字上自己加密+发送内容。您仍然可以执行之前所做的所有操作(包括 SSL),但也可以准确选择加密数据的方式。

如果您拥有最新的硬件,那么您就有 x86 的 AES 指令。所以我个人会尝试一些内联和手动循环折叠,看看我能做到多疯狂。

还有,有人知道“回答7岁以上问题成瘾者”支持小组吗?


-1
投票

您可以使用

BIO_f_buffer()
来实现此目的。将网络层 BIO 包装在
BIO_f_buffer()
过滤器 BIO 中,并将其设置为 SSL 对象的写入 BIO。这将导致所有写出的数据保留在缓冲区中,直到您对其发出刷新。

© www.soinside.com 2019 - 2024. All rights reserved.