我正试图在软件中实现打孔功能。 问题是,我正在使用已经建立的TCP服务器与用户进行通信来实现这一点。
这是我到目前为止所拥有的:
当然端口31000,31005,45000和45005就在这里,每个端口更改的新连接,只有9333是静态的。
我知道有很多来回,比实际情况还要多。 事实上,我必须使用TCP服务器与两个用户进行通信,udp服务器就是将用户的端口返回给自己,以便将其发送回TCP服务器。
然而,任何人都没有收到用户之间的消息...... 任何人都会知道为什么?
编辑:
我用http://nattest.net.in.tum.de/test.php测试了我的路由器,udp打孔工作正常,所以问题不是来自我的路由器,而是来自我的协议......
当用户在同一个NAT后面时,一切正常,当然它使用了private ip,但这意味着代码也在工作,所以每一个都会导致协议问题......
编辑2:
实际上,我做了一半的工作(问题实际上是来自我的代码,而不是协议......我已经连接了2个用户,一个用3G连接iPhone,一个连接在我的Wifi上。
有趣的(不是那么多)事情是,只有一个套接字能够在两个用户之间接收和发送数据。 (由iphone发起的套接字)根据协议,我应该有2个连接良好的套接字,我错了吗?
所以我设法在我的NAT中打了一个洞,但实际上并没有在手机NAT中。
当然,我立即测试了2台连接在3G上的iphone。没有人得到另一个人的信息。
我是否错过了有关手机NAT的内容?
P.S。 :很抱歉我的问题更新了很多,但由于我没有得到答案,我试图自己找...
P.S。 2:由于我设法在我的NAT中打了一个洞,我已经更改了“在3G上”的标题
编辑3 :我通过iphone的3G连接将计算机连接到互联网,再次运行http://nattest.net.in.tum.de/test.php测试。
结果如下:
显然所有的udp打孔测试都是在第9次测试中成功的。
似乎还有更多:
UDP绑定测试(?):端点独立绑定,端口预测很容易
因此,通过3G连接连接2个对等设备应该不会有任何问题(远远不及“家庭”NAT背后的事情......我是对的吗?
编辑4:
为了确保,我现在向两个不同的UDP服务器发送消息,以检查3G上的端口和本地端口是否相同。
长话短说,端口(本地和公共)在两台服务器上连接时都是一样的。因此在EDIT 2上进行的测试是正确的,udp是与端点无关的,所以我不应该在进行打孔时遇到任何问题......(至少在我的ISP上)
答案 0 :(得分:15)
不幸的是,没有100%可靠的方法来使用UDP执行NAT打孔。充其量,您可以猜测NAT和防火墙在大多数情况下可能会如何表现。但总会有例外,它们可能并不罕见。
在这种情况下,听起来您正在使用中央服务器让两个对等方找出每个其他外部端口,然后开始相互发送数据。这是一个非常好的算法。问题是外部端口路由可能因目的地而异。换句话说,如果A到B的外部端口为5000,则无法保证A到C也来自5000.因此,让中央服务器记录它看到的端口可能无助于连接任何其他人。
以下是一些相关问题以及更多细节。
答案 1 :(得分:3)
您背后的NAT是对称的,或者根据您的目的地更改您的传出端口号。通过对称NAT打孔需要不同的方法(TURN或UDP多孔打孔)。尝试这样做:https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing