conexões TCP pendurar em estado CLOSE_WAIT
-
19-09-2019 - |
Pergunta
Cliente perto da tomada primeiro, quando não há muitos dados a partir de servidor, conexão TCP desligamento é bem assim:
FIN -->
<-- ACK
<-- FIN, ACK
ACK -->
Quando o servidor está ocupando o envio de dados:
FIN -->
<-- ACK,PSH
RST -->
E a conexão do servidor trata de estado CLOSE_WAIT e pendurar lá por um longo tempo.
Qual é o problema aqui? cliente relacionado ou servidor relacionados? Isso acontece em Redhat5 para sockets locais.
Este artigo falar sobre o porquê "RST" é enviado, mas eu não sei por que a conexão do servidor preso em CLOSE_WAIT, e não enviar um a FIN.
[EDIT] Eu ignorei as informações mais importantes, isso acontece em qemu de emulação de rede slirp. Parece ser um problema de bug slirp para lidar com estreita ligação.
Solução 3
Este é um conhecido defeito para qemu.
Outras dicas
Isto significa que há dados não lidas deixadas em na corrente, que o cliente não tem leitura final.
Você pode forçá-lo fora usando a opção SO_LINGER
. Aqui está documentação relevante para Linux (veja também a opção em si, aqui ), e [aqui está o function2 correspondência] para Win32
É o lado do servidor que está permanecendo aberta, por isso é no lado do servidor você pode tentar desativar SO_LINGER
.
Isso pode significar que o servidor não tenha fechado o socket. Você pode facilmente dizer isso usando "lsof" para listar o arquivo descritores abrir por esse processo que irá incluir sockets TCP. A correção é ter o processo sempre perto da tomada quando terminar (mesmo em casos de erro etc)