¿Conectando P2P a través de NAT?

¿Conectando P2P a través de 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 el usuario puede compartir mensajes simples p2p (no tenía idea sobre NAT). entonces). Conocí NAT, por lo 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 miré XMPP (una explicación muy buena y detallada de cómo funciona el protocolo esaquí) y UPnP pero no sé cómo implementarlos.

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

He investigado mucho pero estoy estancado.

Mis preguntas son:

  1. Una explicación detallada de BitTorrent (comoaquí, no cómo funcionan los torrents) y ¿cómo es posible solucionar NAT?
  2. ¿Existe alguna manera de realizar una entrada NAT mediante programación?
  3. ¿Es suficiente la programación de sockets para p2p?
  4. ¿Qué tan difícil es crear su propio protocolo y cómo puedo crear uno?
  5. 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 la NAT de D2, pero debería haber una entrada creada en la NAT de D1. Entonces, cuando D2 intenta enviar algo, la NAT de D1 debería descubrir una entrada con la IP de D2. Entonces, ¿por qué no permite el paquete?

Editar:

Uno de los métodos discutidos en la red para solucionar NAT es utilizar SIP. Eso funcionó para Bleep, pero no puedo encontrar ninguna implementación en la red. ¿Podría alguien explicar cómo funciona realmente SIP?

información relacionada