2009-10-08 3 views
31

ポート30000で動作するp2pアプリケーションを設計中です。私のルータはUPnPではありませんので、ルータにポートを転送する必要があります。しかし、スカイプ別のP2Pアプリケーションは、ポート転送なしで動作します私のPCに。私はwiresharkで解析したところ、UDPポート48980,58544を使用していました。私はC++を使用しています。Skypeはポート転送なしでどのように動作しますか?

Nat PnPルータには、Python hereのライブラリがあります。ルータとオペレーティングシステムの種類にかかわらず、プログラムによってポートを転送することは可能ですか。 C++や他の言語でそれを行う方法は何でしょうか。

答えて

20

Skypeは非常に興味深い方法で動作します。

  • Skypeのサーバーは、すべての ユーザーとIPアドレスのリストを維持します。私が読んだ(これはしばらく前にある)以下のように、それはどのような作品から、
  • SkypeユーザAが と話すことを希望するユーザB SkypeユーザAは、 ネットワークパケットをユーザBのIPアドレス に送信し、応答を待ちます。 (ユーザーBは決してこのパケットを取得しません)。
  • SkypeユーザAは、IP /ポートのサーバに通知 応答
  • Serverは接続が行われる 指定されたポートで
  • ユーザAに応答を送信するために、ユーザB を通知するために、それは を待っているされている組み合わせ。

これはおそらく単純化しすぎていますが、最後に確認しました。これはどのように動作するかです。 (私が間違っていると誰かが私を修正する)。

+0

ですが、質問はそれがクライアントのIPですPUBLIC?例えばAはBと通信する必要があり、サーバはBのIPを知っていますが、どのIPを使用していますか?この場合、anyones ipに対してpingを実行できますか?申し訳ありませんが愚かな場合 –

+4

この回答は単にAを記述し、Bとサーバーに正しいIP /ポートの組み合わせをユーザーBに送信することに失敗しました。穴の穴あけと呼ばれる要点がなく、リンク@MartinBeckettによって提供される。ルータがUPnPをサポートしていれば、ルータとオペレーティングシステムの種類に関係なくポートを転送することも可能です。 – Igor

+1

@reinだから対称NATはどうですか? – onmyway133

18

UDP hole punchingは、NATを通過する方法の1つです。

+0

私はルータとNATの違いを理解できませんか?ポートをルータまたはNATに転送しますか?私たちが別のポートで作業するときに同時に動作しない両側からのデータ送信と同等の穴あけはありませんか?ありがとう – Xinus

+1

ルータは情報をあるネットワークから別のネットワークにルーティングします。 NATは、内部ネットワーク上にプライベートアドレス範囲を持ち、ルータに他のネットワーク上の有効なアドレスを持つことのみを持つプロセスです。ルータは物理的なデバイスですが、NATはあなたが何かするものです。 – rein

3

仲介サーバーを使用し、クライアント側からの通信を開始する必要があります。 Yossarianが述べたように、その点からUDP穴あけが可能です。アプリケーションの種類(本当にP2Pかどうか)によっては、時間の経過とともにサーバーを適切に保つことができます。

0

Skypeは、直接接続が不可能な場合に中間ポイントとして別のピアを使用します。

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

0

を説明していますが、P2Pアプリケーションを実装し、それらをNATルータの背後で動作し得ることにいくつかの経験を持っています。

Skypeは、NATホールダーの背後で働くためにUDPホールパンチを使用します。私は記事を書いて、他の人が同様のアプリケーションを実装できるようにデモビデオを作った。 libutpのような基本的な作業のほとんどを行う有用なライブラリへのリンクも提供しています。

>>> UDP hole punching Demo video and useful Libs.

関連する問題