Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SSL+的线程安全性;尼奥_Java_Sockets_Ssl_Nio - Fatal编程技术网

Java 使用SSL+的线程安全性;尼奥

Java 使用SSL+的线程安全性;尼奥,java,sockets,ssl,nio,Java,Sockets,Ssl,Nio,关于使用NIO(SocketChannel和SSLEngine)实现SSL有一些有用的信息,使用java,而不是使用netty等框架 我正在尝试提出一个SSL实现,它可以与阻塞/非阻塞通道一起工作,并获得一些基本的qn 在操作appData和Net缓冲区时,没有太多关于线程安全问题的信息。根据SSLEngine的文档 “需要注意两个并发问题: wrap()和unwrap()方法可以彼此并行执行 SSL/TLS协议采用有序数据包。应用程序必须注意确保生成的数据包按顺序传递。如果数据包到达时顺序不正

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

我正在尝试提出一个
SSL
实现,它可以与
阻塞/非阻塞通道一起工作,并获得一些基本的
qn

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

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

wrap()
unwrap()
方法可以彼此并行执行

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

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

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

  • 您通常不会在多个线程中执行
    SSLEngine
    操作,因此不应该出现问题。您只会在执行
    SSLEngine
    任务时使用另一个线程,而这不会使用
    SSLEngine
  • 这是否适用于阻塞和非阻塞

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

  • 将网络缓冲区大小设置为
    getPacketBufferSize()
    ,将应用程序缓冲区大小设置为
    getApplicationBufferSize()
  • 使用这些缓冲区是否比使用32k左右的标准缓冲区大小更好

  • 如果愿意,可以使用不同的缓冲区大小,但为什么?您可能会因为缓冲区太大而浪费空间,或者提供的缓冲区太小而无法使用

  • 谢谢@EJP。像往常一样,你对这个话题的评论非常有帮助。你能帮我吗。详细说明所提到的可能的并发性问题,通常我看不到,这些问题是显式处理的:“wrap()和unwrap()方法可以彼此并行执行。SSL/TLS协议使用有序数据包。应用程序必须注意确保生成的数据包按顺序传递。如果数据包到达时顺序不正确,可能会出现意外或致命的结果。”如果在实例化SSLEngine的客户机中显式处理此问题,则“可以彼此并发执行”意味着您可以并发执行它们。如果您只使用一个线程,这是NIO的全部要点,那么就没有需要处理的数据包序列问题。最后,请再次澄清(希望)SSLEngine文档:“通过将SSL/TLS抽象与I/O传输机制分离,SSLEngine可以用于各种I/O类型,例如非阻塞I/O(轮询)、可选非阻塞I/O、套接字和传统的输入/输出流、本地字节缓冲区或字节数组……“这是否意味着SSLEngine可用于NIO以外的传输,即常规套接字?Wasnt SSLSocket用于SSL和基于常规套接字的阻塞IO,SSLEngine用于NIO(阻塞IO)@KrishnaMothukuri是的,您可以将
    SSLEngine
    用于普通
    套接字,但有一些困难。不过没什么意义。对我来说,
    SSLEngine
    设计有点逃避现实。他们可以提供一个
    SSLSocketChannel
    ,或者也可以。大多数不这样做的理由都站不住脚。