【发布时间】:2014-01-10 21:53:24
【问题描述】:
我们的 suse linux 服务器上正在使用一个客户端服务器应用程序。
有时会发生,在客户端,tcp 套接字不知何故消失了,
在服务器端,套接字的另一端仍然存在。
一天结束时,当我们在 linux 服务器上停止后端时,后端会尝试关闭所有剩余的 tcp 连接,包括那些“僵尸”套接字。
(我用 strace 看这个)。
当后端试图关闭一个 tcp 连接时,客户端已经没有任何东西了,它会向目标发送一个 [FIN, ACK] 数据包。当然,什么也没有回来。
后端重复发送这个数据包。第一次它只等待百分之几秒来重复它,然后,它等待的时间越来越长。最后,它会等待几秒钟来重复它。但是,15 秒后,有一个超时,它继续结束另一个 tcp 连接。
现在,我不知道这 15 秒的超时是从哪里来的。我想改一下。
非常感谢您。
【问题讨论】:
-
我建议您修复您描述的两个错误,而不是可能引入更多新代码。 1. 套接字不只是“消失”。它们被关闭,或者它们从应用程序中泄漏。套接字泄漏是一个主要问题,必须加以解决。 2. TCP 应用程序总是可以通过一种或另一种方式检测对等方的断开连接。如果您的应用程序没有这样做,那就是错误的编写,必须再次修复。