Estou tendo problemas com uma conexão com a Internet que parece "congelar" aleatoriamente conexões tcp arbitrárias quando elas não são usadas há algum tempo. As conexões permanecem estabelecidas, mas nenhum dado está chegando.
Quando isso acontece, netstat ainda mostra o status da conexão como ESTABLISHED
no computador local:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 53 192.168.0.10:41129 173.255.235.238:143 ESTABLISHED 8219/gnutls-cli on (79.31/13/0)
.. e o servidor remoto:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 0 173.255.235.238:143 68.5.174.98:41129 ESTABLISHED 5303/imapd off (0.00/0/0)
No entanto, parece que nenhum dado é transferido. Se eu executar strace no processo local e remoto, ambos mostram apenas uma sequência repetitiva de chamadas selecionadas (com fds diferentes, é claro), por exemplo,
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
A conexão com a Internet em geral não parece afetada, eu ainda posso estabelecer novas conexões para o mesmo serviço no mesmo servidor sem quaisquer problemas. No entanto, os aplicativos locais afetados parecem não estar cientes do problema e apenas interrompem.
Cerca de 10 minutos após a tentativa de transmissão no terminal local, a conexão no terminal remoto desaparece do netstat (não consegui encontrar nenhum estado intermediário), mas ainda permanece ESTABLISHED
no final local.
Finalmente, depois de mais alguns minutos, o aplicativo local aborta com um tempo limite e também desaparece da saída local do netstat.
Quando olho para uma captura de pacotes dessa conexão no lado do cliente, há um longo (esperado) período de inatividade que parece acionar o problema, então
o terminal local tenta transmitir alguns dados novamente, mas nunca recebe um ACK. Em vez disso, 15 retransmissões TCP saem, com intervalos aumentando de 0,3 segundos para 120 segundos. Nenhuma atividade é capturada depois disso.
Alguém tem uma sugestão de como eu poderia depurar isso ainda mais para descobrir onde está o problema e como corrigi-lo?
Adicional e / ou como uma solução temporária: existe alguma maneira de reduzir globalmente o tempo limite no cliente e / ou servidor para reduzir o tempo antes que o aplicativo local seja abortado?