Linuxカーネルは孤立したソケットを処理しません。なぜできないのですか?

Linuxカーネルは孤立したソケットを処理しません。なぜできないのですか?

この記事はもともと次のアドレスに投稿されました。サーバー障害しかし、コミュニティではテーマから抜け出した投票をしました。

私はLinuxカーネルソケットの状態の理由/方法/場所/タイミングを理解しており、Linuxカーネルが私の特定のアプリケーションとコンテキストに対して特定の方法で動作するように強制したいと言うことでこの質問を始めます。

マシンはRaspbianを実行しているPi 3 B +です。

私の目標は以下の答えに従うことですこの問題「無駄な状態」*でソケットを終了するので、Pythonで次のように実装しました.

def kill_hanging_sockets(self):
    default_max_tcp_sockets = subprocess.check_output(['cat /proc/sys/net/ipv4/tcp_max_orphans'], shell=True)
    subprocess.call(['sudo bash -c "echo 0 > /proc/sys/net/ipv4/tcp_max_orphans"'], shell=True)
    new_max_tcp_sockets = subprocess.check_output(['cat /proc/sys/net/ipv4/tcp_max_orphans'], shell=True)
    print('new value is {}'.format(new_max_tcp_sockets))
    time.sleep(3)
    subprocess.call(['sudo bash -c "echo %s > /proc/sys/net/ipv4/tcp_max_orphans"' % default_max_tcp_sockets], shell=True)

関数はとても簡単です。値を0に設定し、値が0であることを確認するために値を印刷し、カーネルが孤立したソケットを「終了」するまで3秒間待ってから、maxパラメータを元の値に戻します。

しかし、それは動作しません。ソケットは私が思ったようにカーネルによって「殺されません」。動作は同じままで、ソケットは約20秒以内に「終了」しているようです。変更がmax_tcp_orpahnsシステムに影響を与えない、または問題のソケットが実際に孤立したソケットになるわけではないと思います。

使用されているソケットを確認しましたが、sudo netstat --inet -p -cまだFIN_WAITまたはCLOSE_WAIT状態です。このようなことが起こらないように努めています。ここで試すことができる他のものはありますか?それとも間違った木を吠えているのでしょうか?

[*]「役に立たない状態」の私の定義は、あなたやLinuxカーネルの定義とは異なるかもしれませんが、質問の文脈を考慮してください。上記の文脈では、ソケットは消えるまで他のソケットをバインドすることができないので、私にとって「ダンス」です。

関連情報