首页 文章

P2P应用程序,打孔不起 endpoints 独立映射NAT

提问于
浏览
0

我目前正在使用"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 回答

  • -2

    这是标准和一般情况,其中蜂窝和wifi(ISP)网络之间的p2p(对等)呼叫是不可能的 . 为什么?

    Why?: 所有蜂窝网络都使用经济有效的方法,没有用户可以拥有专用的公共IP或NAT . 意味着手机公共IP可能会在几个小时左右后发生变化 . 因此,蜂窝网络提供商可以为大量用户使用较少数量的公共IP . 这个过程通常是通过为每个请求分配新的ip:端口来完成的,这是symmetric NAT的一个特性 . 所以在你的情况下,因为NAT B是 Nat filtering: Address and Port Dependent Filtering ,这意味着如果数据来自NAT A每个发送/请求都有唯一的ip:端口,那么NAT B将过滤数据并且呼叫将失败 .

    Solution: 一般情况下,你需要一个托管在公共IP上的中继服务器,它将从A接收数据并将其转发给B,而B也将不进行任何过滤 . 这种服务器称为TURN server .

    现在我不确定为什么你的替身演员测试客户端正在检测A和B的 PRC NAT(Nat filtering: Address and Port Dependent Filtering) . 对于A,它必须是Symmatric NAT,因为它在蜂窝网络上 .

相关问题