P2P应用程序,端口独立映射NAT无法使用打孔

时间:2016-01-26 17:21:03

标签: p2p nat stun hole-punching

我目前正在使用“打孔”方法在C中实现(UDP)p2p应用程序。我发现了J. Selbie先前的帖子,他解释了基础知识 并相应地进行(post1post2)但可能我错过了一些东西,只有一个同伴正在接收数据,而另一个不同意。

以下是我要采取的步骤:

  • 设置:其中一个对等体连接到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不进行端口保护)。

  • 打孔尝试: 两个客户端通过UDP联系面向公共服务器(STUN / rendezvous)以发现/交换ip:端口对。当每个客户端从服务器接收响应时,它们将UDP数据报发送到另一个对等方(ip:端口,如联系的公共服务器所见),然后继续发送更多信息并接收并回复该消息到该地址来自它。 我使用与公共服务器联系的相同套接字发送数据报,仅在sendto函数上更改目标IP:端口。

问题是,NAT A后面的主机(连接到4G加密狗)总是收到消息,尽管回复了正确的目的地IP和端口,但另一个(NAT B)却从未得到消息。我在这里缺少什么想法?或者如何诊断问题??

先谢谢。

1 个答案:

答案 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,因为它在蜂窝网络上。