マルチプレイヤーゲームのTCPまたはUDPですか?


17

これは私がよく見る質問です。ほとんどの人は、UDPはTCPよりもリアルタイムゲームの方が常に優れていると言います。私の理解では、UDPは気にしませんが、TCPは反対側がパケットを取得するまで何度もパケットを再送信しようとします。

私が読んだことの大部分は、UDPはどんなリアルタイムゲームにとっても必須であり、TCPはひどいということです。しかし、とにかく、ほとんどの人はUDPの上に何らかの形式のTCPを実装しているようです。そして、私たちはもう80年代ではなく、インターネットは今や非常に高速で信頼性が高いことを考えると、2つの違いは無視できると聞いています。

ここでの私の一般的な理解は間違っていますか?誰かが私のためにこれをクリアできますか?


7
internet is now pretty fast and reliableいいえ、ちがいます。帯域幅が劇的はい、増加しているが、レイテンシはまだかなり高いです。純粋なTCPでは、パケットスキッシン​​グを行わない限り、サーバーティック時間が最大手頃なレイテンシーを超える必要があります。これは、UDPを介してクライアントで行うのが最適です。問題は、ゲーム内の一部の情報は信頼性が必要であり、その他の情報は高速である必要があることです。UDPの上のカスタムプロトコルは、それを可能にし、素敵なパッケージで必要なものすべてを提供する独自のプロトコルの束も可能にします。
オーダス

4
TCP over UDPを正確に実装していません。TCPが提供する望ましい機能がいくつかあり、UDPの上に実装されています。UDPを使用する主な点t0は、一度も受信されていないワールドステートを含むパケットを送信し、その後に新しいワールドステートを送信するt1場合、クライアントが実際に最初のパッケージを受信するまで待つ必要がないことです。すでに廃止されています。
ビンセントサバード

@Ordous私はこれが私の質問に答えると思います:)おかげで
flooblebit

4
また、UDPはIPスプーフィングの影響を受けやすいため、サーバーがDDoS攻撃にさらされる可能性があることに注意してください。これを回避するには、クライアントIPアドレスとその他の詳細をサーバーに送信する「制御」TCP接続を使用し、サーバーが「認証済み」アドレスからUDPパケットを受け入れます。また、UDPにはオープンな標準がないため、独自の暗号化レイヤーを実装する必要があります。
アラウ

@ blownie55の良い点
Naresh Kumar

回答:


12

ピアツーピア、サーバーを実行しているユーザーとのクライアント/サーバー、またはサーバーを実行しているデータセンターとのクライアント/サーバーについて話しているかどうかに依存します。後者の場合のみ、インターネットは本当に高速で信頼性があります。ユーザーのコンピューターは高速であることが保証されておらず、確かに信頼できません。

UDPを使用すると、作成しているTCPのような実装をより細かく制御できます。これにより、順不同でパケットを実行したり、不要だと思われるパケットを破棄したり、重要と思われるパケットを再試行したりする際の柔軟性が向上します。ただし、これは、必要な場合、および必要な専門知識がある場合にのみ実行してください。

そのような柔軟性がなければ、TCPは十分に機能し、時間を大幅に節約します。プロのスタジオ(私が働いていたような)でさえ、UDPを絶対に必要とせず、ネットワークプログラミングに専念している人がいる場合、TCPを使用します。


また、「何のために」重要なのかを提案します。たとえば、ゲーム内チャットシステムの場合、UDPは考慮しません。私が検討する他のことは(少なくとも「クライアントサーバー」の場合)サーバーがどれだけ効率的にトラフィックを処理できるかです-現代のNICにはTCP用の組み込みの「オフロード」のものがたくさんあります(パケットの分割とマージ、パケットのストリームへのソート、など)は、CPUオーバーヘッドを削減するように設計されており、そのほとんどはUDPでは機能しません。
ブレンダン

1
UDPを使用し、デフォルトでTLSを使用して暗号化されるHTTP / 3の一部となるQUIC(en.wikipedia.org/wiki/QUIC)が変更される可能性があります。これが広く利用できるようになるにはしばらく時間がかかり、楽しみにしています。対処する必要があるいくつかの問題の詳細はこちら blog.cloudflare.com/the-road-to-quic
ARau

3

@Ordousが指摘したように、「インターネットは今や非常に高速で信頼できる」と言うのは仮定であり、危険なものでもあります。

配信クリティカルパケットのUDP +カスタムプロトコルがほとんどのゲームで魔法をかける理由は、パケットを失うと「大丈夫」になる場合があるためです(たとえば、ゲームプレイを完了するための2次非クリティカルイベントのため) 、カーソルの移動などのデータを失うことは「まったく問題ない」場合もあります(私は生計を立てるためにゲーム開発を行っていないので、漠然とした例はご容赦ください)

UDPは、デフォルトで何度もプッシュするのに時間を無駄にしません。

また、多くのゲームでは、「常に確実に配信する必要がある」パケットよりも「時々失うことのある」パケットが多いようです。したがって、このタスクに自然に適合します。

UDPに必要なのは、「常に必ず配信する必要がある」パケットを適切に配信し、残りのゲームデータをネットワーク接続に任せるカスタムプロトコルを使用することだけでした。

次に、送信するデータの大部分を構成するトラフィックの種類を決定することで、より適切に決定することができます。

TCPに反する点は、再試行に費やした時間を、今重要なパケットの送信に費やすことができるということです。

また、送信中に問題が発生した場合、TCPはユーザーのゲームプレイシナリオをさらに細分化し、UDP +カスタムスタックと比較してユーザーエクスペリエンスを損なう可能性があります(この最後の部分は単なる予感です。これについて他の専門家にコメントしてください。このシナリオの可能性について学びたいと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.