我开始探索使用p2p连接与其他连接的选项,所以我在JAVA中为Android设备编写了一个简单的套接字程序,其中用户可以共享简单的消息p2p(我对NAT没有任何想法然后)。我了解了NAT,所以我现在需要与另一个用户建立TCP连接,该用户使用服务器进行发现,但有效载荷是p2p传输的。我还看过XMPP(关于协议如何工作的非常好的详细解释here)和UPnP,但我不知道如何实现它们。
另一个有趣的问题是BitTorrent,因为它们可以在任何设备上工作,甚至可以在NAT后面工作。我无法解释BitTorrent的工作原理。
我已经研究了很多,但我被卡住了。
我的问题是:
答案 0 :(得分:17)
另一个有趣的问题是BitTorrent,因为它们可以在任何设备上工作,甚至可以在NAT后面工作。我无法解释BitTorrent的工作原理。
这句话看起来好像你认为bittorrent需要完全连接才能运行。
这是不正确的。
在NAT设备后面,您仍然可以建立传出 TCP连接。只要网络中有其他非NAT(或NAT但正确port-forwarded)客户端可以接受传入连接,这对于bittorrent来说通常就足够了。
NAT对数据的流向没有影响,因为一旦建立连接就是双向的。它只对初始连接设置有问题。
这对于bittorrent非常有效,因为bittorent并不关心从哪个特定节点获取数据。 虽然更好的连接通常可以提高性能。
如果节点的标识很重要或者一对一的传输是一个重要的用例,那么其他p2p协议通常首先尝试NAT traversal,如果失败则依赖于第三方节点在这些节点之间中继流量无法直接相互连接。
此外,IPv6支持将成为维护端到端连接的必要条件,因为越来越多的ISP开始为IPv4推出carrier-grade NAT而IPv6将保持非NAT
答案 1 :(得分:9)
有一件事需要明确的是,现在所有类型的NAT之间100%的P2P是不可能的。在**对称和对称/ PRC NAT之间建立P2P连接没有实用的方法。在这种情况下,通过名为TURN的中继服务器建立连接。
我正在回答你的第二个问题,因为我对第一个问题了解不多。
2)是的。您可以通过NAT发送数据包,并在内部IP:端口与NAT的外部IP:端口之间建立映射。您可以通过发送眩晕请求来了解这些外部IP:端口。请注意,此技术不适用于对称NAT。
3)是套接字编程足以满足p2p。
4)为什么在已存在多个协议时需要协议。 ICE协议是NAT遍历的最佳选择,我不认为它很容易创建。 UPnP和NAT-PMP在安全性方面确实很脆弱。
5)我认为发生的事情通常是NAT阻止来自它的未知数据包。因此,当D1向D2发送数据包时,其NAT会阻止从D1s IP:Port传入的所有数据包。这就是连接建立失败的原因。您必须为D1和D2采用打孔技术才能成功建立P2P连接。
**对称NAT我指的是随机端口分配的对称NAT。
答案 2 :(得分:6)
有一篇关于“Peer-to-Peer Communication Across Network Address Translators”的论文描述了UDP hole punching方法并将其扩展为通过TCP使用。
当然,对于不支持打孔的情况,您总是需要一台中继服务器。
答案 3 :(得分:4)
最新版本的BitTorrent使用µTP,它位于UDP之上,而不是TCP。 μTorrent使用执行UDP打孔的私有扩展(ut_holepunch
),大多数其他实现都不会打扰(除了Tixati之外)。
是的,套接字编程对于P2P来说已经足够了。
很难回答。我建议您先阅读wikified and annotated BitTorrent specification。
是的,这是UDP hole punching背后的原则。