Подключаете P2P через NAT?

Подключаете P2P через NAT?

Я начал изучать возможность подключения к другим с помощью p2p-соединения, поэтому я написал простую программу сокета на JAVA для устройств Android, в которой пользователь может обмениваться простыми сообщениями p2p (тогда я понятия не имел о NAT). Я узнал о NAT, поэтому теперь мне нужно установить TCP-соединение с другим пользователем, который использует сервер для обнаружения, но полезная нагрузка передается p2p. Я также рассмотрел XMPP (очень хорошее и подробное объяснение того, как работает протокол, см.здесь) и UPnP, но я не знаю, как их реализовать.

Другой интересный вопрос, который возникает, касается BitTorrent, поскольку они могут работать на любом устройстве и даже за NAT. Я не могу получить никаких объяснений того, как работает BitTorrent.

Я много исследовал, но застрял.

У меня есть вопросы:

  1. Подробное объяснение BitTorrent (например,здесь, а не как работают торренты) и как он может работать в обход NAT?
  2. Есть ли способ сделать запись NAT программно?
  3. Достаточно ли программирования сокетов для p2p?
  4. Насколько сложно создать свой собственный протокол и как его создать?
  5. Если два устройства D1 и D2 хотят общаться p2p и они знают IP друг друга. D1 отправляет запрос D2, и он не может пройти через NAT D2, но в NAT D1 должна быть создана запись. Поэтому, когда D2 пытается что-то отправить, NAT D1 должен обнаружить запись с IP D2. Тогда почему пакет не пропускается им?

Редактировать:

Один из методов, обсуждаемых в сети для обхода NAT, — это использование SIP. Это сработало для Bleep, но я не могу найти никакой реализации этого в сети. Может ли кто-нибудь объяснить, как на самом деле работает SIP.

Связанный контент