java - 带有 https 的 tomcat 在直接 TCP 连接时获得 CLOSE_WAIT

标签 java sockets tomcat tcp

我使用 tomcat 8.5.4 在端口 443 上构建一个基于 https 的服务器,如下所示:

 94     <Connector
 95            protocol="org.apache.coyote.http11.Http11NioProtocol"
 96            port="8000" maxThreads="200"
 97            scheme="https" secure="true" SSLEnabled="true"
 98            keystoreFile="conf/rs_keystore.jks" keystorePass="ntsdawn"
 99            clientAuth="false" sslProtocol="TLS"/>

但是一个client使用tcp去连接8000端口,然后很快就关闭了tcp连接。在此之后,在我的服务器中,连接处于 CLOSE_WAIT 状态,更重要的是,CPU 增长并且 org.apache.tomcat.util.net.TLSClientHelloExtractor 对象被 gc 触发器快速创建:

root@nts32:/home/vcloud/apache-tomcat-8.5.4/logs# jmap -histo 14 | head

 num     #instances         #bytes  class name
----------------------------------------------
   1:       5159655      165108960  java.util.HashMap$Node
   2:          9138      131509512  [I
   3:       5148446      123562704  java.util.ArrayList
   4:       5145501      123492024  java.util.concurrent.LinkedBlockingQueue$Node
   5:       5145486      123491664  org.apache.tomcat.util.net.**TLSClientHelloExtractor**
   6:       3210008      102720256  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
   7:       2162508       86500320  java.util.HashMap$KeyIterator

并且连接将永远保持在 CLOSE_WAIT....

但是,如果我像这样修改 server.xml 使用 http 而不是 https:

 70     <Connector port="8000" protocol="org.apache.coyote.http11.Http11NioProtocol"
 71                connectionTimeout="20000"
 72                redirectPort="8443" />

然后一切就OK了。 TCP 连接来了,我的服务器将在客户端发送 FIN 时回复 FIN。

是不是我的https配置有问题?

最佳答案

tomcat 8.5.4 中存在一个错误,当套接字连接在 TLS 握手完成之前断开时,TLS 连接会进入循环。升级到 tomcat 8.5.5 或更高版本 应该可以解决这个问题。

下面是错误

https://bz.apache.org/bugzilla/show_bug.cgi?id=60035

关于java - 带有 https 的 tomcat 在直接 TCP 连接时获得 CLOSE_WAIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39718556/

相关文章:

c - 为 winsock recvfrom 设置超时

java - Servlet 过滤器 - 上下文初始化

java - String(byte[]) 是否创建字节数组的深拷贝?

python套接字对象接受超时

java - 在 Grails 中,如何获取语言环境的 messages.properties ConfigObject?

Java套接字读取无限阻塞

java - Pentaho : status 404 error on CentOS

java - 如何接受来自客户的许多请求

java - "Integer too large"用于小的编译时间常量

java - 替换由 JSONArray 组成的 JSON 对象中的所有键