35

我正在尝试在软件中实现打孔功能。问题是,我正在使用一个已经制作好的 TCP 服务器来与用户通信。

这是我到目前为止所拥有的:

  • “A”向 UDP 服务器“US”发送消息(在端口 9333 上)
  • “US”将它连接到的端口发送回“A”(端口 31000 - 本地端口 31005)
  • “A”向 TCP 服务器“TS”发送一条消息,说他想连接到 B(并提供端口 31000)
  • “TS”向“B”发送一条消息,给他“A”的端口(31000)和ip
  • “B”向“US”发送消息(在端口 9333 上)
  • “US”向“B”发送一条消息,告诉他他的端口 45000(本地端口 45005)
  • "B" 向 "TS" 发送一条消息,给出的是 udp 端口​​ (45000)
  • “TS”向“A”发送一条消息,提供 B 的 udp 端口​​(45000)和 ip
  • “A”开始在端口 45000 上向 B 的 ip 发送 udp 消息,并在本地端口 31005 上侦听
  • “B”开始在端口 31000 上向 A 的 ip 发送 udp 消息并监听本地端口 45005

当然这里以 31000、31005、45000 和 45005 端口为例,每个新连接端口都会改变,只有 9333 是静态的。

我知道有很多来回,比它应该的要多。事实是我必须使用 TCP 服务器与两个用户进行通信,udp 服务器只是在这里将用户的端口返回给自己,以便它可以将其发送回 TCP 服务器。

但是,任何人都没有收到用户之间的消息......任何人都会知道为什么?


编辑 :

我已经用http://nattest.net.in.tum.de/test.php测试了我的路由器,并且 udp 打孔工作正常,所以问题不是来自我的路由器,而是来自我的协议......

当用户在同一个 NAT 后面时,一切正常,当然它使用私有 ip,但这意味着代码也在工作,所以每一次都会导致协议问题......


编辑 2:

实际上,我成功了一半(问题实际上来自我的代码,而不是协议......我已经连接了 2 个用户,一个在 3G 中使用 iPhone,一个在我的 NAT 后面的 Wifi 上。

有趣(当然不是那么多)的事情是,只有一个套接字能够在两个用户之间接收和发送数据。(由 iphone 发起的套接字)根据协议我应该有 2 个连接良好的套接字,我错了吗?

所以我设法在我的 NAT 上打了一个洞,但实际上没有在蜂窝 NAT 上打洞。

当然,我马上测试了 2 部 3G 连接的 iphone。没有人得到对方的信息。

我是否错过了有关蜂窝 NAT 的某些内容?

PS:很抱歉更新了这么多我的问题,但由于我没有得到答案,我试图自己找到......

PS 2:由于我设法在我的 NAT 上打了一个洞,我更改了标题,添加了“on 3G”


编辑 3:我再次运行http://nattest.net.in.tum.de/test.php测试,我的电脑通过我的 iphone 的 3G 连接连接到互联网。

结果如下: UDP打孔结果

显然所有的 udp 打孔测试在第 9 次测试中都成功了。

似乎更进一步:

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

因此,通过 3G 连接连接 2 个对等点应该不会有任何问题(远不及“家庭”NAT 后面)......我说的对吗?


编辑 4:

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

长话短说,在两台服务器上连接时,端口(本地和公共)是相同的。所以在 EDIT 2 上完成的测试是正确的,udp 是独立于端点的,所以我猜打孔应该没有任何问题......(至少与我的 ISP 一样)

4

2 回答 2

18

不幸的是,没有 100% 可靠的方法来使用 UDP 执行 NAT 打孔。充其量,您可以对 NAT 和防火墙在大多数情况下的行为方式做出一些猜测。但总会有例外,而且可能并不罕见。

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

以下是一些相关问题以及更多详细信息。

于 2012-09-12T16:50:25.377 回答
8

您背后的 NAT 是对称的,或者它会根据您的目的地更改您的传出端口号。通过对称 NAT 打孔需要不同的方法(TURN 或 UDP 打孔)。尝试这样做:https ://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing

于 2015-08-14T17:11:52.333 回答