【问题标题】:Thread Safety with SSL + NIOSSL + NIO 的线程安全
【发布时间】:2016-09-30 13:23:52
【问题描述】:

有一些有用的信息可用于使用 java 实现 SSLNIO (SocketChannel and SSLEngine),而不是使用诸如 netty 等框架。

我正在尝试提出一个SSL 实现,它可以与blocking/non 阻塞通道一起使用,并获得了一些基本的qns

在处理 appData 和 Net 缓冲区时,没有太多关于线程安全问题的信息。根据SSLEngine 的文档,

“有两个并发问题需要注意:

wrap()unwrap() 方法可以同时执行。

SSL/TLS 协议使用有序数据包。应用程序必须注意确保生成的数据包按顺序传递。如果数据包乱序到达,可能会出现意外或致命的结果。”

这是否适用于阻塞和非阻塞?有人可以解释一下。谢谢。

此外,设置初始缓冲区大小的一般建议似乎基于 (session.getApplicationBufferSize()/getPacketBufferSize()),如何设置这些值?这些是否更好地用于代替32k 左右的一些标准缓冲区大小?

【问题讨论】:

    标签: java sockets ssl nio


    【解决方案1】:
    1. 您通常不会在多个线程中执行SSLEngine 操作,因此不会出现问题。唯一一次使用另一个线程是在执行 SSLEngine 任务时,并且不使用 SSLEngine

    这是否适用于阻塞和非阻塞?

    1. 是的,当然。

    设置初始缓冲区大小的一般建议似乎基于(session.getApplicationBufferSize()/getPacketBufferSize()),如何设置这些值?

    1. 将您的网络缓冲区大小设置为getPacketBufferSize(),并将您的应用程序缓冲区大小设置为getApplicationBufferSize()

    用这些来代替 32k 左右的标准缓冲区大小会更好吗?

    1. 您可以根据需要使用不同的缓冲区大小,但为什么呢?您冒着使用太大的缓冲区浪费空间或提供太小而无法使用的缓冲区的风险。

    【讨论】:

    • 感谢@EJP。像往常一样,你们在这个话题上很有帮助。你能请。详细说明提到的可能的并发问题,正如我通常看不到的那样,这些被明确处理:“wrap() 和 unwrap() 方法可以彼此同时执行。SSL/TLS 协议使用有序数据包。应用程序必须注意确保生成的数据包按顺序传递。如果数据包乱序到达,可能会出现意外或致命的结果。这是否应该在实例化 SSLEngine 的客户端中明确处理?
    • '可能彼此同时执行'意味着可以同时执行它们。如果你只使用一个线程,这就是 NIO 的全部意义所在,就没有包序列问题需要处理。
    • 最终澄清(希望如此),再次来自 SSLEngine 文档:“通过将 SSL/TLS 抽象与 I/O 传输机制分离,SSLEngine 可用于各种 I/O类型,例如非阻塞 I/O(轮询)、可选择的非阻塞 I/O、Socket 和传统的 Input/OutputStreams、本地 ByteBuffers 或字节数组、..”这是否意味着 SSLEngine 可以用于传输其他比 NIO,即常规套接字?没有 SSLSocket 用于 SSL,具有基于常规套接字的阻塞 IO 和 SSLEngine 用于 NIO(阻塞 IO)
    • @KrishnaMothukuri 是的,您可以将SSLEngine 与普通的Sockets 一起使用,但有些困难。不过也没多大意义。对我来说,SSLEngine 的设计有点逃避现实。他们本可以提供SSLSocketChannel,或者也可以。大多数不这样做的理由都站不住脚。
    猜你喜欢
    • 2015-04-14
    • 2017-04-04
    • 2012-12-15
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多