NAT 経由で P2P を接続しますか?

NAT 経由で P2P を接続しますか?

私はP2P接続を使用して他のユーザーと接続するオプションを探求し始めたので、Androidデバイス用のJAVAで簡単なソケットプログラムをコーディングしました。このプログラムでは、ユーザーが簡単なメッセージをP2Pで共有できます(当時はNATについて何も知りませんでした)。NATについて知ったので、今度は、検出にサーバーを使用し、ペイロードはP2Pで転送される別のユーザーとのTCP接続を確立する必要があります。また、XMPPも調べました(プロトコルの仕組みに関する非常に優れた詳細な説明はここ) と UPnP がありますが、実装方法がわかりません。

もう一つの興味深い疑問は、BitTorrent があらゆるデバイスで動作し、NAT の背後でも動作できるという点です。BitTorrent がどのように動作するのか、説明がまったく得られません。

いろいろ調べましたが、行き詰まってしまいました。

私の質問は次のとおりです:

  1. BitTorrentの詳細な説明(ここ(トレントの仕組みではなく)NAT を回避できる仕組みを教えてください。
  2. プログラムで NAT エントリを作成する方法はありますか?
  3. ソケットプログラミングはP2Pに十分ですか?
  4. 独自のプロトコルを作成するのはどれくらい難しいですか? また、どのように構築できますか?
  5. 2 つのデバイス D1 と D2 が P2P 通信を希望し、お互いの IP を知っている場合、D1 は D2 にリクエストを送信しますが、D2 の NAT を通過できません。ただし、D1 の NAT にはエントリが作成されているはずです。したがって、D2 が何かを送信しようとすると、D1 の NAT は D2 の IP を含むエントリを検出する必要があります。では、なぜパケットは NAT によって許可されないのでしょうか。

編集:

NAT を回避するためにネット上で議論されている方法の 1 つは SIP を使用することです。これは Bleep では機能しましたが、ネット上でその実装を見つけることができません。SIP が実際にどのように機能するかを誰か説明してください。

関連情報