3G网络上的UDP洞穿无法实现

37

我正在尝试在软件中实现洞穿功能,但问题是我已经使用已有的TCP服务器与用户进行通信。

这是我目前的进展:

  • "A" 向UDP服务器 "US"(端口9333)发送一条消息
  • "US" 返回连接到的端口(本地端口 31005)给 "A"
  • "A" 向TCP服务器 "TS" 发送一条消息,表示他想要连接到 "B"(并提供端口 31000)
  • "TS" 向 "B" 发送一条消息,提供 "A" 的端口(31000)和ip
  • "B" 向 "US"(端口9333)发送一条消息
  • "US" 返回端口45000(本地端口45005)给"B"
  • "B" 向 "TS" 发送一条消息,提供它的udp端口(45000)
  • "TS" 向 "A" 发送一条消息,提供 "B" 的udp端口(45000)和ip
  • "A" 开始向B的ip地址的45000端口发送udp消息,并在本地端口31005上侦听
  • "B" 开始向A的ip地址的31000端口发送udp消息,并在本地端口45005上侦听

当然,端口号31000、31005、45000和45005仅作为示例,每次新连接都会更改端口号,只有9333是静态的。

我知道这里有很多来回传递的过程,比实际需要的要多得多。事实上,我必须使用TCP服务器与两个用户进行通信,UDP服务器仅用于将用户的端口返回给自己,以便将其发送回TCP服务器。

然而,用户之间的消息没有被接收到......有人能想到原因吗?


编辑:

我已经测试过我的路由器,并使用http://nattest.net.in.tum.de/test.php测试了udp打洞,一切正常,所以问题不是来自于我的路由器,而是协议...

当用户在同一个NAT之后时,一切正常,当然它使用了私有IP,但这意味着代码也在工作,因此每个想法都导致协议问题...


编辑2:

事实上,我让它半工作(实际上问题来自于我的代码,而不是协议...我连接了两个用户,一个使用iPhone的3G,另一个在我的NAT后面的Wifi上。

有趣的(好吧并不是那么有趣)是,只有一个套接字能够在两个用户之间接收和发送数据。(由iPhone发起的套接字)根据协议,我应该有2个完全连接的套接字,没错吧?

所以,我设法在我的NAT中打洞,但实际上没有在蜂窝网络NAT中打洞。

当然,我立即测试了两个通过3G连接的iPhone。没有人能够从另一个iPhone获得消息。

我对蜂窝网络NAT有所遗漏吗?

P.S.:很抱歉一直在更新我的问题,但由于没有得到答案,我正在尽力自己找...

P.S.2:由于我已经成功地在我的NAT中打洞,因此我已更改标题,添加“在3G上”


编辑3:我再次运行了http://nattest.net.in.tum.de/test.php测试,使用我的电脑通过iPhone的3G连接上网。

这是结果: UDP HOLE PUNCHING RESULT

显然,在第9个测试中所有udp打洞测试都成功了。

此外,似乎:

UDP绑定测试(?):端点独立绑定,端口预测很容易。

因此,在3G连接上连接两个对等方不应该有任何问题(那就不比在“家庭”NAT后面更麻烦)...我说得对吗?


编辑4:

为了确保,我现在向两个不同的UDP服务器发送消息,以检查3G上的端口和本地端口是否相同。

长话短说,当连接到两个服务器时,端口(本地和公共)是相同的。因此,对于udp而言是端点独立的,所以我想进行穿孔也没有任何问题...(至少从我的ISP来看)


3G NAT是对称和大规模的。请尝试使用此打洞方法:https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing - user4691169
1
我对http://nattest.net.in.tum.de/test.php感到非常满意,我已经寻找这样的服务很长时间了。 - Sourav Ghosh
2个回答

18

很不幸,目前没有一种百分之百可靠的方式可以通过UDP进行NAT穿透。最好的情况是,你可以猜测NAT和防火墙大多数时间会如何行事。但总会有例外情况,而且它们可能不是罕见的。

在这种情况下,听起来像是您正在使用一个中央服务器让两个对等方找出彼此的外部端口,然后开始互相发送数据。这是一个相当不错的算法。问题在于外部端口路由可能因目标而异。换句话说,如果A到B的外部端口为5000,不能保证A到C也将从5000发出。因此,中央服务器记录其所看到的端口可能无助于连接其他人。

以下是一些相关问题及更多细节:


1
像Skype这样的服务在无法建立直接连接时会通过中央服务器路由数据。当两个设备都使用3G时无法工作的最可能原因是移动设备之间的路由与每个设备到中央服务器的路由不同。换句话说,您可能正在通过完全不同的NAT设备进行通信。 - Seth Noble
我不确定你所说的内容。在Skype网站上可以看到:“Skype团队通过利用网络中所有可用的资源,成功地实现了P2P通信,而无需昂贵的集中式资源。”此外,我非常确定(因为我认识Viber的CTO),Viber不使用代理,但他们设法使其在3G上工作,我真的不知道如何做到的!我使用的算法可能不适用于3G连接,是否有其他的算法不涉及Zeroconf或Upnp? - TheSquad
2
Skype有点令人困惑,因为他们谈论的是一种“点对点”通信和中继网络,而不是固定的中央服务器,但是成为点对点网络的一部分并不意味着两个节点之间的数据不会在第三个节点之间中继。我不熟悉Viber,但如果它们真的是基于UDP并且没有中继数据的方法,那么在双重NAT情况下它将无法工作。 - Seth Noble
1
并不完全准确:我是说在两个节点都位于NAT后面时,没有一种100%可靠的方法可以连接它们。没有一种算法能够始终适用于所有设备和网络配置。有一些算法在大多数情况下都能正常工作,但如果无法显式打开NAT中的端口或扫描整个网络,总会存在某些情况或拓扑结构下这些算法会失败的情况。 - Seth Noble
@TheSquad - 试试这个算法:https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing - user4691169
显示剩余8条评论

8

2
不确定为什么有人给你点了踩,你提供的论文很有趣... +1 - TheSquad

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