A conexão permanece viva, mas o ponto final está morto?

1

Alguém tem uma idéia do que poderia fazer com que uma conexão TCP (cliente) permanecesse no estado ESTABLISHED por aproximadamente 24 horas, mesmo que o servidor tenha sido reiniciado? O processo do cliente permanece no syscall de registro e permanece assim sem causar um 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 resolvê-lo.

    
por Reed 01.05.2012 / 13:22

1 resposta

3

A conexão permanece ESTABLISHED em um lado e inexistente no outro, porque esse é o estado em que estava depois que o servidor foi reiniciado. O cliente não tem idéia de que o servidor foi reiniciado e o servidor não tem idéia de que o cliente acha que ainda está conectado. A menos que o cliente tente usar a conexão, ela continuará assim para sempre. (A menos que os keepalives estejam habilitados, caso em que permanecerá assim por cerca de dois dias).

Por que o cliente está sempre esperando pelo servidor ?! O cliente ou o protocolo está quebrado. Se o cliente não está seguindo o protocolo, o cliente está quebrado. Se o protocolo não especificar como detectar uma conexão inativa, o protocolo está quebrado.

O TCP não detecta uma conexão inativa para um terminal que não está tentando enviar dados. Assim, todo protocolo colocado em cima do TCP deve ser projetado para levar isso em conta. Se essa conexão travada não for um comportamento aceitável, esse protocolo será interrompido porque permite esse comportamento inaceitável (ou o cliente é interrompido por não seguir o protocolo).

A especificação do protocolo realmente diz para esperar para sempre por dados? Em caso afirmativo, questionaria a sanidade dos desenvolvedores do protocolo.

    
por 01.05.2012 / 13:55