调试“堵塞”的TCP连接


3

我有一个互联网连接的麻烦,似乎随机“冻结”任意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秒。之后没有捕获任何活动。

有没有人建议我如何进一步调试这个以找出问题所在以及如何解决?

另外和/或作为临时解决方法:是否有一些方法可以全局减少客户端和/或服务器上的超时,以减少本地应用程序中止之前的时间?

Answers:


1

debian-user线程总结:

这些症状与位于客户端和服务器之间的某些NAT设备以及300秒后丢弃空闲连接的情况一致。

链中某处必须有NAT设备,因为客户端对其IP地址(192.168.0.10)的想法与服务器用于向客户端发送数据的想法(68.5.174.98)不同。此外,192.168.xy网络保留供本地使用。

解决方法是启用TCP保持活动状态。不幸的是,这需要在每个程序中单独配置(例如使用ServerAliveIntervalssh中的选项)。但是,在Linux下,libkeepalive库可用于LD_PRELOAD激活必要的套接字选项,即使对于通常不支持它的程序也是如此。

对我来说,更好的解决方案是用NetGear CMD31T电缆调制解调器和NetGear WGR614v9网关替换负责任的Cisco DPC3825电缆网关。前者也做NAT,但没有这么短暂的超时。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.