是否需要为SSLSocket重新设置原有Socket的参数?
问题解答
你不需要为新创建的SSLSocket实例重新设置那些TCP层面的Socket参数,你的判断是正确的,SSLSocket会复用底层普通Socket的参数配置,原因如下:
SSLSocket的包装特性
你使用SSLContext.getSocketFactory().createSocket(socket, config.host(), config.port(), true)创建SSLSocket的方式,本质是用SSL/TLS层包装已有的普通Socket。这个SSLSocket只是在原Socket之上添加了加密传输的逻辑,底层负责TCP通信的还是原来的Socket实例,因此原Socket的所有TCP参数都会被直接复用。参数的TCP层级属性
你设置的TcpNoDelay、SoTimeout、KeepAlive、收发缓冲区大小这些选项,都属于TCP协议层面的配置,是底层Socket的核心属性。包装后的SSLSocket不会修改这些属性,只会继承使用。验证方式
如果你需要确认,可以在创建SSLSocket并完成握手后,调用对应的get方法查看参数值:System.out.println(sslSocket.getTcpNoDelay()); // 会和原Socket的设置一致 System.out.println(sslSocket.getSoTimeout());
补充说明
如果是通过SSLSocketFactory.createSocket(host, port)这种方式直接创建全新的SSLSocket(而非包装现有Socket),那确实需要重新设置这些TCP参数,但你的场景属于包装已有配置好的Socket,因此无需重复操作。
内容的提问来源于stack exchange,提问作者Ivan Grishaev
相关产品推荐
相关产品推荐

