12


7

MMORPGクライアント/サーバー通信ではUDPおよびTCPプロトコルはどのように使用されますか?

例えば:

クライアントはUDPを介してサーバーにブロードキャストしますか(プレーヤーの位置など)? またはその逆?

あるいは、クライアントがサーバーからプレーヤーへの移動を要求するTCPを使用するようなものです。 サーバーは要求を受信し、プレーヤーを移動して、プレーヤーが現在位置xyzにいることをクライアントに返信します。

チャットチャネルはTCPを使用して実装する必要がありますか?

これについて何か良い記事/本はありますか? 私は小片を見つけました、しかしそれは本物の肉とポテトが経験から獲得されるようです。

9 回答


8


多くのゲームは動きに関連した活動のためにUDPを使用します - あなたが歩いているときのように、それで、チャンスはたくさんのUDPリクエストが送信されているようです。 それでもサーバーは最終的にそれが有効かどうかを制御しますが、すべてのパケットがサーバーに届くかどうかは必ずしも気にする必要はありません。 これが、多くのゲームクライアントがある種の予測メカニズムも使用している理由です。

あなたの2番目の言及に関して言えば、はい、すべてのコントロールがサーバーによって管理されることは非常に一般的です。 クライアントがサーバに何かをブロードキャストしてほしくない。ハッキングを防ぐために、サーバー側でエラーや入力処理をするべきです。 1秒あたりの入力を制限することもできます。

とにかく、UDPとTCPの組み合わせが適切でしょう。「信頼性とスピードのどちらが欲しいですか」と自問する必要があります。


4


さまざまな実装が考えられますが、ほとんどの場合、これらは次のようになります。 このパターンはゲームの世界ではほとんどすべてのアクションで繰り返されます。

  1. クライアントは、プレイヤーが移動したいことをサーバーに伝えます。

  2. クライアントは、プレイヤーが起こるべきと考えていることに従って動いているプレイヤーを表示します。

  3. サーバーは、プレーヤーの場所を考慮して、移動が起こり得ることであることを検証します。

  4. サーバは、サーバが関係している限りプレーヤがどこにいるかに関してクライアントを更新する。

  5. クライアントは、サーバーの世界状態を反映するようにプレーヤーの位置を更新します。


4


あなたは真実の情報を伝えるためにクライアントに頼ることはできません。 誰かがプロトコルをハックしてカンニングするでしょう。 データを暗号化してもこれを止めることはできません - それをやや困難にするだけです。

クライアントは動きなどのリクエストを送信するだけでよく、サーバはリクエストを健全性チェックして、ゲームのルールに違反していないことを確認する必要があります。 サーバーは、クライアントが絶対的に必要とするデータのみを返送するべきです - あなたは、世界のデータの塊を得るためにクライアントに頼ることはできず、プレーヤーが現在観察できないすべてを除外することはできません。 誰かが追加情報を入手して悪用するでしょう。

ゲームを「リアルタイム」にする必要がある場合、クライアントはサーバーが移動要求を許可し、それに応じて表示を更新すると想定し、サーバーが後でそれを修正した場合は移動をロールバックします。 ほとんどの場合、クライアントとサーバーは一致し、すべてが円滑に流れます。 クライアントが詐欺しようとしている(とにかく彼らのせいである)とき - 彼らは同意しません - またはクライアントは貧弱な接続(あなたがそれについてすることができるあまり多くない)のためにひどく遅れています。


1


あなたの質問(使用されているトランスポート層プロトコル)の半分は、wireharkをインストールしそしてトラフィックを見ることによって答えられるかもしれません。


1


あなたは プロジェクトDarkstarに興味を持っているかもしれません。 これはオープンソースのMMOフレームワークです。


1


私はあなたが他の人がこれらのタイプのシステムを実装した方法を読むことから*たくさん*学ぶことができると思います。 その無駄で、私は_Tim Sweeney_と_The Croquet Consortium_の作品にあなたを向けるかもしれません。

Tim Sweeneyの論文は私がプログラミングについて考える方法を変えました。 あまりお勧めできません。


0


私はプレーヤーとしての観察以外の詳細は知りませんが、ほとんどのゲームは間違いなくサーバーの応答がキャラクターを動かすのを待たず、ターンベースでない限りユーザーエクスペリエンスを損なうことになります。 起こりそうなのは、動きがクライアント側で行われ、それから他のプレイヤーにそれらのメッセージを送るサーバーに送られるということです。 少なくともWoWでは、プレイヤーが遅れている場合、プレイヤーはまだ前進していて、後で別の場所に魔法のように表示されることがあります。つまり、クライアントはロケーションデータ以上のものを受信します。そしてそれ以上のデータがない場合の動きを推定します。


0


あなたの最善の策は、おそらくPlaneshiftのネットワークコードを見てみることです、それはオープンソースのMMOです。 私はそれが現場で最も発達していると信じています(最後に確認しました)。


0


この質問に対する簡単な答えは1つもないと思います。その範囲は非常に広いのです。 それでも、いくつかのポイント:

  • UDPを使用しているからといって「ブロードキャスト」する必要はありません。 私の経験では、UDPはほとんどの場合ポイントツーポイントです。

  • UDPを介して独自の「安全な」通信を行うことは完全に可能です。TCPを使用する必要はありません。 魔法ではない、ただ… 巧妙で複雑です。 :)しかし、ほとんどの場合、TCPがゲームのリアルタイムのコミュニケーションには適していません。

  • TCPをより適切にする方法はいくつかあります。例えば、 "Nagle algorithm"を検索してください。

  • すでに自分のロスレストランスポートプロトコルをロールオーバーしているのであれば、UDPを介してチャットすることができます。 これに多くのゲーム。

Gamasutraにはネットワーキングに関する記事がありますが、今は便利なリンクはありません。 まだ公開されているのかどうかは定かではありません。