在 Debian 机器上,我有几个连接挂起大约 8 个小时:
tcp6 0 0 192.168.1.35:56312 88.191.79.XXX:25 ESTABLISHED
tcp6 0 0 192.168.1.35:43352 88.191.79.XXX:25 ESTABLISHED
tcp6 0 0 192.168.1.35:56300 88.191.79.XXX:25 ESTABLISHED
tcp6 0 0 192.168.1.35:43350 88.191.79.XXX:25 ESTABLISHED
所有连接都指向位于不同网络中的同一远程邮件服务器。远程计算机实际上看不到这些连接。Tcpdump 也没有显示任何活动。
客户端是 Java 应用程序,在套接字读取中有 4 个线程被阻止:
"MessageFeedbackQueueProc-Worker-202" prio=10 tid=0x00007f9c552f1800 nid=0x53d5 runnable [0x0000000043fb6000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
所有这些连接都是在很短的时间内发生的,在此之前和之后一切都运行正常。
有趣的是,在相同的时间段内,另一台装有相同 Java 应用程序的 Windows 计算机上也发生了相同的情况。在这种情况下,它禁用了应用程序处理新请求,因为所有线程都被套接字读取阻塞(尽管远程端点已死,但从未发生超时)。另一件奇怪的事情是:两台计算机上的所有线程都在完全相同的 SMTP 命令(MAIL FROM)之后被阻塞,但时间点不同。
为什么会发生这种情况以及为什么这些连接不会超时?
答案1
当连接在防火墙处终止时,我见过类似的情况。两个端点都看不到 FIN 或 RST,因此从它们的角度来看,会话仍然处于活动状态并处于已建立状态。您是否可以查看两端的防火墙日志以查看连接是否在任一端终止?
如果空闲会话超时期限到期时没有数据穿过连接,那么它也可能是任一端防火墙上的空闲会话超时设置。