2 つのピアが (両方が互いの IP を知っていると仮定して) 直接通信できるようにアプリケーションを設計するにはどうすればよいでしょうか。つまり、ポートは開かれません。たとえば、Bitorrent はそれを行いますが、マルチプレイヤー ゲーム (私の知る限り) にはポート フォワーディングが必要です。
4 に答える
No Outgoing Connections の意味がよくわかりません。他の皆さんと同じように、Incoming Connections がないという意味だと思います (それらは NAT/FW/etc の背後にあります)。
これまでに言及された最も一般的なものはUPNPです。これは、このコンテキストでは、コンピューターとしてゲートウェイと通信し、外部の誰かが私に話しかけることができるようにするため、このポートを転送してくれるようにするプロトコルです。UPNP は他の目的のためにも設計されていますが、これはホーム ネットワークで一般的なものです (実際には、多くの定義の 1 つです)。
ネットワークを所有していない場合は、より一般的で信頼性の高い方法もあります。最も一般的なのはSTUNと呼ばれるものですが、私の記憶が正しければ、いくつかの亜種があります。基本的に、着信接続が通信チャネルを試行して調整できるようにするサードパーティのサーバーを使用します。基本的には、ピアに UDP パケットを送信することです。これにより、応答のために NAT が開かれますが、ピアの NAT でドロップされます (転送ルールがまだ存在しないため)。仲介者への接続を通じて、同じことを行うように指示されます。これにより、NAT が開かれ、NAT の既存のルールと一致します。これで、通信を続行できます。それらはこれの変形であり、SYN および SYN-ACK メッセージを調整して送信することにより、TCP/IP 接続も可能にします。
私がリンクしたウィキペディアの記事には、これらのプロトコルが正確にどのように機能するかについて、関連する rfc へのリンクがあります。基本的に、これは非常にネットワーク中心の問題であるため、簡単な答えはありません。
ネットワークのどこかに「ミーティングポイント」が必要です。参加者はある種の「ゲートウェイ」で「ミーティング」し、前述の「ゲートウェイ機能」が転送を処理します。
少なくともそれはそれを行う一つの方法です:私はBittorrentの詳細についてコメントしようとはしません...私はあなたがリンクをグーグルで検索できると確信しています。
UPNPは主に近年これに対処しましたが、ポートを開く必要があるのは、アプリケーションが特定のポートで応答をリッスンするようにコーディングされているためです。
1024未満のポートは、会社が支払いを行ったためにポート番号が割り当てられているため、「登録済み」と呼ばれます。これは、WebサーバーまたはSSHにポート53を使用できなかったことを意味するのではなく、ほとんどの場合、DNSを処理していると見なすと想定します。1024を超えるポートは登録されていないため、関連付けはありません。InternetExplorer / FirefoxなどのWebブラウザーは、未登録のポートを使用して、ポート80のStackOverflowWebサーバーにリクエストを送信しています。次を使用できます。
netstat -a
..Windowsホストで、関連するポートを含め、現在確立されているネットワーク接続を確認します。
UPNP を使用してルーターとネゴシエートし、ポートを開いてアプリケーションに転送できます。bit-torrent でさえ、p2p 接続を有効にするには、少なくとも 1 つのピアでポートが開いている必要があります。ただし、両方のピアが同じサーバー (トラッカー) と通信し、誰がポートを開いているかをネゴシエートして判断できるため、両方のピアがポートを開く必要はありません。
代替手段は、両方のピアが信頼し、すべてのトラフィックを中継するインターネット上のどこかにあるエコーサーバー/リレーサーバーです。このソリューションの「問題」は、p2p 接続を確立するのではなく、すべてのトラフィックを中継するため、接続されているすべてのピアに対応するために、エコー サーバーが多くの帯域幅を必要とすることです。
EchoWare をチェックしてください: http://www.echogent.com/tech.htm