Temos um aplicativo de servidor que enfrenta problemas de exaustão de TCP em cerca de 4000 conexões. Isso ocorrerá a cada 3 ou 4 semanas (aproximadamente). O fornecedor, que criou esse aplicativo de servidor, informa-nos, 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 aplicativo cliente específico não está fechando a conexão TCP corretamente. Acredito que, se um computador cliente for desligado, não será possível relatar POSSÍVEL do servidor que uma conexão TCP ainda está estabelecida com esse cliente. Infelizmente, não consigo encontrar nenhuma informação para validar minha visão. Não quero perder mais tempo investigando um problema em potencial que acho que nem pode ser um problema.
tldr;
Um servidor pode relatar uma conexão estabelecida com um computador desligado?
fonte
Sim, é possível. Como David e Paul declararam em suas respostas, não há nenhum mecanismo no TCP (exceto TCP keep-alives, que são opcionais) para detectar uma conexão semi-aberta. Cabe ao fornecedor do aplicativo determinar o estado da conexão e tomar as medidas apropriadas de acordo.
No que diz respeito ao TCP, não há detecção ou distinção entre uma conexão semi-aberta e uma longa conexão inativa.
Você precisará 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 analisar a captura para tentar determinar o que está fazendo com que o cliente não feche a conexão.
fonte
Quando uma estação de trabalho deseja fechar uma conexão com um servidor, envia um TCP FIN. Se o cliente não estiver se comportando corretamente e não estiver fechando suas conexões, ele poderá, de fato, permanecer estabelecido 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 de saber qual serviço está sendo acessado, você poderá identificar o aplicativo cliente que está atingindo o servidor.
fonte