¿Conectar P2P sobre NAT?

Comencé a explorar la opción de conectarme con otros usando una conexión p2p, así que codifiqué un programa de socket simple en JAVA para dispositivos Android en el que los usuarios pueden compartir mensajes simples p2p (entonces no tenía idea de NAT). Conocí NAT, así que ahora necesito establecer una conexión TCP con otro usuario que usa un servidor para el descubrimiento pero la carga útil se transfiere p2p. También he visto XMPP (una explicación muy buena y detallada de cómo funciona el protocolo esaquí) y UPnP pero no sé cómo implementarlos.

Otra pregunta interesante que surge es sobre BitTorrent porque pueden funcionar en cualquier dispositivo e incluso detrás de un NAT. No puedo obtener ninguna explicación de cómo funciona BitTorrent.

He investigado mucho pero estoy atrapado.

Mis preguntas son:

Una explicación detallada de BitTorrent (comoaquí, no cómo funcionan los torrents) y cómo puede trabajar alrededor de NAT?¿Hay alguna manera de hacer una entrada NAT mediante programación?¿La programación de socket es suficiente para p2p?¿Qué tan difícil es crear su propio protocolo y cómo puedo construir uno?Si dos dispositivos D1 y D2 quieren comunicarse p2p y conocen la IP del otro. D1 envía una solicitud a D2 y eso no puede pasar a través de NAT de D2, pero debe haber una entrada creada en NAT de D1. Entonces, cuando D2 intenta enviar algo, el NAT de D1 debería descubrir una entrada con la IP de D2. Entonces, ¿por qué no permite el paquete?

Respuestas a la pregunta(4)

Su respuesta a la pregunta