質問
ダイレクトコネクト!私たちは、ファイアウォールやNATがどのように配置されていても、フォグクリークの副操縦士があらゆるネットワーキングの状況で接続できることを確認するために、できる限りのことを常にしてきました。これを実現するために、両当事者はサーバーへのアウトバウンド接続を行います。サーバーに代わってトラフィックを中継します。まあ、多くの場合、これは必要ありません。したがって、バージョン2.0はかなり賢いことをします:サーバーを介した最初の接続をセットアップするため、100%の信頼性ですぐに接続されます。しかし、その後、すべてが接続されたら、それは静かに、背景に、直接的なつながりを作る方法を探します。できない場合、大したことはありません:サーバーを介して中継し続けるだけです。直接ピアツーピア接続を作成できれば、データを静かに直接接続にシフトします。おそらく、はるかに高速なコミュニケーションを除いて、あなたは何も気づくことはありません。
サーバー接続を P2P 接続に変更するにはどうすればよいでしょうか?
解決
なかなかトリッキーで面白いですね。細かい部分は間違っていると思いますが、概要は次のとおりです。
プログラムはすでに Joel のサーバーを介して相互に通信できるため、相互に、また Joel のサーバーと情報を交換できます。さらに、Joel は外部 IP アドレスを持っており、内部 IP アドレスに関する情報を Joel に提供します。
彼らはこのホールパンチ技術を試してみることにしました。コンピュータ A は、コンピュータ B の外部 IP アドレスを使用してコンピュータ B との TCP 接続を開始します。これは通過しませんが、A のルーターに、指定されたポートで B からの受信パケットを許可する必要があることを伝えます。
コンピュータ B も同じことを行いますが、A のルータが B が送信したものと一致するポートと IP の組み合わせを開いたため、そのメッセージは A に届きます (ここでいくつかのポートマジックが発生します。これは簡単ではありませんが、実行可能です)。
B のルーターは、B が特定のポートと IP で A との接続を開始したことを記憶しているため、A のパケットはルーターを通過して B に正しく流れるようになります。
したがって、実際には非常に簡単ですが、実装には詳細があり、特に新しい TCP 接続にポートを与える方法と NAT ルーターの方法に関して詳しく説明されています。 通常 TCP リクエストと、それが外部ポートにどのようにマッピングされるかを扱います。これらの詳細は興味深い部分ですが、難しい部分でもあります。
-アダム
他のヒント
単純なバージョンは、サーバー接続を削除し、P2P 接続に置き換えることだと思います。
次のようなもの:
- Machine1 は副操縦士のサーバーに接続します。
- Machine1 は副操縦士のサーバーに接続します。
- Machine1 は副操縦士のサーバーに接続します。
- その後、Machine2 が接続し、画面共有が開始されます。
- Machine2 は、Machine1 が接続するためのポートを開きます。
- Machine1 は Machine2 で現在開いているポートに接続しようとします。
この接続が確立されている場合:
- 副操縦士のサーバーへの接続が切断されました。
- 代わりに、データは 2 台のマシン間の直接 (P2P) 接続を介して転送されます。