2016-07-22 25 views
2

當BIO是內存BIO而不是套接字BIO時,我對BIO例程BIO_read()/ BIO_write()和SSL_read()/ SSL_write()之間的區別感到困惑。當BIO是內存BIO而不是套接字BIO時,BIO_read/BIO_write和SSL_read/SSL_write有什麼區別?

我想編寫一個WebRTC服務器使用libnice爲ICE堆棧和openssl爲DTLS堆棧。 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

回答

5

我瞭解整個事情是如何工作的偶然發現了同樣的問題。我可以爲您提供一些有用的鏈接和引用。

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

+0

這些是非常有幫助的鏈接,謝謝。 –