2011-12-15 22 views
28

私は、ポート4900で動作するカスタムP2Pプログラムを作成しています。ルータの後ろにいる場合、このポートはインターネットからアクセスできない場合があります。プログラミングP2Pアプリケーション

インターネットからのポートへのアクセスを自動的に有効にする方法はありますか?私は他のP2Pアプリケーションがどのように動作するのかは分かりません。

誰もがこれにいくつかの光を投げてくださいできますか?いくつかのケースでの解決策はあります

+0

[.NET用のUPnPライブラリ(C#またはVB.NET)はありますか?](http://stackoverflow.com/questions/333079/is-there-a-upnp-library-for -net-c-or-vb-net) – David

+2

@David UPnPは確かに「答え」ですが、私は重複しています。 – jv42

+2

@ jv42:十分に公正なので、クロージングには5票が必要です。少なくともOPは有用で関連する情報を指しています。私はStackOverflowのエチケットが同じ答えを再投稿する以上の方法で重複をリンクすることを好むと思います。しかし、私はこれらの2つが十分に異なっているのを見ることができます。いずれにせよ、OPが助けられる限り、任務は達成される:) – David

答えて

89

一言で言えば、P2P接続です。ここでUDPについて話しているとします。以下の手順は、TCPをいくつか調整して適用することもできます。

  1. すべてのローカルIPアドレス(通常は1)を列挙します。指定されたポート番号**にIPアドレスを持つ各アダプタのUDPソケットを作成します。

  2. 手順1で作成した各ソケットについて、同じソケットでSTUNまたはTURNサーバーに連絡して、外部IPアドレスを検出し、内部ポート番号がNAT外部にマップするものを検出します値)。つまり、あなたのローカルアドレス192.168.1.2:4900は外の世界に128.11.12.13:8888であるかもしれません。また、一部のNATは、同じローカルポートを他のIPアドレスに使用する場合、常に同じポートマッピングを使用するとは限りません。 TURNはまたあなたに「中継アドレス」を提供します。 UPNPを使用して、そのプロトコルをサポートしている場合は、ルータから直接ポートマップアドレスを取得することもできます。

  3. ランデブーサービス(SIP、XMPP、インスタントメッセージ、Webサービス、電子メール、文字列を持つコップ)を使用して、アドレス候補リストをサービスに公開するか、「ヘイ、私あなたとつながりたい "と言います。このメッセージには、ステップ1および2で収集されたすべての「アドレス候補」(IPおよびポートのペア)が含まれます。

  4. リモートクライアントは、接続の招待状を受信すると上記の手順1および2も実行します。次いで、招待者の候補リストを受信したのと同じチャネルを介して候補リストを返信する。

  5. 穴あけステップ。両方のクライアントは、UDPを介して相手側のアドレス候補にテストメッセージを送信し、最後に同じメッセージを待機します。メッセージが受信されると、それが来たアドレスに返信します。最終的に、クライアントは、データグラムを確実に送信できるアドレスのペアがあることを発見します。典型的には、1つのエンドポイントは、どのアドレスペア(ソケット)が通信するかについて最終決定を下し、プロトコルはこのエンドポイントがこの決定を他のエンドポイントに伝えるのを容易にする。

** - 通常は、よく知られているP2Pクライアントのポートに頼らないことをお勧めします。同じNATまたはファイアウォールの背後にある2つのクライアントは、同時にあなたのソフトウェアを使用できない可能性が高いためです。

ここでは、いくつかの技術を簡単に紹介します。

STUN - NAT /ルートの背後にあるクライアント用のシンプルなサーバーとプロトコルで、外部IPとポートのマッピングを検出します。

TURNはSTUNへの拡張ですが、ファイアウォールとNATが直接接続を妨げるP2P接続シナリオの中継をサポートしています。

ICEは、STUNとTURNを使用してP2P接続を設定する一連の手順です。 ICEは上記のステップ1〜5の正式なプロトコルです。 ICE上の2つの優れたスライドセットは、herehereです。

WebRTCは、ICE標準の変形であり、STUNおよびTURNとのP2Pセッションを作成するための参照ライブラリです。

UPNP + Internet Gateway Device Protocol - 一部のルータは、ホストがポートマッピングを自動的に取得するためにこれをサポートしています。

libniceは、ICEを実装するLinux用のオープンソースのCライブラリです(Windows上で動作する可能性があります)。

libjingleはGoogleの別のICE実装(C++)です。 WindowsおよびLinuxの場合。

PJNATHは、PJSIPコーディングライブラリスイート内のライブラリである。これはICEスタック(Cコード)の優れた実装であり、多くのプラットフォームに移植されています。 (Windows、Linux、Mac、iOS、Symbian、まもなくAndroid)

最後に、私はmy STUN server code baseを使用するための露骨なプラグがあります。

+0

ありがとうございます。 – Jayesh

+0

@selbie、STUN/TURN/ICEの実装が可能ですか? – JagsVG

+1

@jagsgediya - はい。ほとんどの場合、TURNを介して収束します。 – selbie

4

、UPnPの参照:https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

をマイホームルータは、これは、基本的には、NATは、コンピュータから適切な要求によって自動的に設定することができますことができます。

多くのルータでサポートされていないため、これを有効にしているわけではないため、これを考慮することはありません。

EDIT:Is there a UPnP Library for .NET (C# or VB.NET)?

1

これは、あなたが探しているものよりも少し複雑かもしれませんが、TCPホールパンチングが動作するはずテクニックです:@デビッドがUPnP用の.NETライブラリのために、このSO質問を示唆しました。 http://en.wikipedia.org/wiki/TCP_hole_punching

また、UPnPは、それをサポートするルーター/ファイアウォールに最適です。

2

私はWebRTCテクノロジをそのようなアプリケーションのオープンソースフレームワークとして使用します。

Official Website

実際にはそれが箱から出して、ピア・ツー・ピア技術のために必要なすべてのをサポートするオープンソースのプロジェクトです:

  • ICEとSTUN(NATトラバーサル)
  • DTLSおよびSRTP(セキュリティ)
  • ストリーミングの品質のためのAVPF。
関連する問題