15

私は多くの同様の質問とそれに対応するウィキペディアの記事(NATトラバーサルSTUNTURNTCPホールパンチング)を見て読んだことがありますが、圧倒的な量の情報は私の非常に単純な問題を本当に助けてくれません:

P2Pアプリケーションを作成していますが、NATの背後にあるアプリケーションの2人のユーザーが相互に接続できるようにしたいと考えています。接続は信頼できる(TCPの信頼性に匹敵する)必要があるため、UDPに切り替えることはできません。このソリューションは、再構成せずに今日の一般的なシステムで機能するはずです。それが役立つ場合、データ全体をプロキシする必要がない限り(たとえば、ピアの外部(WAN)IPアドレスを取得するため)、ソリューションには接続可能なサードパーティが関与する可能性があります。

私の知る限り、私の唯一の選択肢は、「信頼できるUDP」ライブラリとUDPホールパンチングを使用することです。このための(C / C ++)ライブラリはありますか?関連する質問でenetを見つけましたが、それはソリューションの前半のみを処理します。

他に何か?私が見たもの:

  1. Teredoトンネリング-オペレーティングシステムやユーザー構成からのサポートが必要です
  2. UPnPポートフォワーディング-UPnPはどこにも存在/有効ではありません
  3. TCPホールパンチングは実験的なもののようで、特定の状況でのみ機能します
  4. SCTPはIPv6よりもさらにサポートされていません。SCTP over UDPは、非常に信頼性の高いUDPです(上記を参照)
  5. RUDP-主流のサポートはほとんどありません
  6. STUN、STUNT、TURN、ICEについて私が理解できたことから、これらのどれも私をここで助けてくれませんでした。
4

2 に答える 2

6

ICEは、接続先の候補IP/ポートターゲットのリストを収集します。各ピアはこれらを収集し、チェックに合格するかチェックに失敗するまで、各候補に対して順番に接続チェックを実行します。

アリスがボブに接続しようとすると、彼女はどういうわけか、ボブによって決定された可能な方法のリストを取得します。彼女はボブに接続する可能性があります。ICEはこれらの候補者を呼び出します。ボブは、たとえば、「私のローカルソケットの192.168.1.1:1024/udp、私の外部NATバインディング(STUNを通じて検出)は196.25.1.1:4454/udpであり、1.2でメディアリレー(ミドルボックス)を呼び出すことができます。 .3.4:6675 /udp"。ボブはそれをSDPパケット(これらのさまざまな候補の説明)に入れ、何らかの方法でアリスに送信します。(SIPでは、ICEの元のユースケースであり、SDPはSIP INVITE / 200 / ACK交換で運ばれ、SIPセッションをセットアップします。)

ICEはプラグイン可能であり、候補の正確な性質/数を構成できます。直接リンクを試してから、STUNサーバーにバインディングを要求し(これにより、NATに穴が開けられ、セッションの説明に挿入したその穴の外部IP /ポートが通知されます)、フォールバックできます。TURNサーバーにデータの中継を依頼します。

ICEの欠点の1つは、ピアがSDPの説明を交換することです。もう1つは、TCPサポートがまだドラフト形式であるということです。これは、問題になる場合と問題にならない場合があります。[更新:ICEは正式にRFC6544になりました。]

古いデータは役に立たないため、ゲームではUDPを使用することがよくあります。(これが、RTPが通常UDP上で実行される理由です。)一部のP2Pアプリケーションは、ミドルボックスまたはミドルボックスのネットワークを使用することがよくあります。

IRCはミドルボックスのネットワークを使用します。IRCサーバーはネットワークを形成し、クライアントは近くのサーバーに接続します。あるクライアントから別のクライアントへのメッセージは、サーバーのネットワークを通過する場合があります。

それがすべて失敗した場合は、BitTorrentのアーキテクチャを調べて、NATの問題をどのように処理するかを確認できます。CodeShadowが以下のコメントで指摘しているように、BitTorrentはネットワーク内の到達可能なピアに依存しています。ある意味で、一部のピアはミドルボックスのネットワークを形成しています。これらのミドルボックスがリレーとして機能できる場合は、IRCのようなアーキテクチャがありますが、動的に設定されます。

于 2010-09-01T20:47:46.297 に答える
3

libjingleは、P2Pネットワーク通信に大きく依存しているいくつかの主要なビデオゲーム会社で使用されているため、お勧めします。(Steamについて聞いたことがありますか?Vavleもlibjingleを使用しています。ページの「ピアツーピアネットワーク」セッションを参照してください:https ://partner.steamgames.com/documentation/api )

ただし、常に機能するソリューションは、リレーサーバーを使用することです。NATを通過する「標準」の方法はないため、ピア間で常に接続を確立する必要がある場合は、フォールバック戦略としてこのリレーサーバーオプションを使用する必要があります。

于 2011-02-23T19:27:01.990 に答える