连接保持活动但端点已死亡?

连接保持活动但端点已死亡?

有人知道什么会导致 TCP 连接(客户端)保持 ESTABLISHED 状态约 24 小时,即使服务器已重新启动?客户端进程停留在 recv 系统调用上,并且保持这种状态而不会导致错误!

客户端安装在 Ubuntu 11.04 上。这种情况已经发生过几次了,但我似乎不明白为什么或如何解决它。

答案1

连接在一侧保持 ESTABLISHED 状态,而在另一侧则为不存在状态,因为这是服务器重启后的状态。客户端不知道服务器重启了,服务器也不知道客户端认为它仍然处于连接状态。除非客户端尝试使用该连接,否则它将永远保持这种状态。(除非启用了 keepalive,在这种情况下它将保持这种状态通常大约两天。)

客户端为什么永远等待服务器?!客户端或协议有问题。如果客户端不遵循协议,则客户端有问题。如果协议没有指定如何检测死连接,则协议有问题。

TCP 不会检测未尝试发送数据的一端的死连接。因此,TCP 之上的每个协议必须应考虑到这一点。如果这种卡住的连接不是可接受的行为,则此协议已失效,因为它允许这种不可接受的行为(或客户端因不遵守协议而失效)。

协议规范真的说要等待吗永远数据?如果是这样,我会质疑该协议开发者的理智。

相关内容