连接保持活跃但端点已死?


1

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

客户端正在安装Ubuntu 11.04。这已经发生在我身上几次,但我似乎无法理解为什么或如何解决它。


这个协议是什么?(直接通过TCP分层。指定发送字节的含义,发送者,何时等等。)
David Schwartz

Answers:


3

连接在一侧保持ESTABLISHED而在另一侧保持不存在,因为这是服务器重新启动后的状态。客户端不知道服务器重新启动,服务器不知道客户端认为它仍然连接。除非客户端尝试使用连接,否则它将永远保持这种状态。(除非启用了Keepalive,否则它通常会以这种方式保留两天左右。)

为什么客户端永远等待服务器?!客户端或协议都已损坏。如果客户端未遵循协议,则客户端将损坏。如果协议未指定如何检测死连接,则协议将被破坏。

TCP不会检测到未尝试发送数据的终端的死连接。因此,在TCP之上分层的每个协议都必须考虑到这一点。如果这种卡住的连接是不可接受的行为,那么这个协议就会被破坏,因为它允许这种不可接受的行为(或者客户端因为没有遵循协议而被破坏)。

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

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.