extends NATおよびUDP送信元ポート / NATおよびUDP応答
アリスとボブがnatsの後ろにいると言います(奇妙なコーンケースではなく、なんとかして通信できる2つのnats、これを修正してください)。
どちらも0.0.0.0でローカルudpソケットを開き、トレントdht( http://www.bittorrent.org/beps/bep_0042.html /bootstrapping)を使用して発信ip:portを検出します。
これは、両方の方法でudpパケットを送信するのに十分ですか? utpセッションを開くと言います。
それとも、邪魔になる可能性のあるものをパンチするために、アリスからボブへ、ボブからアリスへの接続を試みる必要がありますか(fw/nats)?
ほとんどのP2Pプログラムが使用する方法は、 ホールパンチング の方法です。ここでは、中央サーバーを使用して、使用されるポートに関する情報を2者間で受け渡します。その情報を使用して、当事者は有効なポート番号への直接接続を確立できるため、ファイアウォールまたはルーターは着信パケットを受け入れて、開いているポートに転送します。
あなたの質問は、NATを介したUDPに関連していると思います。これは、 NATトラバーサル の一般的な問題です。ここでの問題は、発信側が相手がリッスンしているポート番号を知らないため、NATデバイスには着信パケットの宛先となる内部ホストを自動的に判別する方法がないことです。
DPホールパンチング の問題を解決するために、いくつかのアルゴリズムが開発されました。一部のUDPホールパンチングアルゴリズムは、同じポートを使用する両方の当事者に依存しています。他のアルゴリズムは、一時的なTCP接続を使用して、UDP接続の確立に必要な情報を渡します。
その他 DPホールパンチング テクニックはポート情報を必要としませんが、代わりに、両方の当事者が複数の試行を使用して相互に送信を開始し、少なくとも最初のパケットが失われるという事実を受け入れるアルゴリズムを使用します。最初の試行が失敗した後、NATデバイスには、他のマシンにパケットを送信したという記録があるため、このIPアドレスとポート番号からのパケットをすべて通過させます。そのためのアルゴリズムは、上記のリンクされたウィキペディアの記事で詳しく説明されています。
これは、以前に接続を試みたアドレスからパケットを受信した場合、ローカルパーティが接続を確立しようとしたポートとは異なるポート上にある場合でも、パケットが切り替わるという事実に基づいています。正しいポートにそれを。これにより、UDPパケットのNATマッピングは、送信しようとしているローカルパーティによってすでに確立されているため、UDPパケットはNATを通過できます。
これらすべての方法の問題は、NATアドレス変換テクノロジーが標準化されていないことです。その結果、NATトラバーサルに使用される方法は、多くの場合、独自仕様であり、十分に文書化されておらず、機能するかどうかは、メーカーやモデルが異なるルーターによって異なります。
IETFには、混乱を最小限に抑えるためにNATデバイスが実行する必要があることを定義するワーキンググループ全体があります。 [〜#〜] Behavior [〜#〜] いくつかの方法がありますNATデバイスを介してデータを取得する方法。一部はBEHAVEページにリストされています。 [〜#〜] stun [〜#〜] 、 PnP 、 NAT-PMP 、および Teredo もあります。 =。
通常、動的NATは、発信元接続の送信元ポートを変更することによって接続をマッピングします。多くの場合、マッピングは宛先IPアドレスによっても制限され、同じ宛先からのパケットのみがマッピングされます。NATは、同じ送信元ポートを異なる宛先アドレスに複数回マップすることもできます。
このようなNATでは、アリスまたはボブのいずれかがNAT(手動またはUPnPなどの他の手段を使用)を構成して、特定のNATポートを相手側のクライアントは、指定されたポートを使用して接続を開始できます。接続(または最初のパケットがUDPで受信された)が確立された後、残りのパケットは通常どおりに流れます。