2

LAN 範囲で完全に動作する Java の P2P プログラムを完成させましたが、よく知られている NAT トラバーサルの問題に行き詰まりました。ユーザーが NAT 境界を通過して相互に接続できるようにしたい (それについて 100% を把握することは不可能であることはわかっています)。私はこのテーマについて多くのことを読みましたが、概念は理解できましたが、TCP ホール puching を行うことにまだ疑問を持っています。

私がやりたいのは、2 つのクライアントを相互に接続することです (それらは同じ NAT の下に存在します)。IP はそれぞれ192.168.100.1192.168.100.2です(相互に直接接続できます)。最初に、ポート 80 のソケットを介して PHP サーバーに接続します。サーバーは、そのパブリック IP とポートを次のように登録します。

クライアント 1: 200.000.000.1:1478
クライアント 2: 120.000.000.1:2547

そして、各クライアントの Java ソケットは、接続時に次のように返します。

クライアント 1:ソケット[addr=/xx.xx.xx.xx,port=80,localport=54632]
クライアント 2:ソケット[addr=/xx.xx.xx.xx,port=80,localport=41789]

Id est、ポート 80 を介してサーバーと開いている 2 つの tcp 接続を超えて、各クライアントのプライベート ip、パブリック ip、ローカル ポート、およびパブリック ポートも持っています。それでは、それが私の問題です。これからどう進めばいいのかわからない。私が読んだことは、このステップについて私にはあまり明確ではありませんでした.

2 つのクライアントがパブリック ポート ( 1478-2547 ) またはローカル ポート ( 54632-41789 ) でリッスンする必要がありますか? 同時に、相手のパブリックまたはプライベートに接続しようとしますか? 他に何個のソケットを開く必要がありますか? いくつかのテストを行いましたが、何かがおかしいと思います ( *接続が拒否されました* )。

どんな助けでも大歓迎です。

4

1 に答える 1

2

進むにはさまざまな方法があります。

  1. ある種のプロキシを実装できます。両方のクライアントが (NAT バリアの外で) それに接続し、メッセージをルーティングします。
  2. 直接接続 Client2Client が必要な場合、ユーザーは NAT バリアでポートを開き、それをローカル IP に転送する必要があります。

それは面倒ですが、それはそれがどのように機能するかでもあります。

クライアント A にとって、クライアント B のローカル データを知っていても意味がありません。最後のいくつかの質問: ローカル クライアント A がポートでリッスンすると、 X と言うと、ローカル クライアント B はクライアント A のネットワークのパブリック IP に接続する必要があります。おそらくルーターです。そこで、ローカル クライアント A に転送されるようにポートを構成する必要があります。それだけです。可能性 #1 (上記を参照) に従う場合、クライアント AB が接続するポート X でリッスンするパブリック サービスが必要です。これらはパブリック IP への発信接続になるため、ホールパンチは必要ありません。

于 2012-10-05T12:14:06.710 に答える