Em suma, não se preocupe com TIME_WAIT
. A sobrecarga é quase nenhuma e geralmente não apresenta problemas.
Em um servidor ocupado, a exaustão de porta é possível e, nesse caso, há a opção sysctl de net.ipv4.tcp_tw_reuse = 1
, que permite ao kernel reutilizar portas antigas que ainda estão em TIME_WAIT
conforme necessário.
TIME_WAIT é parte da especificação TCP e está lá para capturar pacotes que ainda podem estar em trânsito (lembre-se, nem todas as conexões são confiáveis, e é isso que o TCP pretendia resolver). O valor de tempo limite pode ser muito alto para a maioria dos usos modernos, mas normalmente não interfere em nada além da saída do netstat.
Se você mesmo estiver controlando o soquete e tiver certeza de que não está esperando pelos dados (por exemplo, você é o remetente final ou não se importa com uma resposta), feche o soquete após definir o SO_NOLINGER
option, que terminará a conexão com um RST
e descartará imediatamente o soquete.
Então, suas perguntas:
Q1, Q2, Q3: está lá para coletar os pacotes atrasados, "apenas no caso", porque os links podem não ser confiáveis. É parte da especificação, evita a perda de pacotes e o ajuste não tem nenhum benefício real.
Q4: não
Q5: Não se preocupe, e você tem a opção de forçar a reutilização desses soquetes, se necessário.
Q5: TIME_WAIT
e ESTABLISHED
não estão correlacionados, a não ser quanto mais conexões de curta duração você tiver, maior será essa proporção. Pode ser causado por algo mal-intencionado, mas não é mais um indicador do que "atividade de rede excessiva".