web-dev-qa-db-ja.com

NATを介したP2Pの接続?

P2p接続を使用して他のユーザーと接続するオプションを検討し始めたため、Java for Android単純なメッセージp2pを共有します(NAT thenについては何も考えていませんでした)。NATについて知ることができたので、TCP発見のためにサーバーを使用するが、ペイロードはp2pで転送される別のユーザーとの接続.XMPP(プロトコルの仕組みに関する非常に優れた詳細な説明は ここ )とUPnPを見ましたが、方法はわかりませんそれらを実装します。

発生するもう1つの興味深い質問は、BitTorrentについてです。これらは、あらゆるデバイスで、さらにはNATの背後でも動作できるからです。 BitTorrentがどのように機能するかについての説明を得ることができません。

私は多くの研究をしましたが、行き詰っています。

私の質問は:

  1. BitTorrentの詳細な説明( here のように、トレントがどのように機能するかではなく)と、どのように回避できるかNAT?
  2. プログラムでNATエントリを作成する方法はありますか?
  3. ソケットプログラミングはp2pに十分ですか?
  4. 独自のプロトコルを作成するのはどのくらい難しいですか?どのように作成できますか?
  5. 2つのデバイスD1とD2がp2pを通信したいが、互いのIPを知っている場合。 D1はD2に要求を送信し、D2のNATを通過できませんが、D1のNATにエントリが作成されている必要があります。したがって、D2が何かを送信しようとすると、D1のNATはD2のIPを持つエントリを発見するはずです。
35
user3439988

発生するもう1つの興味深い質問は、BitTorrentについてです。これらは、あらゆるデバイスで、さらにはNATの背後でも動作できるからです。 BitTorrentがどのように機能するかについての説明を得ることができません。

このステートメントは、bittorrentが動作するには完全な接続が必要であると想定しているように見えます。

それは間違っています。

NATデバイスの後ろで、まだ確立できるoutgoingTCP接続一般に、ネットワーク内に着信できる他の非NAT(またはNATであるが適切に port-forwarded )クライアントがある限り、これはbittorrentに十分です。 接続。

接続は確立されると双方向になるため、NATはデータのフロー方向に影響を与えません。最初の接続セットアップでのみ問題があります。

Bittorentはデータを取得する特定のノードを気にしないので、これはbittorrentに対して完全に機能します。一般に、接続性が向上するとパフォーマンスが向上します。

ノードのIDが重要な場合、または1対1の転送が重要なユースケースである場合、他のp2pプロトコルは通常 NATトラバーサル を最初に試み、それが失敗した場合、それらのノード間のトラフィックを中継するサードパーティノードに依存します互いに直接接続することはできません。

さらに、エンドツーエンドの接続を維持するために、将来的にIPv6のサポートが不可欠になります。これは、より多くのISPが展開を開始しているためです キャリアグレードNAT

19
the8472

明確にする必要があるのは、すべてのタイプの100%P2P NATは現在不可能です。** SymmetricとSymmetric/PRC NATの間にP2P接続を確立する実用的な方法はありません。このシナリオ接続は、TURNというリレーサーバーを介して確立されます。

最初の質問についてはあまり知らないので、2番目の質問から答えています。

2)はい。 NATを介してパケットを送信できます。また、内部IP:PortとNATの外部IP:Portの間のマッピングがあります。これらの外部IP:Portを確認するには、スタンリクエストを送信します。 。この手法は、対称NATでは機能しないことに注意してください。

3)p2pに十分なソケットプログラミングはい。

4)すでにいくつかのプロトコルが存在するのに、なぜプロトコルが必要なのですか。現在、ICEプロトコルはNATトラバーサルに最適であり、簡単に作成できるとは思いません。UPnPおよびNAT-PMPはセキュリティの点で本当に脆弱です。

5)私は通常、NATはそこに来る未知のパケットをブロックします。したがって、D1がD2にパケットを送信すると、そのNATはD1s IP:Port:接続の確立に失敗する理由P1P接続を正常に確立するには、D1およびD2にホールパンチ技術を使用する必要があります。

**対称NATでは、対称NATとランダムなポート割り当てを意味します。

9
Tahlil

ネットワークアドレストランスレータを介したピアツーピア通信 」に関する論文があります。これは、 DPホールパンチ 方法を説明し、TCPも同様です。

もちろん、ホールパンチがサポートされていない場合には、常にリレーサーバーが必要になります。

7
Fardin K.
  1. BitTorrentの最近のバージョンは µTP を使用します。これはTCPではなくUDPの上に階層化されます。 µTorrentはプライベート拡張機能(ut_holepunch)UDPホールパンチを実行します。他のほとんどの実装は気にしません(Tixatiの顕著な例外を除く)。

  2. いくつかのNATルーターは PNP または [〜#〜] pmp [〜#〜] プロトコルを使用してポート転送要求を受け入れます。これは、特定のブランドのルーターとその構成に応じてサポートされます。

  3. はい、P2Pにはソケットプログラミングで十分です。

  4. 答えるのが難しい。最初に wikifiedおよび注釈付きのBitTorrent仕様 を読むことをお勧めします。

  5. はい、これは DPホールパンチ の背後にある原則です。

4
jch