在iPhone上进行TCP打洞

6
我已经阅读了一些相关内容,虽然我对iPhone网络连接还不是很熟悉,但我想知道是否可以通过TCP打洞来连接两个通过NAT的iPhone。我也阅读了一些关于uPnP和hairpinning的有用信息,但我对它们并不太熟悉,如果有人能提供任何关于这个问题的想法,那就太好了。
我的目标是能够连接多个iPhone,覆盖范围较大(因此最好切换到某种类型的GPSR),但现在我只需要处理两个iPhone,理论上3G NAT遍历似乎是最简单和最可靠的方法。
2个回答

10

网络地址转换穿越(NAT traversal)是用于通过会议服务器直接连接两个节点的通用术语。节点可以是任何东西,计算机、智能手机或任何其他设备。就3G而言,它是传输数据的媒介之一,没有更多内容。

如果您的对等设备在同一个 NAT 下使用公共 IP 进行连接,则会出现 Hairpin 的情况,因为某些路由器不支持 Hairpinning,如 Cisco 路由器等。如果您使用私有 IP 而不是公共 IP,则可以克服这个问题。我不能针对您的情况讲解 Hairpinning,因为我不知道您网络的技术细节。

请更新您的问题,提供关于您使用的 3G 类型等技术细节,然后我才能谈论 3G 上的 Hairpinning。

我已经在 2G 上使用 UDP/TCP 打洞实现了 NAT 穿透。我使用三台电脑(一个会议服务器和两个节点)来完成此操作。

  1. 开发一个会议服务器程序,在一台电脑上运行。该程序应能够交换两个 iPhone 设备的公共 IP。

  2. 开发一个客户端程序,安装在 iPhone 上。将 iPhone 连接到服务器,这将向服务器公开 iPhone 的公共 IP。对于第二个 iPhone,重复同样的过程。现在,服务器将公共 IP/端口交换给两个 iPhone。然后同时开始向彼此发送数据包,这将打洞 NAT。

关于打洞的详细信息可以在此处找到:http://www.brynosaurus.com/pub/net/p2pnat/

最好尝试使用容易开发的 UDP 打洞。TCP 打洞有点棘手。一旦实现了 UDP 打洞,就很容易实现 TCP 打洞。请了解 STUN、ICE、NAT 类型和 NAT 映射等知识。

https://www.rfc-editor.org/rfc/rfc5389
http://en.wikipedia.org/wiki/Network_address_translation


我其实在想,是否只用 iPhone 就能实现。我的猜测是不行的,因为你必须要以某种方式控制每个 iPhone 的本地网络,但我不确定。 - Skyler
每个iPhone的本地区域网络是提供商的网络,例如英国电信、Vodafone。该本地区域将为每个iPhone提供IP地址,该IP地址仅适用于其网络。但是,当两个不同网络之间的iPhone进行通信时,例如Vodafone和英国电信之间,它们将使用一些公共IP。这是我的想法,不确定是否正确。如果您能澄清“以某种方式能够控制每个iPhone的本地网络”,那么就容易理解您的问题了。 - Vikram Ranabhatt
是的。我认为问题在于每个手机只能获取另一台手机的公共IP地址。我不认为在不知道每台手机所处网络的情况下可以通过3G获取本地IP地址,而且由于例如Vodafone、Telecom、AT&T或Singtel控制着该网络,我不认为这是可能的。我想知道是否可以在没有手机本地IP地址的情况下访问该网络或查找IP地址。 - Skyler
我从未尝试过使用3G,但我尝试使用Vodafone/Air Tel的数据卡(2G),它只会提供公共IP。该公共IP足以在同一网络内或外部相互通信。2G和3G网络是相同的。当您的设备使用路由器连接到网络(如组织中的PC)时,会涉及私有IP。因此,在组织中为了容纳大量用户,他们安装NAT/路由器。在移动通信中,这种情况永远不会发生,因为您的iPhone没有与路由器连接,并且提供商会动态地为每个电话分配IP地址。 - Vikram Ranabhatt
所以,如果我理解正确的话,只要这两个手机在不同的网络中,它们将被提供商分配不同的IP地址,你将无法直接通信(没有服务器或其他东西的情况下)。它们必须在同一个网络中,而在我的情况下,我无法保证这一点。 - Skyler
无论手机是否在同一网络上,都会为两个手机分配公共IP地址,并使用“打洞”技术进行连接。当然,需要一个服务器来进行初始连接。一旦手机之间的连接完成,您可以断开与服务器的连接并开始两个手机之间的通信。我想知道您正在遵循哪些程序来完成此通信。请及时更新我。 - Vikram Ranabhatt

0

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