ポート転送なしのネットワーキング


8

ゲームにネットワーク機能を追加しようとしています。すべてのユーザーがゲームをホストでき、誰もがクライアントとして接続できるようにしたい。クライアントは、プレーヤーの位置などに関する情報をホストに送信します。ホストはメッセージを受信すると、それを検証し、他のクライアントにブロードキャストします。私は主にUDPを扱いますが、チャットやロビーなどのためにTCPも必要になります。

問題は、ルーターでポート転送を有効にしないと、クライアントからホストに、またはその逆にパケットを送信できないように見えることです。しかし、私はこれが必要だとは思いません。ポートフォワーディングが必要な理由は、LAN上の1台のコンピューターから別のLAN上の別のコンピューターにパケットを送信したいためですが、LAN内にあるため、どちらもグローバルIPアドレスを持っていません。そのため、実際には、他のネットワークのルーターをターゲットとするパケットしか送信できません。そのルーターは、到達したいマシンに転送する必要があります。では、ポート転送なしでこれを行うにはどうすればよいですか?どういうわけか、Webサーバーは、グローバルIPを持たない私のコンピューターと、ポート転送なしで通信できます。また、ポートフォワーディングを有効にする必要のないマルチプレイヤーゲームをたくさんプレイしました。だからそれは可能でなければならない。

ところで、私はSDL_Netを使用しています。でもこれが何かを変えるとは思いません。


WebサーバーにはグローバルIP(またはその前にあるデバイス)があります。
Oskar Duveborn 2011年

回答:


13

多対1のNAT(1つのパブリックアドレスの後ろにプライベートアドレスを持つ多くのコンピューター)は次のように機能します。ルーターは送信パケットを追跡し、応答を受信すると、元の要求を送信した内部コンピューターに送信できます。したがって、パブリックIPアドレスを使用してWebサイトにアクセスした場合、これは正常に機能します。

ただし、ルーターで転送ルールが定義されていない限り、最初のパケットを外部から内部の特定のコンピューターに送信することはできません。特定のコンピューターをアドレス指定する方法がなく、ルーターに情報がありません。返信ではないため、彼の接続テーブル。

Skypeは、ファイアウォールホールパンチングと呼ばれる一般的な手法を開発しました。パブリックアドレスを持つサーバーがクライアントからアクセスされます。次に、クライアントBのルーターが次の送信パケットのソースポートとして使用することを期待しているポートで、クライアントBのルーターにudpパッケージを送信するように応答をクライアントAに送り返します。また、クライアントBに、Aのルーターが次の送信パケットの送信元ポートとして使用することを期待しているポートで、クライアントAのルーターにパケットを送信するように指示します。予測が正しければ、AとBは直接会話できます。

ファイアウォールホールパンチでは、モデレーターとして機能するパブリックIPアドレスを持つサーバーが必要です。また、発信ソースポートを正しく予測するには、一般的なNATルーターの実装に関する多くの知識が必要です。ありますが、オープンソースの実装が可能な、あなたはそれが信頼できないと頭痛の多くを引き起こすため、この技術を回避しようとしてください。Skyeは、予測が失敗した場合、パブリックIPアドレスを持つサーバーを使用してすべてのパケットをリレーするようにフォールバックします。


4

どういうわけか、Webサーバーは、ポート転送なしで、グローバルIPがないコンピューターと通信できます

重要なのは、Webサーバー自体にグローバルIP /ポートのペアがあり、それを一意に識別することです。コンピューターはWebサーバーに接続し、Webサーバーは同じチャネルを介して情報を送り返します。

ピアツーピアゲームの一般的なケースであるように、両側が何らかのNATの背後にある場合、この手法は明らかに利用できません。したがって、代わりに、NATをだます必要があります。

探している手法は、ホールパンチングまたはパンチスルーと呼ばれ、特にUDPホールパンチングまたはTCPホールパンチングと呼ばれます。この場合、両方のクライアントがグローバルサーバーに接続します。グローバルサーバーは、既存の接続によってファイアウォールの「穴あけ穴」を介して、相互に接続する方法を指示します。

ホールパンチングでは、初期接続とハンドオフを処理するためにグローバルIP /ポートを備えたパブリックサーバーが必要ですが、帯域幅/処理要件はごくわずかです。グローバルロビーサーバーがあれば、簡単に処理できるはずです。


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