SSL + NIO 的线程安全

Thread Safety with SSL + NIO

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

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

关于处理 appData 和 Net 缓冲区时线程安全问题的信息不多。根据 SSLEngine

的文档

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

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

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

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

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

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

Would this be applicable to both blocking and non blocking?

  1. 当然可以。

the general recommendation for setting up the initial buffer sizes seems to based of (session.getApplicationBufferSize()/getPacketBufferSize()), how would these values be set?

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

Are these better to be used instead of some standard buffer size of 32k or so?

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