JavaSSLSocket::startHandshake会导致异常延迟

JavaSSLSocket::startHandshake会导致异常延迟,java,c,sockets,ssl,network-programming,Java,C,Sockets,Ssl,Network Programming,我们有一个产品,客户端连接到服务器。客户端是用C实现的,使用OpenSSL,而服务器是用带有BufferedInputStream和BufferedOutputStream的Java代码实现的。以下是我的观察: 应用程序级数据传输非常慢,在建立连接期间存在过度延迟。 使用ssldump发现,来自服务器的SSL握手响应占用了大部分时间。其余的应用程序数据传输和处理几乎不需要几分之一秒。来自服务器的SSL握手的响应在客户端发送初始响应后2到13秒之间的任意位置出现。 随后对代码进行的分析表明,这是第

我们有一个产品,客户端连接到服务器。客户端是用C实现的,使用OpenSSL,而服务器是用带有BufferedInputStream和BufferedOutputStream的Java代码实现的。以下是我的观察:

应用程序级数据传输非常慢,在建立连接期间存在过度延迟。 使用ssldump发现,来自服务器的SSL握手响应占用了大部分时间。其余的应用程序数据传输和处理几乎不需要几分之一秒。来自服务器的SSL握手的响应在客户端发送初始响应后2到13秒之间的任意位置出现。 随后对代码进行的分析表明,这是第一个缓冲读/写操作,占用了过多的时间。 了解到第一个缓冲读/写在SSL连接完成时挂起,我引入了SSLConnect::startHandshake,以便明确地看到问题出在哪里。据观察,现在startHandshake的阻塞时间与第一次读/写的时间一样长。此外,没有任何读/写调用阻塞,并且几乎立即返回数据。 我想知道为什么Startandshake要花这么长时间。我知道这是一个异步调用,但在我看来时间延迟太大了。这与所使用的套接字配置/密码/加密有关吗?使用ssldump,我发现在发送客户机的hello请求和服务器的后续响应之间绝对没有数据传输,所以很明显starthanke一直在忙着做一些事情,或者可能什么都没有——我不知道。FWIW,这不是一个网络延迟问题,1所有的盒子都在同一个网络上,2所有其他数据传输的总和不到0.4秒


有没有人能建议出什么问题,或者可以采取什么措施来解决这个问题?可能是套接字或SSL设置、使用的加密/密码还是其他什么?

发布一些相关的Java代码。NB startHandshake是一个同步调用,如果您在完成任何I/O之前调用它。