CLOSE_WAIT
berarti program Anda masih berjalan, dan belum menutup soket (dan kernel sedang menunggu untuk melakukannya). Tambahkan -p
ke netstat
untuk mendapatkan pid, lalu bunuh dengan lebih kuat (dengan SIGKILL
jika diperlukan). Itu akan menghilangkan CLOSE_WAIT
Anda soket. Anda juga dapat menggunakan ps
untuk menemukan pid.
SO_REUSEADDR
adalah untuk server dan TIME_WAIT
soket, jadi tidak berlaku di sini.
Anda dapat menutup paksa soket dengan ss
memerintah; ss
perintah adalah alat yang digunakan untuk membuang statistik soket dan menampilkan informasi dengan cara yang serupa (walaupun lebih sederhana dan lebih cepat) ke netstat.
Untuk mematikan soket apa pun dalam status CLOSE_WAIT, jalankan ini (sebagai root)
$ ss --tcp state CLOSE-WAIT --kill
Anda juga dapat memfilter tindakan Anda
$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill
Seperti yang dijelaskan oleh Crist Clark.
CLOSE_WAIT berarti ujung sambungan lokal telah menerima FIN dari ujung lainnya, tetapi OS sedang menunggu program di ujung lokal untuk benar-benar menutup sambungannya.
Masalahnya adalah program Anda yang berjalan di mesin lokal tidak menutup soketnya. Ini bukan masalah penyetelan TCP. Koneksi dapat (dan dengan benar) tetap di CLOSE_WAIT selamanya selama program menahan koneksi tetap terbuka.
Setelah program lokal menutup soket, OS dapat mengirim FIN ke ujung jarak jauh yang mentransisikan Anda ke LAST_ACK sementara Anda menunggu ACK dari FIN. Setelah diterima, koneksi selesai dan terputus dari tabel koneksi (jika akhir Anda dalam CLOSE_WAIT, Anda tidak berakhir dalam status TIME_WAIT).