如果我拥有所有IP信息,如何在P2P应用程序中绕过NAT?

3
我正在制作一款P2P安卓应用。目前的问题是,除非它们在同一网络中并使用私有IP地址,否则我无法使我的设备相互识别--我已经将所有公共IP /端口/私有IP地址存储在数据库中。
在不进入路由器设置和端口转发的情况下,我该如何让一个设备联系另一个设备,鉴于NAT阻止了我的尝试,而我又无法选择从公共IP地址中选择哪个私有IP...
我应该怎样才能成功地连接到我的设备?

这个链接 https://dev59.com/OGrXa4cB1Zd3GeqPCLk5#13334629 应该会有所帮助。 - fkl
https://dev59.com/UWoy5IYBdhLWcg3wfOB4#8524609 - selbie
3个回答

3
简短的回答:你做不到。
长篇回答:NAT穿透问题需要10年以上的开发工作,据我所知除了Skype之外没有其他可靠的产品(Skype允许您编写插件,这些插件基本上使用Skype作为可靠的P2P连接提供程序,您无需担心,详见这里这里)。当然,使用Skype作为“请提供P2P连接”的服务提供商将您绑定到专有且不在您掌控之中的解决方案,因此它并不是真正的...解决方案。
现在,还有另一个问题,这将使得在IPv4上进行NAT穿透变得更加困难:具体来说,ISP将开始引入所谓的“运营级NAT”(CGN,请参见这里),它们使用与家庭NAT使用不同类型的端口分配算法(此外,您现在将有两个级联的NAT要处理)。简而言之,在没有10年以上的开发资源的情况下,请忘记在IPv4上进行任何P2P。顺便说一句,即使是Skype也预计会屈服于CGN(对于移动连接来说这已经是常态了,即几乎没有移动运营商为手持设备提供公共IPv4地址),这也(在我看来最有可能)是微软收购Skype后首先做的事情之一,即放置数千个中继,以便它们能够处理未来几年内无法在IPv4上建立P2P连接的问题,详见这里(忘记文章末尾的MS回复吧,那是胡扯)。
你可以做的是开始学习更多关于IPv6的知识:使用IPv6应该会更容易,因为(据称)将不再需要NAT(有一种称为NPT的P2P友好协议)。IPv6路由器的问题在于目前还没有端口控制标准协议,但正在开发中,详见这里,因此,如果这个(或其他)协议成为标准并被CPE制造商采用,那么IPv6路由器穿透将变得非常简单。
所以,无论如何,您现在的最佳选择是在未来3到5年内忘记P2P。不幸的是...
PS. 另外两个链接:
  1. 这个是我的项目,相信我,它很混乱;
  2. 野外中的CGN

0
重点是,如果公共互联网上有某种端口转发/NAT 可用的话,您才能连接到另一个节点。大多数情况下是有的,因为对于您的每个私有节点(私有节点指的是使用公共 IP 后面带有私有 IP 地址的节点),它仍在访问互联网,而这只有在已经存在一些规则时才会发生。唯一的问题是,您是否可以将该规则用于您的应用程序。
我在上面的评论中提到的链接提到了一些常用的技术。

0

你必须使用STUN和/或UPnP等技术来穿过NAT路由器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接