首页 文章

来自多个缓冲区/ SSL_writev的OpenSSL SSL_write

提问于
浏览
3

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

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

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

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

1 回答

  • 0

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

相关问题