我正在做一些移动项目,需要与两台设备进行P2P通信 我遇到了问题。 (因为智能手机很少有公共IP)
我找到了一些答案。它是'UDP Hole Punching'。
我想我从概念上理解'UDP打孔'100%并编写一些代码。 但它不起作用。
这是我的情况。
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 Type问题。我测试了韩国,韩国的90%NAT不是Symmetric Cone。
答案 0 :(得分:1)
根据NAT的实现,它可能根本不起作用。 NAT打孔需要一些特殊形式的NAT实现: a)如果NAT识别UDP流量,它可能(但有时不会)通过将发送方端口号更改为某个随机端口号(并将发送方IP更改为公共IP地址)进行NAT转换,然后重定向 - 对于某些限制一段时间 - 该端口上的传入UDP流量返回NAT后面的主机(更改端口号并更改接收器IP)。这就是它的工作原理。 b)另一种可能性是,NAT确实只将流量从特殊主机重定向到该开放端口到NAT后面的主机。这是它无法工作的地方。 c)没有标准化“刷新”传入流量规则的超时。传入流量可能会延长超时时间。但可能需要将流量传输到同一主机(服务器S)以延长超时时间。
对于某些实现,UDP状态似乎也很快到期(在某些情况下在100毫秒内)。这意味着,您需要继续向服务器'S'发送保持活动数据包 - 或者 - 您至少需要在短于100毫秒的时间内发送UDP数据包(例如每50毫秒或20毫秒一次)。 / p>