web-dev-qa-db-ja.com

P2Pアプリケーションのプログラミング

ポート4900で実行されるカスタムp2pプログラムを書いています。人がルーターの背後にいる場合、インターネットからこのポートにアクセスできない場合があります。

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

誰かがこれにいくつかの光を投げることができますか?

38
Jayesh

一言で言えば、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サービス、電子メール、文字列付きのcups)を使用して、アドレス候補リストをサービスに公開するか、または「他のクライアントに接続したい」という通知を他のクライアントに送信します。 」このメッセージには、ステップ1および2で収集されたすべての「アドレス候補」(IPとポートのペア)が含まれています。

  4. リモートクライアントは、接続の招待を受信すると、上記のステップ1と2も実行します。次に、招待者の候補者リストを受け取ったのと同じチャネルを介して候補者リストを送り返します。

  5. 穴あけステップ。両方のクライアントは、UDPを介して相手側のアドレス候補にテストメッセージを送信し始め、それらの側で同じメッセージをリッスンします。メッセージを受信するたびに、メッセージの送信元のアドレスに返信してください。最終的に、クライアントは、データグラムも確実に送信できるアドレスのペアを持っていることを発見します。通常、1つのエンドポイントが通信するアドレスペア(ソケット)について最終的な決定を行い、プロトコルはこのエンドポイントが他のエンドポイントにこの決定を伝えるのを容易にします。

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

ここでは、探索するいくつかのテクノロジーの簡単な要約を示します。

[〜#〜] stun [〜#〜] -NAT /ルートの背後にあるクライアントが外部IPおよびポートマッピングを検出するための単純なサーバーおよびプロトコルです。

[〜#〜] turn [〜#〜] はSTUNへの拡張ですが、ファイアウォールとNATが直接接続を防止するP2P接続シナリオのリレーをサポートします。

[〜#〜] ice [〜#〜] は、P2P接続のセットアップにSTUNおよびTURNが使用される一連のステップです。 ICEは、上記のステップ1〜5の正式なプロトコルです。 ICEのスライドの2つの優れたセットは herehere です。

WebRTC は、ICE標準のバリアントであり、STUNとTURNを使用してP2Pセッションを作成するための参照ライブラリです。

PNP +インターネットゲートウェイデバイスプロトコル -一部のルーターは、ホストがポートマッピングを自動的に取得するためにこれをサポートしています。

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 を使用するための露骨なプラグを持っています。

111
selbie

いくつかのケースで解決策があります。UPnPを参照してください: https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

私のホームルーターはこれを許可します。基本的に、NATはコンピューターからの適切な要求によって自動的に構成できます。

可用性を大幅に向上させるためにこれを当てにするとは思わないでしょう。なぜなら、多くのルーターがそれをサポートし、有効にしているわけではないからです。

編集:@Davidはこれを提案しましたSO UPnPの.NETライブラリの質問: 。NET(C#またはVB.NET)のUPnPライブラリはありますか?

4
jv42

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

公式サイト

実際、それはピアツーピアテクノロジーに必要なすべてをそのままサポートするオープンソースプロジェクトです。

  • ICEおよびSTUN(NATトラバーサル)
  • DTLSおよびSRTP(セキュリティ)
  • ストリーミング品質のAVPF。
3
ankitr

別のオプションがあります NATポートマッピングプロトコル(NAT-PMP) NAT-PMPは、SkypeまたはBitTorrent P2PクライアントなどのVoIPアプリケーションで広く使用されています。

1
loretoparisi

これはあなたが探しているものより少し複雑かもしれませんが、TCP穴あけはうまくいくはずのテクニックです http://en.wikipedia.org/wiki/TCP_hole_punching

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

1
Matthew