2016-09-30 139 views
3

沒有可使用Java實現SSLNIO (SocketChannel and SSLEngine),不使用框架,如網狀等線程安全與SSL + NIO

我想拿出一個SSL實現,它可以工作了一些有用的信息與blocking/non阻止頻道,並得到了一些基本qns

當appData和Net緩衝區被操縱時,關於線程安全性的問題沒有太多的信息。每SSLEngine文檔,

「有兩個併發問題需要注意的:

wrap()unwrap()方法可以互相併發執行SSL/TLS協議使用有序分組應用程序必須。請注意確保生成的數據包按順序傳送,如果數據包無序到達,可能會發生意外或致命結果。「

這是否適用於阻塞和非阻塞?有人可以解釋。謝謝。

此外,建立初始緩衝區大小的一般建議似乎基於(session.getApplicationBufferSize()/getPacketBufferSize()),這些值將如何設置?這些更好用來代替32k左右的標準緩衝區大小嗎?

回答

1
  1. 您通常不會在多個線程中執行SSLEngine操作,因此不應出現問題。唯一一次使用另一個線程是在執行SSLEngine任務時,並且不使用SSLEngine

這是否適用於阻塞和非阻塞?

  1. 是的,當然。

設立初始緩衝大小一般建議似乎基於的(session.getApplicationBufferSize()/getPacketBufferSize()),如何將這些值來設置?

  • 設置你的網絡緩衝區大小來getPacketBufferSize(),和你的應用程序的緩衝區來getApplicationBufferSize()
  • 這些是好是用來代替一些32K左右的標準緩衝區大小?

    1. 如果您願意,您可以使用不同的緩衝區大小,但爲什麼?您可能會面臨浪費太大空間的緩衝區或提供的緩衝區太小而無法使用的風險。
    +0

    謝謝@EJP。像往常一樣,你對這個話題的評論是非常有幫助的。你可以請。詳細說明了上面提到的可能的併發問題,正如通常我沒有看到的那樣,這些問題被明確處理: 「wrap()和unwrap()方法可能彼此併發執行 SSL/TLS協議使用有序的數據包。必須注意確保生成的數據包按順序發送,如果數據包無序到達,可能會發生意外或致命結果。「這應該在客戶端實例化SSLEngine中明確處理? –

    +0

    '可以同時執行'意味着*你*可以同時執行它們。如果您只使用一個線程,這是NIO的全部要點,那麼不需要處理任何數據包序列問題。 – EJP

    +0

    Final澄清請(希望),再次來自SSLEngine文檔:「通過從I/O傳輸機制中分離SSL/TLS抽象,SSLEngine可用於各種I/O類型,例如非阻塞I/O(輪詢),可選擇的非阻塞I/O,Socket和傳統的Input/OutputStreams,本地ByteBuffers或者字節數組..「這是否意味着SSLEngine可以用於NIO以外的傳輸,也就是常規套接字? Was SSLSocket被用於SSL,使用基於常規套接字的阻塞IO和用於NIO的SSLEngine(阻塞IO) –