UDP +ソフトウェアがTCPよりも高速な信頼性の高い注文システムである理由

StackOverflow https://stackoverflow.com/questions/1200901

  •  05-07-2019
  •  | 
  •  

質問

今日の一部のゲームでは、UDPを介してメッセージを送信するネットワークシステムを使用し、メッセージの信頼性と順序付けを保証しています。

たとえば、 RakNet は人気のあるゲームネットワークエンジンです。接続にはUDPのみを使用し、必要に応じてパケットの信頼性と順序付けを保証するシステム全体を備えています。

私の基本的な質問は、どうしたのですか? TCPは、順序付けられた信頼できるUDPと同じものではありませんか?なぜそれが非常に遅くなり、人々が基本的に車輪を再発明しなければならないのですか?

役に立ちましたか?

解決

一般/専門分野

  1. TCPは汎用の信頼できるシステムです
  2. UDP + whateverは特別な目的の信頼できるシステムです。

通常、特殊化されたものは、特殊化されたものの汎用目的のものよりも優れています。

ストリーム/メッセージ

  1. TCPはストリームベースです
  2. UDPはメッセージベースです

通常、個別のゲーム情報マップは、メッセージベースのパラダイムにより適しています。ストリームを介して送信することは可能ですが、恐ろしく効果的ではありません。大量のデータを確実に送信したい場合(ファイル転送)、TCPは非常に効果的です。そのため、Bit-Torrentは制御メッセージにUDPを使用し、データ送信にTCPを使用します。

他のヒント

「リーグオブレジェンド」で信頼性の高いものから信頼性の低いものに切り替えました。約1年前、いくつかの利点があり、それが真実であることが証明されています。

1)古い情報は無関係になります。ヘルスパケットを送信しても届かない場合...変更がわかったときに同じヘルスパケットが再送信されるのを待つ必要はありません。

2)注文は時々必要ありません。異なるシステムに異なるメッセージを送信する場合、それらのメッセージを順番に取得する必要はないかもしれません。クライアントに順番どおりのメッセージを待つことを強制しません。

3)Unreliableはメッセージでバックアップされません。つまり、確認応答を待機しているため、損失スパイクをより迅速に解決できます。

4)必然的により効率的に再送を制御できます。別のパケットに送信されなかったものを再梱包するなど。 (TCPは再パックしますが、プログラムの動作に関する知識があればより効率的に再パックできます。)

5)ネットワークが突然急上昇した場合に関連性の低いメッセージを破棄するなど、メッセージのフロー制御。ネットワークシステムは、損失が急増した場合に関連性の低いメッセージを再送信しないことを選択できます。 TCPを使用すると、優先度の低い再送信を試みているメッセージのキューがまだあります。

6)ヘッダーパケットのサイズを小さく...そんなことを言う必要はありません。

UDPとTCPには、単なる信頼性と順序付けよりもはるかに多くの違いがあります:

問題の核心は、UDPが connectionless であり、TCPが connected であるという事実です。この単純な違いは、他の多くの違いにつながりますが、ここでは簡単に要約することはできません。詳細については、以下の分析をご覧ください。

TCP-UDP比較分析

私の意見では、答えは「輻輳制御」という2つの単語です。

TCPは、パスの帯域幅を管理するために多大な時間を費やします-そのほとんどを使用しますが、他のアプリケーション用のスペースを確保します。これは非常に困難な作業であり、本質的に100%の帯域幅を100%使用することはできません。

一方、UDPを使用すると、独自のプロトコルを作成して、パケットを必要な速度でワイヤに送信できます。これにより、プロトコルは他のアプリケーションにとって非常に使いにくくなりますが、短期。一方、条件が適切な場合、この種のプロトコルはに寄与する可能性が高いです。混雑崩壊

TCPはストリーム指向のプロトコルですが、UDPはメッセージ指向のプロトコルです。したがって、TCPは単なる信頼性と順序付け以上のことを行います。詳細については、この投稿をご覧ください。基本的に、RakNet開発者は信頼性と順序付けを追加しながら、メッセージ指向のプロトコルとして維持しているため、結果はTCP(より多くの作業が必要)よりも軽量でした。

この小さな記事は古いですが、ゲームに関してはかなり真実です。 2つのプロトコル、およびこれらの人々がマルチプレイヤーインターネットゲームを開発しようとした大混乱について説明しています。 " X-Wing vsタイファイター"

学んだ教訓(インターネットは吸う)

ただし、これには1つの注意点があります。マルチプレイヤーゲームを実行/開発し、両方を使用しました。私のアプリではUDPの方がはるかに優れていましたが、多くの人はUDPを使用できませんでした。ルーターなどが接続をブロックしました。そこで、「信頼できる」に変更しました。 TCP。まあ...信頼できる?そうは思いません。パケットを送信しますが、エラーはありません。別のパケットを送信すると、パケットの途中でクラッシュ(例外)します。今、どのパケットがそれを作りましたか?したがって、UDPをシミュレートするために、tcpの上位に信頼性の高いプロトコルを作成することになりますが、クラッシュしたときに新しい接続を継続的に確立します。効率が悪い。

UDP +停止してARW = goodを待機

UDP +スライディングウィンドウプロトコル=より優れた

TCP +スライディングウィンドウプロトコルと再接続=価値のないバルクウェア。 (私見)

もう1つの副作用は、マルチスレッドアプリケーションです。 TCPは、チャットルームタイプのものに適しています。各ルームが独自のスレッドになる可能性があるためです。部屋には60〜100人を収容でき、部屋のスレッドには各参加者のソケットが含まれているため、問題なく実行できます。

一方、

UDPは1つのスレッドによって最適に提供(IMO)されますが、パケットを取得したら、それを解析して(送信元の情報またはRemoteEndPointを介して)誰からのものかを把握し、そのデータをスレッドセーフな方法でチャットルームのスレッド。

実際には、TCPでも同じようにする必要がありますが、接続時のみです。

最後のポイント。 TCPはいつでもエラーを出力して接続を強制終了しますが、約.5秒で再接続して同じ情報を送信できることに注意してください。私が今まで働いた中で最も奇妙なこと。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top