問題タブ [hole-punching]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
p2p - MaidSafe-Routing の代替手段 (p2p ルーティング、C または C++ の NAT トラバーサル ライブラリ) はありますか
MaidSafe-Routing は、p2p ルートを維持し、STUN なしで NAT トラバースを実行できます。NAT traversal や DHT 専用のライブラリが多数あります (Chord や Chimera など)。DHT と NAT トラバースを備えた MaidSafe-Routing のような他の C/C++ ライブラリはありますか? ありがとうございました。
java - 異なるネットワークの NAT の背後にある 2 つのクライアント間で TCP 接続を確立する方法は?
2 台の PC (A と B としましょう) が各パブリック IP の NAT の背後にあるセットアップがあります。そのため、それぞれが独自の異なるプライベート IP を持っています。間にサーバーを使用しています。これにより、IPアドレスとポート番号が交換されます。また、内部ポート番号も交換します..!
というわけで、基本的にはこの設定です。
クライアント A と B は次のコードを実行します。
サーバーSのコードは次のとおりです。
そして、出力は、内部ポートと外部ポート、およびパブリック IP を完全に交換していることです。
問題は、この情報を使用して A と B の間で TCP 接続を開くにはどうすればよいかということです。Java を使用して TCP パンチ ホールを実装するにはどうすればよいですか?
PS: TCP 接続であることが最も必要であり、そのために Java を使用する必要があります。
networking - モバイル ネットワークに最適なピア ツー ピア技術
モバイルユニットとユーザー電話間のピアツーピア通信の設計を担当しています。モバイルユニットは自動車を対象としているため、多くのさまざまな ISP に接続できる可能性があります。また、クライアントが頻繁に切断されることも予想されます。WiFi などの通常のネットワークとほとんど変わらないモバイル ネットワークの条件に適用できる、NAT トラバーサル技術で最適なソリューションを見つける必要があります。よく使用される手法を検索し、 TCPまたはUDP ホール パンチング、NUTSS、NATBLASTER、NatTrav、または STUN や ICE などの公式プロトコルなど、さまざまな手法を見つけました。
同様の条件下で実証済みの技術を教えてもらえますか?
どうもありがとうございました
udp - STUNを使った穴あけ
現在、インターネット経由で UDP メッセージを送信しようとしていますが、エンドポイント A と B (両方とも NAT の背後にあります) の両方にファイアウォールを設定する必要があります。これを行うには、STUN サーバーを使用してホール パンチングを使用したいと考えています。
A が STUN サーバーへの要求を作成すると (たとえば、プライベート: 85.1.1.12:6000 およびパブリック: 173.194.78.127:19302)、応答として 85.1.1.12:6000 が返されます。同じ発信元構成 (STUN 要求に使用された同じ発信元 IP とポート) から他の宛先アドレス (宛先ポートは同じまま) にパケットを送信する場合、NAT はパブリック ポートを再度変更します ( 6000 からその他)。2 つの異なる STUN サーバー要求 (両方の要求にポート 19302 を使用) に同じアドレス ポート構成を使用することでわかりました。
このように、パケットを B に送信するときに NAT がどのポートを変換するかを知る可能性はありません (ファイアウォールが設定されていないため、B は何も受信できません)。
これは、私の NAT タイプがホール パンチングと互換性がないためですか、それとも概念が間違っているためですか?
ありがとう!
networking - P2P NAT トラバーサル
C/POSIX で P2P アプリケーションを実行していますが、NAT トラバーサルに行き詰まっています。
これを行う複数の方法 (MiniUPnP、手動ポート転送、TCP/UDP ホール パンチング) とそれに関する多くの質問について読みましたが、いくつかの問題が見つかりました。
- MiniUPnP : Transmission-cli がポートフォワーディングに使っているのを見たので、MiniUPnPのソースコードをダウンロードして理解しようとしたのですが、めんどくさくて断念しました。それを実装するためのドキュメントのようなものを検索しました(「この関数は何かを行うにはその構造が必要で、これを返す」など)が、有用なものは見つかりませんでした。(この目的のために作成されたライブラリを使用するだけでよいため、これが最もクリーンな方法だと思います。誰かがそのコードの使用方法を知っている場合は、私を助けてください)
- 手動ポート転送: ユーザーがルーターの設定を台無しにしないでほしいと思います。すべての作業はコードで行う必要があります。
- TCP ホール パンチング: ホール パンチングに関するこの記事を読みましたが、これが最も簡単な方法だと思います (パブリック IP を持つ VPS も持っているので、ランデブー サーバーのように使用できます) が、接続できません。異なる NAT の背後にある 2 人の異なるユーザー。
シナリオ
p2pネットワークに参加するすべてのピアを記録するメインサーバー(VPS上)があり、これが起こります:
- PeerA はネットワークに参加し、サーバーにカップル (A_LOCAL_IP:A_LOCAL_PORT) を送信します。
- サーバーは、A のパブリック IP (XXXX) とパブリック ポート (AAA)、および A から送信されたカップルを保存します。
- PeerB がネットワークに参加し、サーバーにカップル (B_LOCAL_IP:B_LOCAL_PORT) を送信します。
- サーバーは、B のパブリック IP (YYYY) とパブリック ポート (BBB)、および B から送信されたカップルを保存します。
- PeerA と PeerB の両方が、accept() を待って for ループに入り、着信要求を処理するスレッドを生成します。
- PeerA が PeerB と接続したい
- PeerA はサーバーに、PeerB の IP:port を尋ねます
- サーバーは PeerA に (YYYY:BBB) と (B_LOCAL_IP:B_LOCAL_PORT) の両方を送信します [同じ NAT に属している場合は、この最後のもの]
- PeerA は、接続を試行する for ループに入るスレッド、またはポート「BBB」を介して「YYYY」を使用するスレッド、またはポート「B_LOCAL_PORT」を介して「B_LOCAL_IP」を使用するスレッドを生成し、「メイン スレッド」は接続を受け入れようとして for ループに入ります。
- サーバーは、(XXXX:AAA と (A_LOCAL_IP:A_LOCAL_PORT) の両方のペアを PeerB に送信します。
- PeerB は、接続を試みる for ループに入るスレッド、またはポート「AAA」を介して「XXXX」を使用するスレッド、またはポート「A_LOCAL_PORT」を介して「A_LOCAL_IP」を使用するスレッドを生成し、「メイン スレッド」は接続を受け入れようとして for ループに入ります。
これが取り引きです: (B_LOCAL_IP:B_LOCAL_PORT) カップルを使用すると、正常に動作します。(YYYY:BBB) カップルを使用すると、機能しません。
「ECONNREFUSED」の場合は指数バックオフを使用し、(YYYY:BBB) カップルを使用しようとすると、出力されます
接続拒否。スリープ 1 秒
接続が拒否されました。スリープ 2 秒
接続が拒否されました。スリープ状態 4 秒
接続が拒否されました。Sleeping 8 seconds
接続が拒否されました。スリープ 16 秒
接続が拒否されました。スリープ 32 秒
最大タイムアウトの期限が切れました。中止しています...
もちろん、これは、別の NAT の下にいる誰かが私の NAT の下のピアに参加しようとしたときにも発生します。
これがそれであり、これらは私の質問です:
- (B_LOCAL_IP:B_LOCAL_PORT) の組み合わせを使用し、(YYYY:BBB) の組み合わせを使用しないのはなぜですか?
- NAT にスルー ホール パンチを実現できない構成/アーキテクチャが含まれている可能性はありますか?
sockets - p2p データ転送用の udp ホール パンチングの設定にヘルプが必要です。STUN が機能しない
あるクライアントから別のクライアントに UDP パケットを送信しようとしています。C1をデータを受信するために使用しているクライアント、C2をデータを送信するクライアントとします。私がやっていること:
両方のクライアントのパブリック IP アドレスとポートを STUN サーバーに問い合わせます。
各クライアントに、他の IP アドレスとパブリック ポートを通知します。
C1は、 C2のパブリック アドレスとポートでパケットを送信し、パケットのリッスンを開始します。同時に、C2は送信したいデータを含むパケットの送信を開始します。
C1は、到着しないパケットを受信するとハングアップします。UDP ホール puching を間違っていますか?
同じネットワーク上の同じコンピューター上の両方のクライアントでこれをテストしていますが、サーバーはパブリック IP を持つ別のネットワーク上のサーバー上にあります。私が言おうとしているのは、テスト中に両方のクライアントのパブリック アドレスが同じであるということですが、これは問題ですか?
アップデート:
ルーターでヘアピニングが許可されていることがわかりました。ルーターの UDP ポートを転送し、パブリック IP アドレスを使用して、あるクライアントから別のクライアントにパケットを送信できます。
これは、C# でホール パンチを実行できるかどうかをテストするために使用しているコードです。
更新 2:
@Tahlil の助けを借りて、NAT タイプのチェックに使用したアルゴリズムに欠陥があり、対称 NAT の背後で穴あけをしようとしていたことがわかりました。したがって、問題は私のコードの間違いに気付かなかったことです...同じ問題に直面しているすべての人に、確実にNATタイプをアサートすることをお勧めします。
ご協力ありがとうございました。
udp - 既存のアプリケーションの UDP ホール パンチング
大学のネットワークで YAWCam を使用しようとしています。別のネットワークの背後にある別のアプリケーションがアクセスする必要がある mjpg ストリーマーとして使用しています。残念ながら、大学のネットワークにポート転送する方法はありません。udp-hole Punching に入ります。これを知ったときは素晴らしいと思いましたが、このプログラム (オープンソースではない) を実際に変更する方法を理解できない限り、UDP ホール パンチングを従来の方法で機能させることはできないことにすぐに気付きました。
私の質問は、元のプログラムを変更せずに穴を開ける方法はありますか? おそらく、yawcam が穴を開けるのに使用する同じポートからパケットを送信し、通常のリクエストでそれを更新させることでしょうか? 私はネットコードに少し慣れていないので、これに対する「正しい」方法が何であるか完全にはわかりません。