当前位置: 首页 > 知识库问答 >
问题:

P2P应用程序,打孔不工作于endpoint无关映射NAT

叶鸿煊
2023-03-14

我目前正在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不执行端口保护)。

    • 穿孔尝试:两个客户端通过UDP联系面向公共的服务器(STUN/Rendezvous)以发现/交换IP:端口对。当每个客户端收到来自服务器的响应时,它们会向另一个对等体发送一个UDP数据报(IP:联系的公共服务器看到的端口),然后继续发送更多的数据报,并接收消息并将其回复到消息的来源地址。我正在使用与公共服务器联系的相同套接字发送数据报,只是更改了sendto函数上的destination ip:port。

    问题是,NAT A后面的主机(连接到4G加密狗)总是收到消息,尽管回复了正确的ip和目的端口,后面的另一个主机(NAT B)却永远不会收到消息。你知道我错过了什么吗?或者如何诊断问题??

    提前道谢。

  • 共有1个答案

    虞展
    2023-03-14

    这是不可能在蜂窝和wifi(ISP)网络之间进行p2p(对等)呼叫的标准和通用场景。现在为什么?

    为什么?:所有的蜂窝网络都使用一种低成本的方法,没有用户可以拥有专用的公共IP或NAT。这意味着手机的公共IP可能会在几个小时左右发生变化。结果,蜂窝网络提供商可以为大量用户使用较少数量的公共IP。这个过程通常通过为每个请求分配新的ip:port来完成,这是对称NAT的一个特性。因此,在您的情况下,由于NAT B是NAT Filtering:Address and Port Dependent Filtering,这意味着如果来自NAT A的数据对于每个发送/请求都具有唯一的ip:Port,那么NAT B将过滤数据,并且调用将失败。

    解决方案:通常情况下,您需要一个托管在公共IP上的中继服务器,它将接收来自a的数据并将其转发给B,而B也将这样做,而不需要做任何过滤。这种服务器被称为TURN服务器。

    现在我不确定为什么您的特技人测试客户端检测到A和B的PRC NAT(NAT过滤:地址和端口相关过滤)。对于A来说,它必须是对称NAT,因为它在蜂窝网络上。

     类似资料:
    • 我正在尝试一些p2p网络。在做了一些研究后,我学到的最大的障碍之一是“如果客户端在NAT/防火墙后面怎么办”,后来我发现了穿孔,但它并不总是能保证工作。 就我所知,我不明白它为什么会失败,这是我目前所知道的: Alice通过创建到目录服务器的连接来加入网络(1)。当发生这种情况时,Alice的NAT将创建一个从其公共ip到本地ip的映射。 目录服务器接收连接并将Alice的公共存储在目录中 Bob

    • 我一直在尝试运行我的客户端/服务器android程序。但是每当我在android上运行客户端部分时,它都会出错不幸的是,您的应用程序已停止运行。我尝试过阅读logcat,但无法解决问题。下面是我的代码...我从3天开始一直在尝试。需要项目帮助 logcat公司 activity\u new\u main\u活动。xml manifest.xml 新建_main_活动。Java语言

    • 在过去的几周里,我花了太多的时间试图让它发挥作用。我的目标是使用烧瓶框架创建一个简单的网络应用程序,但我不断收到错误,几个小时的谷歌搜索和搜索stackoverflow也没有帮助。 我正在学习一个教程,该教程要求我运行:$python3 routes.py 只有我才能得到以下错误: 回溯(最近的最后一次调用):文件“routes.py”,第1行,从flask导入flask中,呈现\u模板导入错误:

    • 基于 ASP 的应用程序是 ASP 页和 ActiveX 组件的集合。当用户定义应用程序时,将使用 Internet 服务管理器指定用户的 Web 站点中应用程序启动点的目录。在用户的 Web 站点中每个位于启动点目录下的文件和文件夹都被认为是应用程序的一部分,直到发现另外的启动点目录为止。这样,用户就可以使用目录作为边界定义应用程序的作用域。每个 Web 站点可以有多个应用程序,而每个应用程序的

    • 我试图做一个简单的Spring启动oau2应用程序,我面临的问题, /oauth/authorize是不匹配到oau2服务器endpoint。该endpoint甚至没有列在可用的apis列表中 我的代码: 和应用程序属性: 当我尝试此请求时: 查看此处Oauth代码请求的图像,打印日志,并且没有匹配器映射到/oauth/authorize 项目源zip:https://filehost.net/4