Подключение P2P через NAT?
Я начал исследовать возможность соединения с другими с помощью p2p-соединения, поэтому я написал в JAVA простую программу для сокетов для устройств Android, в которой пользователь, в котором пользователи могут делиться простыми сообщениями p2p (я не имел никакого представления о NAT затем). Я узнал о NAT, так что теперь мне нужно установить TCP-соединение с другим пользователем, который использует сервер для обнаружения, но полезная нагрузка передается p2p. Я также посмотрел на XMPP(очень хорошее и подробное объяснение того, как работает протокол, здесь) и UPnP, но я не знаю, как их реализовать.
Другой интересный вопрос, который возникает, касается BitTorrent, потому что они могут работать на любом устройстве и даже за NAT. Я не могу получить никакого объяснения того, как работает BitTorrent.
Я много исследовал, но я застрял.
Мои вопросы:
- Подробное объяснение BitTorrent (как здесь, а не как работают торренты) и как он может работать вокруг NAT?
- Есть ли способ сделать запись NAT программно?
- Достаточно ли программирования сокетов для p2p?
- Насколько сложно создать собственный протокол и как его создать?
- Если два устройства D1 и D2 хотят связываться по p2p, и они знают IP друг друга. D1 отправляет запрос к D2, и он не может пройти через NAT D2, но должна быть запись, созданная в NAT D1. Поэтому, когда D2 пытается что-то отправить, NAT D1 должен обнаружить запись с IP-адресом D2. Тогда почему пакет не разрешен этим?
Редактировать:
Одним из методов, обсуждаемых в сети для работы с NAT, является использование SIP. Это сработало для Bleep, но я не могу найти какую-либо реализацию этого в сети. Может кто-нибудь объяснить, как на самом деле работает SIP.