web-dev-qa-db-ja.com

Skypeはポート転送なしでどのように機能しますか?

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

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

32
Xinus

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

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

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

編集:弾丸の問題を修正

20
rein

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

18
nothrow

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

3
Joe

P2Pアプリケーションを実装し、それらをNATルーターの背後で動作させるためのいくつかの経験があります。

Skypeは、UDPホールパンチングを使用してNATルーターの背後で動作します。他のユーザーが同様のアプリケーションを実装するのに役立つ記事を書き、デモビデオを作成しました。ほとんどの基本的な作業を行う便利なライブラリへのリンクも提供していますここlibutpのように。

>>> UDPホールパンチデモビデオと便利なライブラリ

0
Rakesh Gopal