4

Copilot に関する Joel の投稿から:

ダイレクトコネクト!どのようなファイアウォールや NAT が配置されていても、Fog Creek Copilot があらゆるネットワーク状況で接続できるようにするために、私たちは常にできる限りのことを行ってきました。これを実現するために、両当事者は当社のサーバーへのアウトバウンド接続を確立し、サーバーが代わりにトラフィックを中継します。まあ、多くの場合、これは必要ありません。そのため、バージョン 2.0 はかなり賢いことを行います。サーバーを介して初期接続をセットアップするため、100% の信頼性ですぐに接続できます。しかし、接続が完了すると、バックグラウンドで静かに、直接接続する方法を探します。それができない場合は、大したことではありません。サーバーを介して中継し続けるだけです。直接ピアツーピア接続を確立できる場合は、データをサイレントに直接接続に移行します。

サーバー接続を P2P 接続に変更するにはどうすればよいですか?

4

3 に答える 3

10

かなりトリッキーで面白いです。細かいところは間違っていると思いますが、概要はこんな感じです。

プログラムはすでに 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 要求を処理する方法、およびそれらが外部ポートにマップされる方法に関するものです。これらの詳細は、興味深い部分と難しい部分です。

-アダム

于 2008-09-04T17:26:12.340 に答える
1

単純なバージョンは、サーバー接続を削除してP2P接続に置き換えることだと思います。

次のようなもの:

  1. Machine1は副操縦士のサーバーに接続します。
  2. Machine1は副操縦士のサーバーに接続します。
  3. Machine1は副操縦士のサーバーに接続します。
  4. その後、Machine2が接続し、画面共有を開始します。
  5. Machine2は、Machine1が接続するためのポートを開きます。
  6. Machine1は、Machine2で現在開いているポートに接続しようとします。

この接続が確立された場合:

  1. 副操縦士のサーバーへの接続が切断されました。
  2. 代わりに、データは2台のマシン間の直接(P2P)接続を介して転送されます。
于 2008-09-04T17:33:20.013 に答える
1

「Cone」NAT (Cone はルーターの技術的なファミリー) でうまく機能する「 Hole Punching 」と呼ばれる手法があります。これは 100% 確実な手法ではありません。現在、ルーターの約 80% で UDP とうまく機能しています。

穴あけを実現するライブラリの実装がいくつかあります: STUN ( wikipedia )

于 2008-09-04T17:15:32.537 に答える