通过NAT连接P2P?

我开始探索与其他使用p2p连接连接的选项,所以我编写了一个简单的套接字程序在JAVA中的Android设备,其中用户可以在其中分享简单的消息p2p(我对NAT没有任何的想法然后)。 我已经了解NAT,所以现在我需要build立一个TCP连接与另一个用户使用服务器进行发现,但有效载荷传输到P2P。 我也看过XMPP(一个非常好的和详细的解释协议如何工作在这里 )和UPnP,但我不知道如何实现它们。

出现的另一个有趣的问题是BitTorrent,因为它们可以在任何设备上工作,甚至在NAT后面工作。 我无法得到有关BitTorrent如何工作的任何解释。

我已经研究了很多,但我卡住了。

我的问题是:

  1. BitTorrent的详细解释(像这里 ,不是如何山洪工作),以及如何能够解决NAT?
  2. 有没有办法使程序化的NAT条目?
  3. 套接字编程是否足够用于p2p?
  4. 创build自己的协议有多难?我该如何创build协议?
  5. 如果两个设备D1和D2想要通信P2P并且他们知道彼此的IP。 D1发送一个请求到D2,并且不能通过D2的NAT,但是应该在D1的NAT中创build一个条目。 所以当D2试图发送一个D1的NAT应该发现一个D2的IP入口。 那为什么这个包不被它允许?

编辑:

在networking上讨论的用于解决NAT的一种方法是使用SIP。 这已经适用于Bleep,但我无法findnetworking上的任何实施。 有人能解释一下SIP是如何工作的吗?