Networking 每个NAT下的P2P网络

Networking 每个NAT下的P2P网络,networking,udp,p2p,nat,hole-punching,Networking,Udp,P2p,Nat,Hole Punching,我正在做一些移动项目,需要与两台设备进行P2P通信。 我面临着这个问题。(因为智能手机很少有公共ip) 我找到了一些答案。这是“UDP打孔” 我想我100%理解“UDP打孔”的概念,并编写了一些代码。 但它不起作用 这就是我的处境 Device A connected NAT(A) for Wi-Fi. Device B connected NAT(B) for Wi-Fi. NAT(A) and NAT(B) is different one. Relay Server S bi

我正在做一些移动项目,需要与两台设备进行P2P通信。
我面临着这个问题。(因为智能手机很少有公共ip)

我找到了一些答案。这是“UDP打孔”

我想我100%理解“UDP打孔”的概念,并编写了一些代码。 但它不起作用

这就是我的处境

Device A connected NAT(A) for Wi-Fi.  
Device B connected NAT(B) for Wi-Fi.  
NAT(A) and NAT(B) is different one.  

Relay Server S bind socket and waiting for devices. (S is WebServer but Network Status is good.)  

At the first, A and B send dummy packet to S. Then S save UniqueID(to tell A and B), Public IP, Port.  

And S send information to each device A and B.   

Like this:  
 - IP Address and Port Number about A. -> send to B  
 - IP Address and Port Number about B. -> send to A  

Now A and B send UDP packet to other device based on information(IP Address and Port Number) from S.  
(15 per second. using same socket that used server-device session)  
但它不起作用。(实际上是间歇性地工作。也许每10次就有一次?我不知道成功和失败的原因。没有任何微小的共同关系。)

我认为这不是NAT类型的问题。我在韩国进行了测试,韩国90%的NAT不是对称圆锥

  • 根据NAT的实现情况,它可能根本不起作用。NAT打孔需要一些特殊形式的NAT实现: a) 如果NAT识别UDP流量,它可能(但有时不)通过将发送方端口号更改为某个随机端口号(并将发送方IP更改为公共IP地址)进行NAT转换,然后在一段有限的时间内将该端口上的传入UDP流量重定向回NAT后面的主机(更改回端口号并更改接收器IP)。这就是它的工作原理。 b) 另一种可能性是,NAT只将流量从特殊主机重定向到打开的端口,再重定向到NAT后面的主机。这就是它不起作用的地方。 c) 什么“刷新”传入流量规则的超时时间还没有标准化。传入流量可能会延长超时时间。但可能需要将传出流量发送到同一主机(服务器)以延长超时时间

  • 对于某些实现,UDP状态似乎也会很快过期(在某些情况下,在100毫秒内)。这意味着,您需要继续向服务器发送保持活动的数据包,或者-您至少需要在短于100毫秒的时间内发送UDP数据包(例如,每50毫秒或20毫秒发送一次)

  • 根据NAT的实现情况,它可能根本不起作用。NAT打孔需要一些特殊形式的NAT实现: a) 如果NAT识别UDP流量,它可能(但有时不)通过将发送方端口号更改为某个随机端口号(并将发送方IP更改为公共IP地址)进行NAT转换,然后在一段有限的时间内将该端口上的传入UDP流量重定向回NAT后面的主机(更改回端口号并更改接收器IP)。这就是它的工作原理。 b) 另一种可能性是,NAT只将流量从特殊主机重定向到打开的端口,再重定向到NAT后面的主机。这就是它不起作用的地方。 c) 什么“刷新”传入流量规则的超时时间还没有标准化。传入流量可能会延长超时时间。但可能需要将传出流量发送到同一主机(服务器)以延长超时时间

  • 对于某些实现,UDP状态似乎也会很快过期(在某些情况下,在100毫秒内)。这意味着,您需要继续向服务器发送保持活动的数据包,或者-您至少需要在短于100毫秒的时间内发送UDP数据包(例如,每50毫秒或20毫秒发送一次)


  • 你能解释一下(更详细的)如果它“不起作用”会发生什么吗?你在a和B连一个包都没有收到吗?(还是只发送一些数据包然后停止?)数据包是否到达中继服务器?--另外:了解您使用的是哪种路由器硬件(例如Linksys WRT54GU)以及您使用的是哪种固件可能会有所帮助。两个客户端(设备)都无法获得其他客户端的数据包,但当时与服务器联网是可以的。(使用sage套接字,并且在停止与服务器联网时,客户端也无法获取数据包。)因此,我们尝试将数据包发送到新服务器S,而不是发送到B(这取决于目标源是否更改,NAT是否分配新端口号),S获得的端口号与S获得的端口号相同。我们测试了NAT硬件为“iptime N6004”和蜂窝(Wibro、3G、LTE)。此外,我们还测试了蜂窝环境。(两个设备均使用蜂窝网络而非Wi-Fi)。如果是硬件问题,UDP打孔在蜂窝环境中是不可能的?您能解释一下(更详细的)如果“不工作”会发生什么吗?你在a和B连一个包都没有收到吗?(还是只发送一些数据包然后停止?)数据包是否到达中继服务器?--另外:了解您使用的是哪种路由器硬件(例如Linksys WRT54GU)以及您使用的是哪种固件可能会有所帮助。两个客户端(设备)都无法获得其他客户端的数据包,但当时与服务器联网是可以的。(使用sage套接字,并且在停止与服务器联网时,客户端也无法获取数据包。)因此,我们尝试将数据包发送到新服务器S,而不是发送到B(这取决于目标源是否更改,NAT是否分配新端口号),S获得的端口号与S获得的端口号相同。我们测试了NAT硬件为“iptime N6004”和蜂窝(Wibro、3G、LTE)。此外,我们还测试了蜂窝环境。(两个设备均使用蜂窝网络而非Wi-Fi)。如果是硬件问题,UDP打孔在蜂窝环境中是不可能的?