我目前正在使用“打孔”方法在C中实现(UDP)p2p应用程序。我发现了J. Selbie先前的帖子,他解释了基础知识 并相应地进行(post1,post2)但可能我错过了一些东西,只有一个同伴正在接收数据,而另一个不同意。
以下是我要采取的步骤:
设置:其中一个对等体连接到4G蜂窝加密狗(NAT A),另一个连接到转发给ISP提供商(NAT B)的路由器。 这些是针对两个NAT的stunclient(替身演员客户端)报告的结果。
NAT A:
Binding test: success
Local address: X1:48383
Mapped address: Y1:28265
Behavior test: success
Nat behavior: Endpoint Independent Mapping
Filtering test: success
Nat filtering: Address and Port Dependent Filtering
NAT B:
Binding test: success
Local address: X2:49158
Mapped address: Y2:49158
Behavior test: success
Nat behavior: Endpoint Independent Mapping
Filtering test: success
Nat filtering: Address and Port Dependent Filtering
现在,根据这些结果,我的理解是,两个NAT都有合理的行为,并且打孔可能会成功(注意NAT A不进行端口保护)。
问题是,NAT A后面的主机(连接到4G加密狗)总是收到消息,尽管回复了正确的目的地IP和端口,但另一个(NAT B)却从未得到消息。我在这里缺少什么想法?或者如何诊断问题??
先谢谢。
答案 0 :(得分:-2)
这是标准和一般情况,其中蜂窝和wifi(ISP)网络之间的p2p(点对点)呼叫是不可能的。为什么?
为什么?:所有蜂窝网络都使用经济高效的方法,用户无法拥有专用的公共IP或NAT。意味着手机公共IP可能会在几个小时左右后发生变化。因此,蜂窝网络提供商可以为大量用户使用较少数量的公共IP。这个过程通常是通过为每个请求分配新的ip:端口来完成的,这是symmetric NAT的一个特性。所以在你的情况下,因为NAT B是Nat filtering: Address and Port Dependent Filtering
,这意味着如果数据来自NAT A每个发送/请求都有唯一的ip:端口,那么NAT B将过滤数据并且呼叫将失败。
解决方案:一般情况下,您需要一个托管在公共IP上的中继服务器,它将从A接收数据并将其转发给B,B也会这样做,而不进行任何过滤。这种服务器称为TURN server。
现在我不确定为什么你的替身演员测试客户端正在检测A和B的PRC NAT(Nat filtering: Address and Port Dependent Filtering)
。对于A,它必须是Symmatric NAT,因为它在蜂窝网络上。