質問

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

ダイレクトコネクト!私たちは、ファイアウォールや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 リクエストと、それが外部ポートにどのようにマッピングされるかを扱います。これらの詳細は興味深い部分ですが、難しい部分でもあります。

-アダム

他のヒント

というテクニックがあります。パンチング」は、「Cone」NAT とうまく動作します (Cone はルーターの技術ファミリーです)。これは 100% 確実な技術ではありませんが、現在ではルーターの約 80% で UDP でうまく動作します。

ホールパンチを実現するためのライブラリの実装がいくつかあります。 気絶 (ウィキペディア)

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

次のようなもの:

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

この接続が確立されている場合:

  1. 副操縦士のサーバーへの接続が切断されました。
  2. 代わりに、データは 2 台のマシン間の直接 (P2P) 接続を介して転送されます。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top