当BIO是内存BIO而不是套接字BIO时,我对BIO例程BIO_read()/ BIO_write()和SSL_read()/ SSL_write()之间的区别感到困惑。
我正在尝试使用libnice为ICE堆栈编写WebRTC服务器,并为DTLS堆栈编写openssl。 ICE堆栈具有到客户端的套接字连接,因此我无法在openssl中使用基于套接字的BIO。相反,我正在使用内存BIO。
所以我使用的高级过程是,当我从ICE套接字上的客户端收到DTLS消息时,我使用BIO_write()将该消息写入DTLS堆栈。然后,当DTLS堆栈有一条要发送到客户端的消息时,我使用BIO_read()获取该消息,并使用ICE套接字将其发送到客户端。
我已经看到了一些基本上执行此过程的源代码示例,但是在BIO_write()调用之后它们也调用了SSL_read()例程。这对我来说毫无意义。在我基本上使用BIO_write()调用将客户端消息写入DTLS堆栈之后,为什么需要调用SSL_read()?如果我在BIO_write()之后没有调用SSL_read(),那么我的代码不起作用。但是当我在BIO_write()之后调用SSL_read()时,这确实是与浏览器客户端交换握手消息。
问题:使用内存BIO,BIO_read()和SSL_read()之间有什么区别; 问题:使用内存BIO,BIO_write()和SSL_write()之间有什么区别? 问题:默认内存是BIO阻塞还是非阻塞?我假设它是非阻塞的,因为它是基于内存的BIO而不是基于套接字的BIO。
谢谢, -Andres
答案 0 :(得分:8)
我偶然发现同样的问题,理解整个事情是如何运作的。我可以为您提供一些有用的链接和引用。
" SSL层设置为在缓冲模式下工作。因此,执行SSL_write意味着我们将未加密的字节发送到SSL库,以便它可以加密这些字节并将生成的加密字节放在缓冲区中。然后我们使用BIO_read从缓冲区读取。阅读也是相反的。在这种情况下,我们实际上会执行BIO_write然后执行SSL_read。"
来源: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/
BIO - 从下面的链接中查看此部分。它可能会为您提供一些有用的信息。 http://www.roxlu.com/2014/042/using-openssl-with-memory-bios