UDP打孔在3G上无法通过

UDP打孔在3G上无法通过,udp,3g,hole-punching,3g-network,Udp,3g,Hole Punching,3g Network,我试图在软件中实现打孔功能。 问题是,我正在用一个已经制作好的TCP服务器来实现这一点,以便与用户通信 以下是我目前掌握的情况: “A”向UDP服务器“US”发送消息(在端口9333上) “US”将其连接到的端口发送回“A”(端口31000-本地端口31005) “A”向TCP服务器“TS”发送一条消息,表示他希望s连接到B(并给端口31000) “TS”向“B”发送一条消息,给他“a”的端口(31000)和ip “B”向“US”发送消息(在端口9333上) “US”向“B”发送消息,告知其端

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

以下是我目前掌握的情况:

  • “A”向UDP服务器“US”发送消息(在端口9333上)
  • “US”将其连接到的端口发送回“A”(端口31000-本地端口31005)
  • “A”向TCP服务器“TS”发送一条消息,表示他希望s连接到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服务器

但是,用户之间的消息不会被任何。。。 谁都知道为什么


编辑:

我已经测试了我的路由器和udp打孔工作良好,所以问题不是来自我的路由器,而是来自我的协议

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


编辑2:

事实上,我做到了一半(问题其实来自我的代码,而不是协议……我已经连接了两个用户,一个是3G用户,一个是iPhone用户,另一个是在我的NAT后面的Wifi用户)

有趣的是,只有一个插座能够在两个用户之间接收和发送数据。(由iphone启动的插座)根据协议,我应该有两个连接良好的插座,我错了吗

所以我设法在我的NAT上打了个洞,但实际上并没有在手机NAT上打洞

当然,我马上测试了两部3G连接的iPhone,但没有人收到对方的信息

我是否错过了有关手机NAT的内容?

旁白:很抱歉更新了这么多我的问题,但因为我没有得到答案,我正试图自己找到答案

第二点:自从我设法在我的NAT上打了个洞后,我把标题改成了“在3G上”


编辑3:我再次运行了测试,我的电脑通过iphone的3G连接连接到互联网

结果如下:

显然,在第9次试验中,所有udp打孔试验均成功

此外,似乎:

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

因此,通过3G连接连接2个对等点应该不会有任何问题(比在“家庭”NAT后面要简单得多)…我说的对吗


编辑4:

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


长话短说,在两台服务器上连接时,端口(本地和公共)是相同的。因此,在EDIT 2上进行的测试是正确的,udp是端点独立的,所以我想打孔应该不会有任何问题…(至少在我的ISP上)

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

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

下面是一些相关的问题和一些更详细的信息


您后面的NAT是对称的,或者它会根据您的目的地更改您的传出端口号。通过对称NAT打孔需要不同的方法(TURN或UDP多孔打孔)。试着这样做:

嗨,谢谢你的回答……唉,我知道没有100%可靠的方法来使用UDP执行NAT打孔:-(。但是,现在只有当两个对等方都支持3G连接时才会出现问题。我试过使用不同类型的NAT,这对大多数人都有效(实际上只有对称NAT失败,但我知道…。我不明白的是,当两个对等方都在3G上时,它为什么不工作,尽管skype和Viber似乎工作正常,但当两个对等方都在3GLike上时,我在问题中写道,当一个对等方在非对称NAT后面,另一个在3G上时,一个插座(共2个)工作正常,因此我可以通过该套接字在两台设备上发送和接收。当无法建立直接连接时,Skype等服务通过中央服务器路由数据。当两台设备都在3G上时,它可能无法工作的最可能原因是,移动设备之间的路由不同于从每台设备到中央服务器的路由r、 换句话说,你可能正在使用完全不同的NAT设备。Skype有点令人困惑,因为他们谈论的是一个用于通信和中继的“对等”网络,而不是固定的cen