3

バックグラウンド:

サーバーへの永続的な接続を使用するクライアント/サーバー アプリケーションがあります。

ベンチマークでは、新しい接続 (crypto) のセットアップにかなりの時間 (2.5 秒) を費やすよりも、既に開いている接続を使用する方が何倍も高速であることが示されています。

残念ながら、古い接続は古くなっている可能性があります。

メッセージ送信のシステム レベルの結果 [ACK またはエラー] を待つ方法はありますか?

読み取りを待ってからストリームの終わりを取得すると、混乱が生じます。

メッセージがパケットに分割される可能性があることはわかっています。メッセージの一部が確認されたのか、それともすべてが確認されたのかを知ることは、私の目的に等しく適しています。ここで興味深い問題は、古い接続です。

4

3 に答える 3

2

残念ながら、古い接続は古くなっている可能性があります。

その場合、最終的に書き込み時に例外が発生します。

メッセージ送信のシステム レベルの結果 [ACK またはエラー] を待つ方法はありますか?

いいえ。

読み取りを待ってからストリームの終わりを取得すると、混乱が生じます。

誰に混乱?混乱を処理するのはコードの仕事です。予期しない EOS が発生した場合は、ピアが接続を閉じているか、中間のファイアウォールが閉じているため、対処する必要があります。

メッセージがパケットに分割される可能性があることはわかっています。

完全に無関係です。あなたはそれを制御することも、それを可視化することもできません。得られるのは、EOS または例外によって終了されたバイト ストリームです。

メッセージの一部が確認されたのか、それともすべてが確認されたのかを知ることは、私の目的に等しく適しています。

いいえ、そうではありません。ACK は、ピアの TCP/IP スタックまで到達したことを意味するだけです。アプリケーションが関心を持っているのは、アプリケーションがピア アプリケーションに到達したかどうかであり、ピア アプリケーションだけがアプリケーション プロトコル レベルの ACK を介してそれを伝えることができます。ここでは、TCP/IP ACK は役に立ちません。

ここで興味深い問題は、古い接続です。

そして、それはかなり些細な問題です。コードでそれを検出でき、同じように処理できます。データベース ベンダーは、このようなことを何十年も行ってきました。ロケット科学ではなく、TCP ACK の知識を必要とするものは何もありません。

于 2010-07-03T10:09:04.417 に答える
0

接続が実行可能でなくなった場合、TCP スタック自体がタイムリーに通知することはほとんどありません (接続がローカルで切断され、OS がローカルの障害をスタックに報告できる場合を除きます)。再送信のタイムアウト (こちらを参照) と、書き込みが失敗を返し、接続が切断されたことを示すまでに「かなりの時間」がかかる可能性があるためです。もちろん、これは設計によるものであり、設計がやりたいことと矛盾しているというだけです。

TCPキープアライブを使用してみることができますが、私見では、これらは実際には努力する価値がありません。可能であれば、何らかの形式のアプリケーションレベルACKを実装して、アプリケーションレベルのプロトコルがすぐに応答を返すようにすることをお勧めします。それはあなたからいくつかのデータを取得します。それができず、要求が接続の反対側からの応答を引き出す場合は、接続が切断されたと想定する前に、応答を待機する準備ができている時間に基づいてタイマーを設定するだけです。タイマーが切れたら、接続を閉じて新しい接続を確立します。

古い接続からの応答を取得する前に新しい接続が使用可能になった場合は、新しい接続の試行を開始し、古い接続で要求を送信することもできます。新しい接続で要求を送信し、接続を閉じることができます。古いもの...もちろん、これはアプリケーションがこの種のことを処理できることに依存しています。

最後に、非アクティブなために接続が切断されている場合は、アプリケーション レベルの ping をプロトコルに追加して、a) 接続が有効であることを確認し、b) ルーターまたはファイアウォールを停止するために、メッセージを頻繁に送信するように設定できます。接続が死んでいると考えることから。

于 2010-07-03T09:58:38.420 に答える
-1

TCP 通信を処理するレイヤーでは、ACK を気にする必要はありません。それがレイヤー3以下の仕事です。あなたのプロトコルでは、常にコマンド/応答要求を作成してください。応答は、成功またはエラーに関係なく存在するものとします。応答がないことを成功と解釈するのは危険です。通信を中断することも同じ結果につながる可能性があるためです。

古くなったとはどういう意味か正確にはわかりません。TCP は接続指向のプロトコルであるため、接続が存在するかどうかが決まります。したがって、私はあなたがどのような問題を抱えているのかよくわかりません。接続を失うと、新しい接続を作成する努力をしなければなりません.

于 2010-07-02T21:10:24.527 に答える