握手异常和连接拒绝异常之间的区别

时间:2018-05-08 16:32:24

标签: java ssl jetty client-server

我使用的线程池超过50的Jetty服务器每天提供大约200个加密请求。当请求数量突然激增时,某些请求会以

失败
    Caused by: javax.net.ssl.SSLException: Handshake did not complete within 10000ms
 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[?:1.8.0_131]
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[?:1.8.0_131]

 Caused by: java.net.ConnectException: Connection refused: <hostname>/IP
at org.jboss.netty.handler.ssl.SslHandler$1.run(SslHandler.java:372) ~[netty-3.10.6.Final.jar:?]
        at org.jboss.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:556) ~[netty-3.10.6.Final.jar:?]

有人可以帮我理解这两个错误之间的区别吗?如何纠正?

1 个答案:

答案 0 :(得分:1)

“拒绝连接”表示客户端无法创建与服务器的TCP连接,而“SSLException:Handshake未在...内完成”表示可以创建TCP连接,但服务器未在给定时间(10s)内完成SSL握手。 TCP握手由操作系统内核完成,但在应用程序内部完成TLS握手时,最多只能达到服务器应用程序尚未处理的特定数量的未完成连接(侦听队列的大小)。

鉴于只有在请求数量激增时才会出现问题,这意味着您的系统无法处理此峰值,即它已超载。这可能是因为您的系统速度不够快(CPU),内存太少(即超出峰值并需要交换到磁盘)或者每个请求的执行量太高。如果每个线程都做了很多工作,那么你在spike中获得的请求数量可能会超过可用线程数量。

要解决这个问题,您需要找出这些问题的真正原因并相应地调整您的系统,即使用更快的CPU,更多的内存,为每个请求做更少的工作或使用更多的线程。