web-dev-qa-db-ja.com

穴あけにはUDPランデブーサーバーが必要ですか、それともTCP 1つですか?

私はこの問題に頭を悩ませようとしています...

2人のユーザーをつなぎたい...

これらのユーザーはすでにTCPサーバーに接続されています。サーバーはパブリックIPと接続TCPポートの両方を認識しています。既存の接続を使用してユーザー間にp2p接続を作成するためのサーバー。ユーザーが接続しているパブリックポートを知るために、別のUDPサーバーに接続するようにユーザーに依頼するのは冗長です。

別のサーバー(今回はUDP)を作成せずにこれを解決することは可能ですか?

5
TheSquad

この質問は2年近く前のものだと知っていますが、答えがないので、これを処理する方法でチャイムを鳴らしたいと思いました。

これは実際には、ステートレスであるという理由だけでUDPで機能し、TCPでは機能しないものです。 TCP 3番目の「制御」サーバーへの接続を使用した説明されたセットアップは、実際にはこれに最適なセットアップです。ここでは、パーティを「ユーザーA」、「ユーザーB」、および「コントロール」。これがどのように機能するかを次に示します。

  • ユーザーAとユーザーBは、ControlへのTCP接続を確立します。確立されると、両方のユーザーは、接続可能なポートをControlに送信します。ユーザーAの「ポートX」とユーザーを呼び出します。 Bの「ポートY」。
  • Controlは、ユーザーAのポート情報をユーザーBと共有し、その逆も同様です。
  • ユーザーAはポートXからポートYのユーザーBにUDPパケットを送信します。ユーザーBのファイアウォールはもちろんこのパケットを拒否します。
  • ユーザーBはUDPパケットをポートYからポートXのユーザーAに送信します。ユーザーAのファイアウォールは、パケットがユーザーAからポートXを出て、ポートのユーザーBに送信されるのを確認したため、このポートを内部でユーザーAに転送します。 Y(UDPであるため、拒否されたとは見なされません)。したがって、ポートYのユーザーBからポートXのユーザーAに送信されるパケットは応答パケットであると想定され、通過します。
  • ユーザーAは別のUDPパケットをポートXからポートYのユーザーBに送信し、同じ理由でユーザーBのファイアウォールを通過することも許可されます。
  • ユーザーAとBはUDPパケットを送受信できるようになり、Controlの参加は不要になりました。
7
Nick Coons