web-dev-qa-db-ja.com

ホストが接続されていなくても、接続にESTABLISHEDのフラグが付けられたままになる

私はLinux組み込みディストリビューションで作業していて、着信および発信接続(まだアクティブである場合など)を監視する必要があり、リモートホストが接続をオフにした場合でも、 [〜#〜] established [〜#〜]としてのnetstatを介した接続。

このLinux組み込みシステムには2つの異なるバージョンがあります。1つは古い2.6.34カーネルを使用しており、正常に動作しますが、失敗したバージョンはカーネル3.18.18を使用します。

詳細情報を探して TCPタイムアウト を設定/変更する必要があると思われるので、syctl.confを使用して設定しましたが、何も変更しません。 2.6.34カーネルを使用するシステムでは、TCPタイムアウトが構成されていないため、TCPは私の問題の根本原因ではないと思います。

接続が[〜#〜]確立済み[〜#〜]のままであるという事実の理由について考えがありますか?

7
simo-zz

ホストが他のホストから切断されても、その接続がESTABLISHEDとして表示される場合は、おそらく、それがTCPプロトコルを順守しておらず、接続を完全に閉じていないことに関連しています。

netstat出力は、TCP接続の現在の状態のインタープリターです。クライアントが以前に開いて確立したソケットを切断または閉じる場合は、リモートシステムに通知する必要があります。これは、FIN request他のノード(詳細情報 ここ )、この場合はサーバー。

クライアントが接続に失敗すると、クライアントは実際に切断されますが、リモートサーバーは、クライアントがまだ接続されていると考えを維持し、そのため、状態をESTABLISHED、そしてtcp_keepalive_timeパラメータは方程式を結合します。これ以上パケットが受信されなくなるため、カーネルはこのパラメーターまで指定された時間待機して、接続をタイムアウトにして強制的に閉じます。

この問題は、tcpdumpツールを使用してデバッグできます。サーバー側のクライアントホストからの接続をリッスンし、FINリクエストの送信に失敗したかどうかを確認できます。

tcpdump Host X.X.X.X and port Y
2
nKn