我有一个互联网连接的麻烦,似乎随机“冻结”任意tcp连接,当他们有一段时间没有使用。连接保持建立,但没有数据通过。
发生这种情况时,netstat仍然会ESTABLISHED
在本地计算机上显示连接状态:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 53 192.168.0.10:41129 173.255.235.238:143 ESTABLISHED 8219/gnutls-cli on (79.31/13/0)
..和远程服务器:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 0 173.255.235.238:143 68.5.174.98:41129 ESTABLISHED 5303/imapd off (0.00/0/0)
但是,似乎根本没有数据传输。如果我在本地和远程进程上运行strace,两者都只显示重复的select调用序列(当然使用不同的fds),例如
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
总体上互联网连接似乎没有受到影响,我仍然可以在同一台服务器上建立与同一服务的新连接而没有任何问题。但是,受影响的本地应用程序似乎没有意识到这个问题,只是挂起。
在本地端尝试传输大约10分钟后,远程端的连接从netstat消失(我无法捕获任何中间状态),但仍保留ESTABLISHED
在本地端。
最后,经过几分钟后,本地应用程序以超时方式中止,并从本地netstat输出中消失。
当我在客户端查看此连接的数据包捕获时,有一个长的(预期的)不活动时段似乎触发了问题,然后本地端尝试再次传输一些数据但从未收到ACK。相反,15次TCP重传出去了,间隔从0.3秒增加到120秒。之后没有捕获任何活动。
有没有人建议我如何进一步调试这个以找出问题所在以及如何解决?
另外和/或作为临时解决方法:是否有一些方法可以全局减少客户端和/或服务器上的超时,以减少本地应用程序中止之前的时间?