当 BIO 是内存 BIO 而不是套接字 BIO 时,BIO_read/BIO_write 和 SSL_read/SSL_write 之间有什么区别?

2023-11-26

我对 BIO 例程之间的差异感到困惑BIO_read()/BIO_write()SSL_read()/SSL_write()当 BIO 是内存 BIO 而不是套接字 BIO 时。

我正在尝试使用以下代码编写 WebRTC 服务器libnice用于 ICE 堆栈,OpenSSL 用于 DTLS 堆栈。 ICE 堆栈具有与客户端的套接字连接,因此我无法在 OpenSSL 中使用基于套接字的 BIO。相反,我使用的是内存 BIO。

因此,我使用的高级程序是,当我在 ICE 套接字上收到来自客户端的 DTLS 消息时,我使用以下命令将该消息写入 DTLS 堆栈:BIO_write()。然后,当 DTLS 堆栈有消息要发送到客户端时,我使用以下命令获取该消息BIO_read()并使用 ICE 套接字将其发送到客户端。

我已经看到了一些基本上执行此过程的源代码示例,但它们也称为SSL_read()之后的常规BIO_write()称呼。这对我来说毫无意义。为什么打电话给SSL_read()在我基本上使用以下命令将客户端消息写入 DTLS 堆栈之后是必要的BIO_write()称呼?如果我不打电话SSL_read()之后BIO_write()我的代码不起作用。但当我打电话时SSL_read()之后BIO_write(),这确实是在与浏览器客户端交换握手消息。

Question: 使用内存BIO,有什么区别BIO_read() and SSL_read()?

Question: 使用内存BIO,有什么区别BIO_write() and SSL_write()?

Question:默认的内存BIO是阻塞的还是非阻塞的?我假设它是非阻塞的,因为它是基于内存的 BIO,而不是基于套接字的 BIO。

Thanks,
-Andres


我在理解整个事情如何运作时偶然发现了同样的问题。我可以为您提供一些有用的链接和引用。

"SSL 层设置为在缓冲模式下工作。因此,执行 SSL_write 意味着我们将未加密的字节发送到 SSL 库,以便它可以加密这些字节并将生成的加密字节放入缓冲区中。然后我们使用 BIO_read 从缓冲区读取。阅读时也同样如此。在这种情况下,我们实际上先执行 BIO_write,然后执行 SSL_read。"

Source: https://groups.google.com/forum/#!topic/grpc-io/8Ulf_G5kpyA

OpenSSL 数据处理- 从下面的链接检查这部分。它可能会给您一些有用的信息。https://famellee.wordpress.com/2013/02/20/use-openssl-with-io-completion-port-and-certificate-signing/

BIOs- 从下面的链接检查这部分。它可能会给您一些有用的信息。http://www.roxlu.com/2014/042/using-openssl-with-memory-bios

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 BIO 是内存 BIO 而不是套接字 BIO 时,BIO_read/BIO_write 和 SSL_read/SSL_write 之间有什么区别? 的相关文章

随机推荐