TCP接続がCLOSE_WAIT状態にハングアップします
-
19-09-2019 - |
質問
クライアントは、サーバからの多くのデータがない場合、TCP接続のシャットダウンのような大丈夫です、最初のソケットを閉じます
FIN -->
<-- ACK
<-- FIN, ACK
ACK -->
サーバーがデータを送信しbusyingされている場合:
FIN -->
<-- ACK,PSH
RST -->
とサーバの接続状態をCLOSE_WAITと長い時間のためにそこにハングアップしています。
ここでの問題は何ですか?クライアント関連またはサーバーに関連しますか?これは、ローカルソケット用Redhat5で発生します。
この<のhref = "http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable" のrel =「nofollowをnoreferrer」>の記事は、「RST」が送られている理由について話が、サーバー接続がCLOSE_WAITに付着した理由を私は知らない、と出てFINを送信しません。
[EDIT]私は、これはQEMUのslirpネットワークエミュレーションで発生し、最も重要な情報を無視していました。密接に対処するためのslirpのバグの問題のようです。
解決 3
この知られている<のhref = "http://www.archivum.info/qemu-devel@nongnu.org/2008-06/00029/%5BQemu-devel%5D-%5BPATCH%5D-Proposed-fix -broken-RST応答ツーslirpリダイレクト-socket.html」REL = "nofollowをnoreferrer"> QEMUの欠陥の
他のヒント
これは、クライアントが読み終えていないことを、ストリーム内の左側の未読データがあることを意味します。
あなたはSO_LINGER
オプションを使って、それを強制することができます。 ここではLinux用の関連文書に(もオプション自体を参照して、<のhref = "HTTPです://linux.die.net/man/7/socketここを」のrel = "nofollowをnoreferrer">)、およびWin32用[ここマッチング機能2だ]
これはオープン残っているサーバー側なので、それは、サーバー側でだあなたはSO_LINGER
を無効にしてみてくださいすることができます。
これは、サーバーがソケットを閉じていないことを意味するかもしれません。あなたは簡単にTCPソケットが含まれますそのプロセスによって、開いているファイル記述子を一覧表示する「lsofを」を使用してこれを伝えることができます。この修正は、それが終了していますとき、常にソケットを閉じるプロセスを持つことである(でも、エラーケースなどで)