Tomcat 9中浏览器接收HTTP/1.1 payload后未关闭TCP连接的解决方法
问题:Tomcat 9升级后连接关闭延迟问题
背景
我们有一个部署在Tomcat 7上的Spring应用,未出现连接关闭延迟问题;将同一应用部署到升级后的Tomcat 9.0.59(配置相同)时出现异常。
不同场景的连接行为
- Tomcat 7 + 任意客户端(curl/Chrome等):HTTP/1.1响应体交付给客户端后,客户端会主动关闭连接。
- Tomcat 9 + curl客户端:行为与Tomcat 7场景一致,客户端主动关闭连接。
- Tomcat 9 + Google Chrome客户端:客户端不会主动关闭连接,经过Tomcat默认超时时间(20秒)后,服务器被迫关闭连接。
curl场景下的TCP状态捕获片段(最后一列为延迟)
[ /usr/share/bcc/tools]# ./tcpstates | grep "10.0.12.79" ffff9882b00aaaaa 0 swapper/2 10.14.40.x 8080 10.0.12.y 42312 SYN_RECV -> ESTABLISHED 0.016 ffff9882b00aaaaa 0 swapper/2 10.14.40.x 8080 10.0.12.y 42312 ESTABLISHED -> CLOSE_WAIT 3.238 ffff9882b00aaaaa 896675 java 10.14.40.x 8080 10.0.12.y 42312 CLOSE_WAIT -> LAST_ACK 0.687 ffff9882b00aaaaa 0 swapper/2 10.14.40.x 8080 10.0.12.y 42312 LAST_ACK -> CLOSE 0.157
Chrome场景下的TCP状态捕获片段
[ /usr/share/bcc/tools]# ./tcpstates | grep "10.0.125.97" ffff9882b00aaaaa 1462 java 10.14.40.x 8080 10.0.125.z 4286 SYN_RECV -> ESTABLISHED 0.009 ffff9882b00aaaaa 0 swapper/0 10.14.40.x 8080 10.0.125.z 4287 SYN_RECV -> ESTABLISHED 0.012 ffff9882b00aaaaa 896675 java 10.14.40.x 8080 10.0.125.z 4287 ESTABLISHED -> FIN_WAIT1 1271.089 ffff9882b00aaaaa 0 swapper/0 10.14.40.x 8080 10.0.125.z 4287 FIN_WAIT1 -> FIN_WAIT2 0.341 ffff9882b00aaaaa 0 swapper/0 10.14.40.x 8080 10.0.125.z 4287 FIN_WAIT2 -> CLOSE 0.004 ffff9882b00aaaaa 896675 java 10.14.40.x 8080 10.0.125.z 4286 ESTABLISHED -> FIN_WAIT1 1279.145 ffff9882b00aaaaa 1462 java 10.14.40.x 8080 10.0.125.z 4286 FIN_WAIT1 -> FIN_WAIT2 39.963 ffff9882b00aaaaa 1462 java 10.14.40.x 8080 10.0.125.z 4286 FIN_WAIT2 -> CLOSE 0.006 ffff9882b00aaaaa 0 swapper/0 10.14.40.x 8080 10.0.125.97 4288 SYN_RECV -> ESTABLISHED 0.009 ffff9882b00aaaaa 896675 java 10.14.40.x 8080 10.0.125.97 4288 ESTABLISHED -> FIN_WAIT1 1281.720 ffff9882b00aaaaa 0 swapper/0 10.14.40.x 8080 10.0.125.97 4288 FIN_WAIT1 -> FIN_WAIT2 40.297 ffff9882b00aaaaa 0 swapper/0 10.14.40.x 8080 10.0.125.97 4288 FIN_WAIT2 -> CLOSE 0.005
关键排查发现
Tomcat 9会在响应头中发送Connection头,而Tomcat 7不会。从TCP状态变化可以看出:
- curl客户端主动关闭连接时,服务器快速从
ESTABLISHED转为CLOSE_WAIT状态; - 服务器主动关闭连接时,从
ESTABLISHED转为FIN_WAIT1状态需要约21秒(对应Tomcat默认超时时间)。
提问
如何解决该延迟问题,或强制浏览器客户端主动关闭连接?
内容的提问来源于stack exchange,提问作者Colin D'souza
相关产品推荐
相关产品推荐

