CLOSE_WAIT
プログラムがまだ実行中であり、ソケットが閉じられていないことを意味します (そして、カーネルは閉じられるのを待っています)。 -p
を追加 netstat
まで pid を取得し、それをより強力に強制終了します (SIGKILL
を使用) 必要に応じて)。 CLOSE_WAIT
を取り除く必要があります ソケット。 ps
も使用できます pid を見つけます。
SO_REUSEADDR
はサーバー用で、TIME_WAIT
ソケットなので、ここでは適用しません。
ss
で強制的にソケットを閉じることができます 指図; ss
command は、ソケット統計をダンプするために使用されるツールであり、netstat と同様の方法で (より単純で高速ですが) 情報を表示します。
CLOSE_WAIT 状態のソケットを強制終了するには、これを (root として) 実行します
$ ss --tcp state CLOSE-WAIT --kill
アクションをフィルタリングすることもできます
$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill
クリスト・クラークの説明による。
<ブロック引用>CLOSE_WAIT は、接続のローカル エンドが相手側から FIN を受信したが、OS はローカル エンドのプログラムが実際に接続を閉じるのを待っていることを意味します。
問題は、ローカル マシンで実行されているプログラムがソケットを閉じていないことです。これは TCP チューニングの問題ではありません。プログラムが接続を開いたままにしている間、接続は (そしてまったく正しく) 永遠に CLOSE_WAIT に留まることができます。
ローカル プログラムがソケットを閉じると、OS はリモート エンドに FIN を送信できます。これにより、FIN の ACK を待つ間、LAST_ACK に移行します。それが受信されると、接続は終了し、接続テーブルから削除されます (終了が CLOSE_WAIT の場合は、そうではありません TIME_WAIT 状態になります)。