2012-01-17 51 views
13

誰でもUDPホールパンチングの例を挙げられますか?UDPホールパンチングアルゴリズム

実際に、お互いのIPを知っている人がチャットできるチャットプログラムを作成したいと思います。しかし、両方のマシンはファイアウォールで保護されたルータの後ろに置かれます。だから、私は通信するために穴を開ける必要があります。

私は機能をしたいと思い

、このような関数を呼び出すには、穴がパンチされていたであろうと、将来の通信を簡単に移動すること - それは:)

を求めても過言ではないかどう
+1

可能なデュープ:http://stackoverflow.com/questions/8523330/programming-p2p-application/8524609#8524609 – selbie

+0

ちょうどその意志を呼び出すことができます簡単な関数はありませんすべてのNATトラバースの問題を解決します。 NATトラバーサルとP2Pについては、上記のリンクを参照してください。 – selbie

答えて

18

短い答え:それができます」確実に行われます。

ロング回答:

「ホールパンチングは、」インバウンドトラフィックを許可するには、ルータの自動NATルールをトリガを指します。 UDPパケットを送信すると、ルーター(通常)は送信元アドレスとポートを宛先アドレスとポートにマッピングする一時的なルールを作成します(逆も同様です)。宛先アドレスとポート(およびその他のもの)から戻ってきたUDPパケットは、元の送信元アドレスとポートに渡されます(その他はありません)。このルールは、数分間使用しないとタイムアウトします。

両方のエンドポイントがNATまたはファイアウォールの背後にある場合、これを実行すると、両方のエンドポイントがほぼ同時に同じパケットを互いに送信する必要があります。これは両側がお互いのIPアドレスとポート番号を知らなければならないことを意味し、何らかの他の手段でこれを互いに伝達する必要があります。

NATの背後にある場合(つまり、192.168.x.xなどのプライベートアドレスのみが表示される)、プログラムが自分のパブリックIPアドレスを直接決定する方法はありません。しかし、関係する人間がお互いのIPアドレスを知っていると仮定しているので、それらの人間は相手のアドレスにちょうど入力することができます。

しかし実際には、ルータが公共側でどのポート番号を使用しているかをプログラムが直接判断する方法はないということです。あなたのプログラムはローカルマシンの12345にバインドされているかもしれませんが、ルータはそれを公共側のほぼすべてのポートにマップすることができます。 (ローカルネットワーク上の2台のコンピュータがポート12345から送信されていることを想像してみてください。明らかにルータはそれらのうちの1つを別の番号にマップする必要があります)だからあなたと人間はローカルポート番号を知っているかもしれません。ルータが世界にどのようなポート番号を表示するかを知る方法はありません。

+9

セス - あなたはNATトラバーサルの問題を非常にうまく説明しますが、解決することは不可能な問題のように思えます。しかし実際には、STUN、TURN、ICE、および信頼できるシグナリングサービスの組み合わせにより、P2P接続は非常に信頼性が高くなります。それを別の方法で置く - パブリックインターネットヘルプノード上のサーバーは直接接続されます。 – selbie

+0

サードパーティのリレーに確実に接続できれば、問題が大きく解消することは間違いありません。 @ c.adhityaaは実際には直接のコミュニケーションが必須とは言わなかったので、私は尋ねたはずです。また、信頼性の要件を緩和して、両方のピアに同時に複数のデータグラムを送信させると、多くの時間がかかることがあります。私は企業のファイアウォールを扱うことに慣れているので、ネットワークが許すものについて過度に悲観的かもしれません。 –

7

Lidgrenのネットワーキングライブラリには、この機能が組み込まれています。ライブラリをアプリケーションに追加した後、NetServerをインスタンス化し、2つのNetClientを接続し、NetServer.Introduce()を呼び出します。 Lidgrenへ

リンク:https://github.com/lidgren/lidgren-network-gen3