每个 NAT 下的 P2P 网络
Posted
技术标签:
【中文标题】每个 NAT 下的 P2P 网络【英文标题】:P2P Networking under the each NAT 【发布时间】:2013-01-16 12:49:01 【问题描述】:我正在做一些移动项目,需要与两个设备进行 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 不是对称锥。
【问题讨论】:
您能否解释(更详细地)会发生什么,如果它“不起作用”,好吗?您在 A 和 B 处甚至没有收到一个数据包吗? (或者它只是传输一些数据包然后停止?)数据包是否到达中继服务器 S? -- 另外:了解您正在使用哪种路由器硬件(例如 Linksys WRT54GU)以及您正在使用哪种固件可能会有所帮助。 两个客户端(设备)都无法获得其他人的数据包,但当时与服务器联网很好。 (使用 sage 套接字,并且当停止与服务器联网时,客户端也无法获取数据包。)所以我们尝试 A 将数据包发送到新服务器 S' 而不是 A 发送到 B(这是确定目标源何时更改,NAT 分配新端口号与否。)结果,S 获取的端口号与 S 获取的端口号相同。我们测试的 NAT 硬件是 'iptime N6004' 和蜂窝(Wibro,3G,LTE)。 此外,我们也失败了蜂窝环境。 (两个设备都使用蜂窝网络而不是 Wi-Fi)。如果是硬件问题,蜂窝环境下UDP打孔是不可能的? 【参考方案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 毫秒一次)。
【讨论】:
以上是关于每个 NAT 下的 P2P 网络的主要内容,如果未能解决你的问题,请参考以下文章