クライアントが切断したときにTCP接続を開いたままにすることはできますか?


12

約4000接続でTCP枯渇の問題に直面しているサーバーアプリケーションがあります。これは3週間または4週間ごとに発生します(およそ)。このサーバーアプリケーションを作成したベンダーは、netstat -bの出力を調べた後、クライアントがドロップしても一部の接続が開いたままであることを通知します。

特定のクライアントアプリケーションがTCP接続を適切に閉じない理由を調査するタスクが与えられました。私は、クライアントコンピューターがシャットダウンした場合、そのクライアントとのTCP接続がまだ確立されていることをサーバーから報告することはできないと考えています。残念ながら、自分の見解を検証するための情報を見つけることができません。問題になる可能性があるとは思わない潜在的な問題を調査するのにこれ以上時間を無駄にしたくありません。

tldr;

サーバーは、オフになっているコンピューターへの確立された接続を報告できますか?

回答:


13

TCPは、データを送信している側を除き、デッド接続を検出する努力をしません。これを行うのは、TCPスタックを呼び出すアプリケーションコードの責任です。ここでどのプロトコルが関係していますか?(TCPの上にあるもの。)

これは恐ろしくい「解決策」ですが、TCPキープアライブを有効にすることができますこの記事には他にもあります


TCPが存在するトランスポートレイヤーの上のレイヤーとそのセッションレイヤーを意味している可能性があります。
リリンド

1
@Rilindo:実際には、この特定のケースでは、TCPスタックを呼び出すアプリケーションがあります。TCPのプロトコル(HTTP、POPなど)は、通常、これを行う方法を指定します。これらのプロトコルの設計者は、TCPがこれを実行できないことを知っていたためです。
デビッドシュワルツ

おっと、私の間違い。そのレイヤー7。
リリンド

この時点でキープアライブを有効にするつもりはありませんが、オプションが存在することを知っておくと便利です。その記事は、すでに2時間のタイムアウトが存在することを示唆しているようです。
ジョシュスミートン

ほとんどの場合、キープアライブは有効になっていません。それらのコードを有効にする必要があります。キープアライブを有効にせず、タイムアウト/リープメカニズムがない場合、アプリケーションは単純に壊れているように聞こえます。どのプロトコルについて話しているのですか?(HTTP?SMTP?FTP?)
デイビッドシュワルツ

8

はい、可能です。DavidとPaulが回答で述べたように、TCPには、ハーフオープン接続を検出するためのメカニズム(オプションのTCPキープアライブ以外)はありません。接続の状態を判断し、それに応じて適切なアクションを実行するのは、アプリケーションベンダー次第です。

TCPに関する限り、ハーフオープン接続と長いアイドル接続の検出や区別はありません。

OSIモデルのレイヤー1(物理)からレイヤー7(アプリケーション)までのトラブルシューティングを開始して、問題が発生している場所を特定する必要があります。問題が発生するまで、影響を受けるクライアントの1つにパケットキャプチャプログラムをインストールして実行し、キャプチャを分析して、クライアントが接続を閉じない原因を特定することをお勧めします。


3
または、ベンダーに適切なタイムアウトを実装してもらいます:)
シェーンマッデン

5

ワークステーションがサーバーとの接続を閉じたい場合、TCP FINを送信します。クライアントが正常に動作せず、接続を閉じない場合、実際にはサーバー上で確立されたままになる可能性があります。サーバーで開いている接続のタイムアウトを設定して、これらをクリーンアップできますが、原因を見つけた方がよいでしょう。開いている接続はどのポートに入りますか?どのサービスにアクセスしているかがわかれば、サーバーにアクセスしているクライアントアプリを特定できる場合があります。


明らかな問題であるクライアントを知っています。これは、数百人のユーザーが毎日使用するデスクトップアプリです。問題は、アプリケーションのクラッシュ、ハードリセット、または終了タスクだと思います。これらすべての状況で、サーバーは接続の切断を認識していると思いました。
ジョシュスミートン

4
サーバーに関する限り、クライアントからFINまたはRSTを受信しない限り、接続は開いています。これがないと、サーバーは接続はまだ確立されているが、クライアントには送信するデータがないと想定します。サーバーに関する限り、ハーフオープン接続とアイドル接続の間に違いはありません。
joeqwerty

@joeqwerty:True。ただし、サーバー接続を無期限に開いたままにしないことを決定でき、タイムアウト/クローズメカニズムを実装できます。これは、David Schwartzが「アプリケーションコードの責任です」という答えで意味したものです。そのため、サーバーは、必要に応じてハーフオープン接続とアイドル接続を区別できます。ただし、TCPにとっては、ハーフオープン接続とアイドル接続の違いはまったくありません。
sleske

@sleske:アプリケーションコードでこれを実行できることに同意しましたが、TCPはキープアライブが有効になっていないとできません。
joeqwerty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.