CLOSE_WAIT
bedeutet, dass Ihr Programm noch läuft und den Socket nicht geschlossen hat (und der Kernel darauf wartet, dass er dies tut). Fügen Sie -p
hinzu bis netstat
um die PID zu bekommen und sie dann energischer zu töten (mit SIGKILL
wenn benötigt). Das sollte Ihren CLOSE_WAIT
loswerden Steckdosen. Sie können auch ps
verwenden um die PID zu finden.
SO_REUSEADDR
ist für Server und TIME_WAIT
Sockets, trifft hier also nicht zu.
Sie können Sockets mit ss
zwangsweise schließen Befehl; die ss
Der Befehl ist ein Werkzeug, das verwendet wird, um Socket-Statistiken auszugeben und Informationen auf ähnliche Weise (obwohl einfacher und schneller) wie netstat anzuzeigen.
Um einen Socket im Status CLOSE_WAIT zu beenden, führen Sie dies (als root) aus
$ ss --tcp state CLOSE-WAIT --kill
Sie können Ihre Aktion auch filtern
$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill
Wie von Crist Clark beschrieben.
CLOSE_WAIT bedeutet, dass das lokale Ende der Verbindung ein FIN vom anderen Ende empfangen hat, aber das Betriebssystem darauf wartet, dass das Programm am lokalen Ende seine Verbindung tatsächlich schließt.
Das Problem ist, dass Ihr Programm, das auf dem lokalen Computer ausgeführt wird, den Socket nicht schließt. Es handelt sich nicht um ein TCP-Tuning-Problem. Eine Verbindung kann (und ganz richtig) für immer in CLOSE_WAIT bleiben, während das Programm die Verbindung offen hält.
Sobald das lokale Programm den Socket schließt, kann das Betriebssystem das FIN an das entfernte Ende senden, das Sie zu LAST_ACK überführt, während Sie auf das ACK des FIN warten. Sobald dies empfangen wurde, wird die Verbindung beendet und aus der Verbindungstabelle gelöscht (wenn Ihr Ende in CLOSE_WAIT ist, tun Sie dies nicht in den Zustand TIME_WAIT gelangen).