A conexão permanece ativa, mas o endpoint está morto?

A conexão permanece ativa, mas o endpoint está morto?

Alguém tem alguma ideia do que faria com que uma conexão TCP (lado do cliente) permanecesse no estado ESTABLISHED por cerca de 24 horas, mesmo que o servidor fosse reiniciado? O processo do cliente permanece no syscall recv e permanece assim sem causar erro!

O cliente está em uma instalação do Ubuntu 11.04. Isso já aconteceu comigo algumas vezes, mas não consigo entender por que ou como resolver.

Responder1

A conexão permanece ESTABELECIDA de um lado e inexistente do outro porque esse é o estado em que estava após a reinicialização do servidor. O cliente não tem ideia de que o servidor foi reiniciado e o servidor não tem ideia de que o cliente pensa que ainda está conectado. A menos que o cliente tente usar a conexão, ela permanecerá assim para sempre. (A menos que os keepalives estejam habilitados; nesse caso, permanecerá assim por cerca de dois dias.)

Por que o cliente fica esperando eternamente pelo servidor?! O cliente ou o protocolo está quebrado. Se o cliente não estiver seguindo o protocolo, o cliente está quebrado. Se o protocolo não especificar como detectar uma conexão inoperante, o protocolo será quebrado.

O TCP não detecta uma conexão inoperante para uma extremidade que não está tentando enviar dados. Portanto, cada protocolo colocado em cima do TCPdeveser projetado para levar isso em conta. Se esta conexão travada não for um comportamento aceitável, então este protocolo será quebrado porque permite esse comportamento inaceitável (ou o cliente será quebrado por não seguir o protocolo).

A especificação do protocolo realmente diz para esperarpara semprepara dados? Nesse caso, questionaria a sanidade dos desenvolvedores do protocolo.

informação relacionada