Múltiplas conexões TCP

Pessoal,

Temos uma aplicação multithreaded que realiza atividades de FTP. Mais precisamente download e upload.
Por exemplo, cadastramos um servidor FTP e alguns diretorios para este servidor FTP no banco.
Nossa aplicação le os diretorios, e lança uma thread para cada um dos diretórios.
Dependendo do tipo do diretório, a aplicação baixa arquivos do servidor FTP, ou então faz upload de arquivos locais para o servidor FTP.

Depois de algum tempo que a aplicação está rodando, o comando netstat do windows retorna um número enorme de conexões em TIME_WAIT, todas que foram utilizadas pela minha aplicação.

O problema é que chega a um ponto em que quase todas as 60 mil e poucas portas disponíveis ficam em TIME_WAIT.

Depois de algum tempo realizando testes, percebi que dava pra diminuir o número de conexões que minha aplicação realiza.

Mesmo assim o número de portas em TIME_WAIT é absurdo.

Como sabemos, TIME_WAIT é um status normal em toda conexão TCP, que tem um tempo de duração, baseado na especificação do TCP, e que ocorre depois que a conexão já foi fechada.

Andei pesquisando algumas formas para corrigir esse problema.

Pensei em criar um pool de conexões FTP, e deixar um número limite de conexões sempre conectado. Assim nenhuma porta ficaria em TIME_WAIT e o problema seria resolvido. Porém isso consumiria banda, e eu ainda correria o risco de o o servidor fechar as conexões.

Pensei em limitar o número de portas que a minha aplicação pode usar. Isso provavelmente ajudaria um pouco, porém limitaria os acessos que a minha aplicação faz, e provavelmente faria com que alguns servidores FTP com mais uso impactassem em servidores com menos uso, o que seria ruim.

Pensei em limitar o timeout do TIME_WAIT. Pesquisando por aí, descobri que é possível até mesmo eliminar este estado. Porém a conexão TCP correria o risco de se “perder” caso ela fosse realizada em uma porta que deveria estar em TIME_WAIT. Em outras palavras, minhas conexões TCP não seriam mais “tão confiáveis”.
E isso impactaria em todas as aplicações que fazem conexões TCP na máquina que for rodar minha aplicação de FTP.

Então eu baixei o Filezilla para realizar uns testes.

Percebi que ele faz praticamente a mesma coisa:
Transferi 180 arquivos para um mesmo servidor, e depois disso mais de 200 portas ficaram em TIME_WAIT.

Bom…se alguém tiver alguma observação ou dica eu agradeço.

Eu tive um problema semelhante a algum tempo atras e corrigi da seguinte forma.

para cada requisição de arquivo era aberta uma conexão e apos receber todos o arquivo era fechada a porta ate receber um novo arquivo, trabalhavamos com portas diferentes tipo

requisição na porta 721 , 726 et all. o unico problema era quando o programa insistia enviar sempre na mesma porta dai emtrava em time wait.