問題タブ [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.

0 投票する
3 に答える
4583 参照

java - パブリック IP なしで http 経由で 2 台のコンピューターを接続する

コンピューター/クライアントの一方または両方がパブリック IP を持っていない場合に、コンピューター/クライアントが互いに直接接続できるようにしたいと考えています。これは、仲介者としてサーバーを使用して実行できると思います。最終的に確立される接続は、クライアント間の直接トラフィックでなければなりません。これはどのようにして可能になり、その技術は何と呼ばれますか?

Java のコード fx を見てみたいと思います。

ありがとう

0 投票する
2 に答える
552 参照

unix - 2 nat の背後で p2p を実行するには?

それぞれがファイアウォールで保護された NAT の背後にある 2 つのクライアントに「hello」を送信しようとしていますが、成功しません。今のところ、UDP または TCP パンチングは問題ありません。

クライアント A は「hello p」を受信することを期待しています:

クライアント B が hello p を送信:

残念ながら何も受信されません。

http://www.brynosaurus.com/pub/net/p2pnat/に触発された実装

0 投票する
1 に答える
3276 参照

c++ - c ++ホールパンチングUDP(RTP)

クライアント/サーバーボイスチャットプログラム(アンマネージドC ++、win32)を実行しています。このプログラムでは、クライアントはTCPを使用してサーバーに接続し、テキストチャット/チャットルーム機能はTCPで実行され、すべての音声送信は別のUDP / RTPソケットを介して送信されます(APIを使用) JRTPLIBから)。

したがって、IPはTCP接続から認識され、接続が確立された後にRTPソケットのポート番号を送信できます。

問題は、TCPでは、接続を確立してから通信が双方向で機能するためにサーバーのみがポート転送を行う必要があるのに対し、UDPではrecvfrom()を使用する必要があることです。これはafaikでポートを開く必要があります。私が望まないクライアント側の最初の場所(そして、マルチプレイヤーゲームやVoIPクライアントを見る場合は必要ありません)

たとえば、UDPホールパンチングについて説明しているソース(たとえば、http://en.wikipedia.org/wiki/UDP_hole_punching)を読んで、サーバーとのudp会話の開始について言及し続けています。それが問題です-クライアントがポートを開かなくても、実際にサーバーとudp会話を(双方向で)開始するにはどうすればよいですか?TCPでは、前述したように、サーバーにconnect()するだけで、双方向の通信が可能です。

また、RTPはUDPに基づいて構築されていることは知っていますが、UDPとは異なるRTPホールパンチング(ここでもJRTPLIBを使用)について知っておくべきことは他にありますか?

前もって感謝します!

0 投票する
3 に答える
360 参照

flash - NetConnectionにソースポートを強制することは可能ですか?

私はActionScriptを初めて使用しますが、既存のプロジェクトを解読し、いくつかの変更を加えようとしています。

新しいNetConnectionを作成し、外部ソースからメディアファイルをストリーミングすることから始まるコードのセクションがあります。ドキュメントで(URLを介して)宛先ポートを提供できることがわかりましたが、Flashに特定の送信元ポートを使用させることは可能ですか?ドキュメントでこれを行うための明確な方法を見つけることができませんでしたが、他の誰かが別の方法やアイデアを持っているかどうか興味がありました。

これの最終的な目標は、 NATホールパンチングを実行するために予測可能な方法でソースポートを使用できるようにすることです。提案や回答をありがとう!

0 投票する
3 に答える
1261 参照

p2p - サーバーを使用してルーターをバイパスして接続を開始する

p2p ベースで動作する簡単なチャット プログラムを Java で作成したいと考えています。公開サーバーを使用して接続を開始するだけです。しかし、これが可能かどうかさえわかりません。

少なくとも 1 台の PC が適切なポートを転送した場合に機能するチャット ソリューションを Java で実装することに成功しました。クライアント側でポートを転送する代わりに、外部サーバーを使用することもできました。

だから私は、どうにかして公開サーバーを使用して接続を開始し、クライアント間でデータを適切に送信して、サーバーの負荷を軽減することさえ可能でしょうか?

私はルーターの仕組みにあまり詳しくありませんが、内部 IP からパブリック サーバーを呼び出すと、ルーターはそのパブリック IP からの呼び出しと受信応答を PC に送信するよりも覚えていると思います。だから私は、おそらく最初のクライアントがサーバーに接続した場合、サーバーが2番目のクライアントに情報を渡すよりも、何らかの方法で直接通信できるのではないかと考えました。ルーターのルールがサーバーによって確立された場合は?

わかりやすく説明していただければ幸いです。そうでない場合は、ご容赦ください。これがどのように正確に行われるかさえわかりません。自分のコンセプトに何か正しいことがあるかどうかを知りたいだけで、それを実行できる可能性があるので、もっと勉強しなければなりません. ありがとう。

0 投票する
1 に答える
544 参照

network-programming - P2Pテクノロジーの比較

私はStunのようなさまざまなudpベースのP2Pテクノロジーを経験しました。最近、p2pを実装するためにUDP/TCPホールパンチングを実装しました。

ICE、UPnP、teredoなど他のテクノロジーもあることがわかりました

  1. これらのテクノロジーの違いは何ですか?
  2. 近年P2Pに使用されている最新のテクノロジー/プロトコルはどれですか。

さまざまなUDPベースのP2Pプロトコルの比較分析を提供できるものがあればそれは良いでしょう。リンクや提案をいただければ幸いです。

0 投票する
3 に答える
5182 参照

network-programming - udpパケットの損失と回復

私はファイル用のudp/tcpベースのP2Pとリアルタイムビデオストリーミングアプリケーションの両方に取り組んでいます。このアプリケーションは、c++を使用してLinuxとWindowsの両方のプラットフォーム用に開発されます。

P2Pの実装にはICE(TCP / UDPホールパンチング)を使用しています。TCPはパケット損失を保証しますが、UDPの場合は、パケットを他のピアに確実に配信するための適切なアプローチが必要です。

  1. これを行うためのアルゴリズムまたは手法を知りたかったのです。
  2. 無料のソードパーティーツール/ライブラリはありますか?

リンクや提案をいただければ幸いです。

0 投票する
1 に答える
1902 参照

networking - これは、p2pアプリケーションのTCPホールパンチングに適したフローですか?

  1. stunを使用して、外部IP/ポートとNATタイプを取得します。
  2. ミドルサーバー(パブリックIP)で、ピアの外部IP /ポートを登録します(これで、サーバーはピア1と2の外部IP /ポートを認識します)。
  3. IP /ポートを交換します(ピア1はピア2のIP /ポートを知るようになります)。
  4. connect()両方のピアから同時に電話をかけます。

それは正しい流れですか?

0 投票する
2 に答える
988 参照

udp - Skype プロトコルとスーパーノード

Skype プロトコルについて質問があります。おそらく、wiki によると、Skype のスーパーノードは UDP ホール パンチングに使用されます。スーパーノードは、ファイアウォール/NAT のないノードです。

私の質問は、これはどのように信頼できるのですか? 大多数のインターネット ユーザーは NAT の背後にいるのではありませんか?

また、この手法を使用して P2P アプリケーションを作成した場合、ファイアウォールのないピアが存在しないとどうなりますか? 最終的にNATなしでいくつかのピアが存在することに依存するアプリケーションを起動する方法がわかりません

ありがとう

0 投票する
2 に答える
3070 参照

c# - UDPホールパンチングヘルプ

Peer to Peerを使用して、インターネットを介したネットワークをゲームに追加しようとしています。.NETのピアツーピアクラスを使用してローカルネットワーク内で接続するLANのみのバージョンをすでに実装しています。

ファイアウォールの背後にある他のクライアントへの接続を確立するには、UDPホールパンチングを使用する必要があることに気付きました。

これが私がそれを実装し始めた方法です:サーバーは仕事を成し遂げるために非常に単純なPHPスクリプトを使用するHTTPサーバーです。

    • サーバーに名前を登録し、プライベートIPアドレスとポートをGET変数として送信します
    • サーバーが登録要求を受け取ると、パブリックエンドポイントとプライベートエンドポイントが保存されます
    • 別のクライアントへの接続を要求します。
    • サーバーはクライアントのプライベートエンドポイントとパブリックエンドポイントを返します
    • 2秒ごとに、2番目のクライアントがサーバーにチェックインし、サーバーに接続しようとしている別のクライアントがある場合は、そのエンドポイントも取得します。
    • 両方のクライアントは、有効な応答が得られるまで、パブリックエンドポイントを互いにスパムし始めます

今、私はたくさんの質問があります

  1. サーバーをHTTPサーバーにすることはできますか?
  2. HTTPサーバーにリクエストを送信すると、リクエストが行われるたびにクライアントポートが変更されます。プライベートエンドポイントは常に同じパブリックエンドポイントと一致しますか?
  3. サーバーへのリクエストには、クライアントへのUDPメッセージと同じソースエンドポイントが必要ですか?
  4. 指定されたソースエンドポイントを使用してC#でHTTPサーバーに接続する方法はありますか?
  5. 私の実装に問題はありますか?

ありがとう!