2016-09-30 65 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) –