CLOSE_WAIT
signifie que votre programme est toujours en cours d'exécution et n'a pas fermé le socket (et que le noyau attend qu'il le fasse). Ajouter -p
à netstat
pour obtenir le pid, puis tuez-le avec plus de force (avec SIGKILL
si besoin). Cela devrait vous débarrasser de votre CLOSE_WAIT
prises. Vous pouvez également utiliser ps
pour trouver le pid.
SO_REUSEADDR
est pour les serveurs et TIME_WAIT
sockets, donc ne s'applique pas ici.
Vous pouvez forcer la fermeture des sockets avec ss
commande; le ss
La commande est un outil utilisé pour vider les statistiques des sockets et affiche les informations de la même manière (bien que plus simple et plus rapide) que netstat.
Pour tuer n'importe quel socket dans l'état CLOSE_WAIT, exécutez ceci (en tant que root)
$ ss --tcp state CLOSE-WAIT --kill
Vous pouvez également filtrer votre action
$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill
Tel que décrit par Crist Clark.
CLOSE_WAIT signifie que l'extrémité locale de la connexion a reçu un FIN de l'autre extrémité, mais que le système d'exploitation attend que le programme à l'extrémité locale ferme réellement sa connexion.
Le problème est que votre programme exécuté sur la machine locale ne ferme pas le socket. Ce n'est pas un problème de réglage TCP. Une connexion peut (et tout à fait correctement) rester en CLOSE_WAIT indéfiniment pendant que le programme maintient la connexion ouverte.
Une fois que le programme local ferme le socket, le système d'exploitation peut envoyer le FIN à l'extrémité distante qui vous fait passer à LAST_ACK pendant que vous attendez l'ACK du FIN. Une fois que cela est reçu, la connexion est terminée et disparaît de la table de connexion (si votre fin est dans CLOSE_WAIT, vous ne le faites pas finir dans l'état TIME_WAIT).