【问题标题】:Getting around NAT for P2P app if I have all ip info?如果我有所有 ip 信息,是否可以绕过 P2P 应用程序的 NAT?
【发布时间】:2012-12-21 19:54:16
【问题描述】:
我正在制作一个 P2P 安卓应用。我目前的问题是我无法让我的设备相互识别,除非它们在同一个网络上并且我使用私有 IP 地址——我将所有公共 IP/端口/私有 IP 地址都存储在数据库中。
鉴于 NAT 阻止了我的尝试,我应该如何让一个人联系另一个人,而无需进入路由器设置和端口转发,而且我无法从公共 IP 地址中具体选择要选择的私有 IP...
我应该如何成功到达我的同伴设备 =]
【问题讨论】:
标签:
java
android
p2p
nat
upnp
【解决方案1】:
简短的回答:你不能
长答案:NAT 穿越问题需要 10 多个人年的努力,据我所知,除了 Skype 之外,没有其他产品可以可靠地做到这一点(Skype 允许您编写基本上使用的插件Skype 作为您不必关心的可靠 P2P 连接提供商,请参阅例如 here 和 here)。果然,使用 Skype 作为“请为我提供 P2P 连接”服务提供商会将您与专有且无法控制的解决方案联系起来,因此它并不是真正的...解决方案。
现在,还有一个问题只会让未来几年 IPv4 上的 NAT 遍历变得更加困难:具体来说,ISP 将开始引入所谓的“运营商级 NAT”(CGN,请参阅 @987654323 @ 介绍),它使用与家庭 NAT 使用的不同类型的端口分配算法(此外,除此之外,您现在将有两个级联 NAT 来处理)。简而言之,如果您手头没有 10 人年以上的开发资源,请忘记任何基于 IPv4 的 P2P。顺便说一句,甚至Skype也有望屈服于CGN(这已经是移动连接的标准,即几乎没有移动运营商为手机提供公共IPv4地址),这(很可能是恕我直言)原因MS 在获得 Skype 后做的第一件事就是放置数千个 RELAYS,以便这些中继能够在未来几年内解决通过 IPv4 建立 P2P 连接的可能性,请参阅this(忘记 MS ' 在文末回复,是废话)
您可以做的是开始更多地了解 IPv6:使用 IPv6 应该会容易得多,因为(据称)将不再有 NAT(有一种叫做 NPT 的东西,但这是一个 P2P 友好的协议)。 IPv6 路由器的问题是(目前)还没有端口控制标准协议,但目前正在制定一些东西,请参阅this,所以应该/何时该(或其他)协议将标准化并被CPE制造,那么IPv6路由器穿越将是微不足道的。
因此,无论哪种方式,您现在最好的选择是在未来 3 到 5 年内忘记 P2P。可惜……
附言。还有 2 个链接:
-
This 是我的项目,相信我,这是一团糟;
-
CGNs in the wild。
【解决方案2】:
关键是你只能连接到另一个节点,如果有某种端口转发/NAT可以通过公共互联网使用。很可能存在,因为对于您的每个私有节点(私有节点是指一个在公共 ip 后面具有私有 ip 地址的节点)它仍在访问互联网,并且只有在已经存在某些规则时才会发生这种情况。唯一的问题是您是否可以为您的应用使用该规则。
我在上面的 cmets 中提到的链接提到了一些常用的技术。
【解决方案3】:
您必须使用 STUN 和/或 UPnP 等技术才能通过 NAT 路由器。