1

サーバー、クライアント、client2というc#実行可能ファイルが同じアドレスで相互にメッセージを送っています。私はそれらが来るポート番号によってメッセージを区別しています。

通常の実行-1サーバーがクライアントの参加を開始し、離脱します

run-2サーバーがクライアント2の参加を開始し、離脱します

run-3サーバーがクライアントの参加を開始しますclient2の参加(ここで問題が発生します)、サーバーから応答を受け取る場合もあれば、ハングしてサーバーからの応答が届かない場合もあります。

msg転送ルーチンをブロックするUDPClientを使用しています。

現在の解決策:サーバーから同じメッセージを2回送信しています(少なくとも2回目の取得を期待して)。これは非常に重要であり、このメッセージが失われることはありません。そのような一時的なハッキングの潜在的な失敗は何でしょうか?

また、私のqかどうか教えてください。不完全です詳細を提供します。

4

4 に答える 4

4

簡単に言えば、UDPは信頼できません。UDPの定義そのものは、パケットが宛先に到達するかどうかを保証することは言うまでもなく、伝える方法がないということです。

これらのメッセージが先導するほど重要である場合は、代わりにTCPを使用することをお勧めします。このようにして、送信エラーと障害が自動的に処理され、パケットが確実に宛先に到達するようになります。

ハッキングの潜在的な失敗については、メッセージの両方のコピーが到着した場合を処理する必要があります。また、どちらのコピーも到着しない場合は考慮しないでください。私にとって、車輪の再発明(確認メッセージの送信、タイムアウト時の再試行、重複した受信の処理)を試みることは、この場合、努力する価値がありません。TCPを使用するだけです。

于 2011-10-19T05:48:02.577 に答える
3

UDP自体は信頼できません。独自のコードを記述して、ニーズに合わせて信頼性を高めることができますが、それを行うのはあなた次第です。信頼性の高いストリームが必要な場合は、TCPを使用してください。

UDPパケットを2回送信すると、パケット損失の問題を減らすことができますが、保証はありません。クライアントが着信パケットを正常に処理したときにサーバーにパケットを送り返す確認応答システムを実装することをお勧めします。サーバーは、確認応答を確認するまで、元のパケットを繰り返し送信します。(これにはまだ制限があるはずです。そうしないと、永久に試行されます)

UDPが役立つ状況は、時折失われるパケットを気にしないが、UDPがもたらす可能性のある遅延を減らす必要がある場合です(組み込みの再送信がないため)。たとえば、サーバーがUDPを介してゲームデータを送信するゲームの状態情報。クライアントがパケットを受信しない場合、次のパケットが数ミリ秒で到着したときに追いつきます。

于 2011-10-19T05:46:30.613 に答える
2

信頼性がすべてに勝る場合は、TCPを使用してください。ただし、低遅延でパケットベースの通信が必要な場合は、UDPを使い続けることができますが、より優れた再送信プロセスを実装できます。

たとえば、SIP(VOIPプロトコル)では、通常、次のことを行うことをお勧めします。

  1. 500ミリ秒(T1)で起動するようにタイマーを設定します。
  2. リクエストを送信してタイマーを開始します。
  3. 応答がないままT1の有効期限が切れた場合は、要求を再送信してT1を2倍にします。
  4. 応答が得られるまで、またはT1が32秒に達するまで、#3を実行します。
于 2011-10-19T05:55:43.703 に答える
1

UDPは、ネットワークスタックの下位レベルで可能な限り信頼性があります。IPは基本的にベストエフォートサービスです。これが意味するのは、データが意図的に失われたり破損したりすることはありませんが、保証は行われないということです。幸いなことに、おそらく通常の状況では、チャネルの固有の信頼性はかなり良好であるため、UDPは問題ありません。各UDPデータグラムが損傷を受けていない受信機に到達する確率pを持っているとしましょう。この場合、N個のパケットの少なくとも1つが損傷を受けずに受信機に到達する確率は1-(1-p)^Nです。高いp(90%を超える)の場合、これは非常に迅速に1に収束します。ただし、N個のパケットすべてでデータが破損する可能性は常にあります。

You can build reliability guarantees into the protocol at the transport layer; in a sense, TCP is just UDP with this (and other) extra implementation already performed. Many CS networking courses involve developing a reliable UDP protocol. The benefits here are clear: you get certain (as opposed to very likely, statistically speaking) reliability (assuming you do it right).

To go into too much more detail would be to open a can of worms many authors have written extensively about. If you'd like to learn more, I can try to recommend some reading.

于 2011-10-19T05:55:58.893 に答える