36

ポート 30000 で動作するp2pアプリケーションを設計しています。私のルーターはUPnPではないため、ポートをルーターに転送する必要がありました。しかし、別の p2p アプリケーションであるSkypeは、私の PC でポート転送なしで動作します。Wireshark で分析したところ、UDP ポート 48980、58544 を使用していることがわかりました。私は c++ を使用しています。

Pythonには、 Nat PnP ルーター用のライブラリがここにあります。ルーターの種類やオペレーティングシステムに関係なく、プログラムでポートをルーターに転送することは可能ですか? C ++または他の言語でそれを行うためのアプローチは何ですか。

4

4 に答える 4

22

Skypeは非常に興味深い方法で機能します。私が読んだものから(そしてこれは少し前です)、それは次のように機能します:

  • Skypeサーバーは、すべてのユーザーとIPのリストを維持します。
  • SkypeユーザーAがユーザーBと話したい
  • SkypeユーザーAはネットワークパケットをユーザーBのIPアドレスに送信し、応答を待ちます。(ユーザーBはこのパケットを取得しません)。
  • SkypeユーザーAは、応答を待機しているIP/ポートの組み合わせをサーバーに通知します
  • サーバーは、指定されたポートでユーザーAに応答を送信するようにユーザーBに通知します
  • 接続が確立されます。

これはおそらく過度に単純化されていますが、最後に確認したところ、これがどのように機能するかです。(私が間違っている場合、誰かが私を訂正します)。

編集:箇条書きの問題を修正

于 2009-10-08T17:41:12.543 に答える
19

UDP ホール パンチングは、NAT を通過する方法の (1 つ) です。

于 2009-10-08T17:35:34.147 に答える
3

仲介サーバーを使用し、クライアント側から通信を開始する必要があります。Yossarianが述べたように、その時点から1つの可能性はUDPホールパンチングです。アプリケーションのタイプ(およびそれが本当にP2Pであるかどうか)によっては、仲介サーバーを常に配置しておくことができます。

于 2009-10-08T17:41:02.763 に答える
0

直接接続できない場合、Skype は別のピアを中間点として使用します。

つまり、ピア A はピア B に接続しようとしていますが、ピア B はすべてのポートを閉じているため、ポートが開いているピア C を介して通信が開始されます。

于 2009-10-08T18:05:59.610 に答える