接続は維持されているのにエンドポイントがダウンしている?

接続は維持されているのにエンドポイントがダウンしている?

サーバーを再起動したにもかかわらず、TCP 接続 (クライアント側) が約 24 時間 ESTABLISHED 状態のままになる原因が何かわかる方はいますか? クライアント プロセスは recv システム コールのままで、エラーが発生することなくその状態のままになります。

クライアントは Ubuntu 11.04 インストールです。この問題は既に数回発生していますが、原因や解決方法がわかりません。

答え1

接続は、サーバーの再起動後にその状態になったため、片側では ESTABLISHED のまま、もう片側では存在しない状態のままです。クライアントはサーバーの再起動を認識しておらず、サーバーはクライアントがまだ接続されていると考えていることを認識していません。クライアントが接続を使用しようとしない限り、この状態が永久に続きます。(キープアライブが有効になっている場合を除き、その場合は通常約 2 日間この状態が続きます。)

なぜクライアントはサーバーをいつまでも待っているのでしょうか? クライアントかプロトコルのどちらかが壊れています。クライアントがプロトコルに従っていない場合、クライアントが壊れています。プロトコルがデッド接続を検出する方法を指定していない場合、プロトコルが壊れています。

TCPは、データを送信しようとしていない側のデッド接続を検出しません。そのため、TCPの上位にあるすべてのプロトコルはしなければならないこれを考慮して設計する必要があります。この接続の停止が許容できない動作である場合、このプロトコルは、この許容できない動作を許可しているために壊れています (または、クライアントがプロトコルに従わないために壊れています)。

プロトコル仕様は本当に待つように言っているのか永遠にデータ用ですか? もしそうなら、プロトコルの開発者の正気を疑ってしまいます。

関連情報