É possível que uma conexão TCP permaneça aberta quando o cliente foi desconectado?

12

Temos uma aplicação de servidor que enfrenta problemas de exaustão do TCP em cerca de 4000 conexões. Isso ocorrerá a cada 3 ou 4 semanas (aproximadamente). O fornecedor, que criou este aplicativo de servidor, nos informa, após examinar a saída do netstat -b, que algumas conexões permanecem abertas, mesmo que os clientes tenham caído.

Recebi a tarefa de investigar por que um determinado aplicativo cliente não está fechando a conexão TCP corretamente. Acredito que, se um computador cliente for desligado, ele não poderá reportar POSSIVELMENTE a partir do servidor que uma conexão TCP ainda está estabelecida com esse cliente. Infelizmente, não consigo encontrar nenhuma informação para validar minha opinião. Eu não quero perder mais tempo investigando um problema em potencial que eu não acho que possa ser um problema.

tldr;

Um servidor pode reportar uma conexão estabelecida com um computador que está desativado?

    
por Josh Smeaton 07.12.2011 / 02:18

3 respostas

13

O TCP não faz nenhum esforço para detectar uma conexão inativa, exceto em um lado que está transmitindo dados. É responsabilidade do código do aplicativo chamar a pilha TCP para fazer isso. Qual protocolo está envolvido aqui? (Aquele em cima do TCP.)

É uma "solução" horrivelmente feia, mas você pode ativar TCP Keepalives . Há mais neste artigo .

    
por 07.12.2011 / 02:30
8

Sim, é possível. Como David e Paul afirmaram em suas respostas, não há mecanismo no TCP (além de keep-alives de TCP, que são opcionais) para detectar uma conexão semiaberta. Cabe ao fornecedor do aplicativo determinar o estado da conexão e tomar as medidas adequadas de acordo.

No que diz respeito ao TCP, não há detecção ou distinção entre uma conexão semiaberta e uma longa conexão ociosa.

Você terá que começar a solucionar isso da camada 1 (física) do modelo OSI até a camada 7 (aplicativo) para descobrir onde o problema está ocorrendo. Meu conselho seria instalar e executar um programa de captura de pacotes em um dos clientes afetados até que o problema ocorra e, em seguida, analisar a captura para tentar determinar o que está causando o cliente a não fechar a conexão.

    
por 07.12.2011 / 02:54
5

Quando uma estação de trabalho deseja fechar uma conexão com um servidor, ela envia um TCP FIN. Se o cliente não estiver se comportando adequadamente e não estiver fechando suas conexões, elas poderão, de fato, permanecer estabelecidas no servidor. Você pode definir tempos limite para conexões abertas no servidor para limpá-las - embora seja melhor encontrar a causa. Em que porta as conexões abertas estão entrando? Depois que você souber qual serviço está sendo acessado, poderá identificar o aplicativo cliente que está atingindo o servidor.

    
por 07.12.2011 / 02:23