Conectando P2P sobre NAT?

Conectando P2P sobre NAT?

Comecei a explorar a opção de conectar com outros usando uma conexão p2p, então codifiquei um programa de soquete simples em JAVA para dispositivos Android no qual o usuário no qual os usuários podem compartilhar mensagens simples p2p (não tinha ideia sobre NAT então). Conheci o NAT, então agora preciso estabelecer uma conexão TCP com outro usuário que usa um servidor para descoberta, mas a carga útil é transferida p2p. Também dei uma olhada no XMPP(uma explicação muito boa e detalhada de como o protocolo funciona éaqui) e UPnP, mas não sei como implementá-los.

Outra questão interessante que surge é do BitTorrent porque eles podem funcionar em qualquer dispositivo e até mesmo atrás de um NAT. Não consigo obter nenhuma explicação sobre como funciona o BitTorrent.

Eu pesquisei muito, mas estou preso.

Minhas perguntas são:

  1. Uma explicação detalhada do BitTorrent(comoaqui, não como os torrents funcionam) e como ele consegue contornar o NAT?
  2. Existe uma maneira de fazer uma entrada NAT programaticamente?
  3. A programação de soquete é suficiente para p2p?
  4. Quão difícil é criar seu próprio protocolo e como posso construir um?
  5. Se dois dispositivos D1 e D2 desejam se comunicar p2p e conhecem o IP um do outro. D1 envia uma solicitação para D2 e ​​não consegue passar pelo NAT do D2, mas deve haver uma entrada criada no NAT do D1. Portanto, quando D2 tenta enviar algo, o NAT de D1 deve descobrir uma entrada com o IP de D2. Então por que o pacote não é permitido por ele?

Editar:

Um dos métodos discutidos na rede para contornar o NAT é usar o SIP. Isso funcionou para o Bleep, mas não consigo encontrar nenhuma implementação disso na rede. Alguém poderia explicar como o SIP realmente funciona.

informação relacionada