1

NAT の背後にある 2 つのクライアント間で P2P 接続を確立したいと考えています。動作させる方法を勉強したので、「UDPホールパンチング方法」を試してみたいです。

そう...

PHP でサーバーを作成しました。サーバーは、オンデマンドでクライアントに接続の詳細を送信できます (リモート IP、リモート ポートなど)。

例としてのソースコードはこちら: http://pastebin.com/FdiKMSFq

次に、サーバーに永続的に接続するクライアントを C# で作成し、別のクライアント情報について尋ねました。クライアントは、別のクライアントのリモート IP とリモート ポート (サーバーとの接続に使用される) を受け取り、接続を試みます。

完全なソース コードはこちら: http://pastebin.com/VUJyZivW

最初のステップ (接続して詳細を尋ねる) は問題ありませんが、クライアント (A) が別のクライアント (B) に接続してデータを送信すると (A->B)、クライアント B はデータを受信しません。

両方の IPEndPoint をポート 2000 で動作するように設定しましたが、とにかく動作しませんでした。

例:

  • A: 192.168.1.11:2000、サーバーは 32.14.15.16:56666 を取得します
  • B: 192.168.1.5:2000、サーバーは 32.99.15.16:56699 を取得します
  • A は 32.99.15.16:56699 に接続してデータを送信しようとします
4

1 に答える 1

1

あなたの例を見ると、B の NAT は、そのパブリック エンドポイント (アドレスとポートのペア) 宛てのパケットをドロップします。これは、B の NAT がこれを一方的な要求と見なすためです。

B の NAT が A からのパケットを通過させるためには、B が以前に A と通信したと見なす必要があり、したがって要求が要請されたと見なされます。NAT は、これを追跡するために内部テーブルを保持します。

接続を確立する方法は、B が A のパブリック エンドポイント (32.14.15.16:56666) にもパケットを送信することです。これを行うと、B の NAT に穴が「パンチ」されます。あなたの例では、AはすでにBにトラフィックを送信することで穴を開けています.

これは、NAT の少なくとも 1 つが一貫してプライベート ソース エンドポイントをパブリック ソース エンドポイントに (宛先アドレスに関係なく) 変換する場合にのみ機能することに注意してください。これは、ピアが同じプライベート エンドポイントを使用している場合でも、サーバーから見えるパブリック エンドポイントが、P2P ピアの NAT から見えるものと異なる可能性があるためです。

于 2013-01-25T21:40:15.413 に答える