UDP打孔在3G上无法通过
我试图在软件中实现打孔功能。 问题是,我正在用一个已经制作好的TCP服务器来实现这一点,以便与用户通信 以下是我目前掌握的情况: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”发送消息,告知其端
- “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上侦听
编辑: 我已经测试了我的路由器和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。因此,让中央服务器记录它看到的端口可能无助于连接其他任何人 下面是一些相关的问题和一些更详细的信息