CLOSE_WAIT
significa che il tuo programma è ancora in esecuzione e non ha chiuso il socket (e il kernel sta aspettando che lo faccia). Aggiungi -p
a netstat
per ottenere il pid, e poi ucciderlo con più forza (con SIGKILL
se necessario). Questo dovrebbe eliminare il tuo CLOSE_WAIT
prese. Puoi anche usare ps
per trovare il pid.
SO_REUSEADDR
è per server e TIME_WAIT
socket, quindi non si applica qui.
Puoi forzare la chiusura dei socket con ss
comando; il ss
command è uno strumento utilizzato per eseguire il dump delle statistiche sui socket e visualizza le informazioni in modo simile (sebbene più semplice e veloce) a netstat.
Per terminare qualsiasi socket nello stato CLOSE_WAIT, esegui questo (come root)
$ ss --tcp state CLOSE-WAIT --kill
Puoi anche filtrare la tua azione
$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill
Come descritto da Crist Clark.
CLOSE_WAIT significa che l'estremità locale della connessione ha ricevuto un FIN dall'altra estremità, ma il sistema operativo sta aspettando che il programma all'estremità locale chiuda effettivamente la connessione.
Il problema è che il tuo programma in esecuzione sulla macchina locale non sta chiudendo il socket. Non è un problema di ottimizzazione TCP. Una connessione può (e giustamente) rimanere in CLOSE_WAIT per sempre mentre il programma la mantiene aperta.
Una volta che il programma locale chiude il socket, il sistema operativo può inviare il FIN all'estremità remota che ti passa a LAST_ACK mentre aspetti l'ACK del FIN. Una volta ricevuto, la connessione è terminata e viene eliminata dalla tabella delle connessioni (se la tua estremità è in CLOSE_WAIT non finiscono nello stato TIME_WAIT).