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

UDP穿孔不能在3G上通过

夔学智
2023-03-14

我试图在一个软件中实现一个打孔功能。问题是,我用一个已经制作好的TCP服务器来实现它,以便与用户通信。

以下是我目前掌握的情况:

  • “a”向UDP服务器“US”(端口9333上)发送消息
  • “用户”将其连接的端口(端口31000-本地端口31005)
  • 发送回“A”
  • “a”向TCP服务器“TS”发送消息,表示他想要连接到B(并提供端口31000)
  • “ts”向“b”发送消息,将“a”的端口(31000)和IP
  • “B”向“US”(端口9333上)发送消息
  • “用户”向“B”发送消息,告知他的端口45000(本地端口45005)
  • “B”向“TS”发送消息,给出udp端口(45000)
  • “TS”向“a”发送消息,给出B的udp端口(45000)和IP
  • “A”开始在端口45000上向B的ip发送udp消息,并在本地端口31005上侦听
  • “b”开始在端口31000上向A的ip发送udp消息,并在本地端口45005上侦听

当然,端口31000、31005、45000和45005都在这里,例如,每一个新连接端口都会发生变化,只有9333是静态的。

我知道有很多的来回,比它应该的更多。事实是我必须使用TCP服务器与两个用户通信,udp服务器只是在这里将用户的端口返回给他自己,这样它就可以将其发送回TCP服务器。

但是用户之间的消息不会被任何...谁都知道为什么?

编辑:

我用http://nattest.net.in.tum.de/test.php测试了我的路由器,udp打孔工作正常,所以问题不是来自我的路由器,而是来自我的协议...

当用户在同一NAT后面时,一切正常,当然它使用私有ip,但这意味着代码也在工作,所以每次都导致协议问题...

编辑2:

实际上,我做到了一半(问题其实是来自我的代码,而不是协议...我连接了两个用户,一个在3G中用iPhone连接,一个在WiFi上用NAT连接。

有趣的是,只有一个套接字能够在两个用户之间接收和发送数据。(iphone启动的插座)按照协议我应该有2个连接良好的插座,我错了吗?

当然,我马上测试了两部连接3G的iPhone。没有人能从另一个人那里得到信息。

我是不是错过了蜂窝式NAT的什么东西?

附注。:很抱歉更新了这么多我的问题,但由于我没有得到答案,我想自己去找...

附注。2:自从我在NAT上打了一个洞后,我改了标题,增加了“在3G上”。

编辑3:我再次运行了http://nattest.net.in.tum.de/test.php测试,我的计算机通过iPhone的3G连接连接到了internet。

显然所有的udp打孔测试在第9次测试中都是成功的。

而且似乎:

UDP绑定测试(?):endpoint无关绑定,端口预测很容易

因此,在3G连接上连接两个对等体应该不会有什么麻烦(好吧,比在“家庭”NAT后更麻烦)...我说的对吗?

为了确定,我现在发送一个消息到两个不同的UDP服务器,检查端口和本地端口在3G上是否相同。

长话短说,连接两台服务器时,端口(本地端口和公共端口)是相同的。所以在Edit2上做的测试是正确的,udp是endpoint独立的,所以我想在打孔时应该没有任何问题...(至少与我的ISP)

共有1个答案

燕雨石
2023-03-14

不幸的是,没有100%可靠的方法来使用UDP执行NAT穿孔。充其量,您可以对NAT和防火墙在大多数时候可能会如何表现进行一些猜测。但总会有例外,而且可能并不罕见。

在这种情况下,这听起来像是在使用一个中央服务器,让两个对等方找出彼此的外部端口,然后开始互相发送数据。这是一个相当好的算法。问题是,外部端口路由可能因目的地而异。也就是说,如果A到B有5000的外端口,就不能保证A到C也来自5000。因此让中央服务器记录它看到的端口可能不会帮助连接其他任何人。

下面是一些相关的问题,还有一些更多的细节。

  • UDP穿孔算法
  • 移动提供商无法使用UDP穿孔
  • UDP穿孔主机特定故障
 类似资料:
  • 首先,创建到服务器的UDP连接: 没有任何直接连接(没有ip,没有端口,只是随机端口上的endpoint)。 我使用直接在服务器的ip和端口上发送一些数据包到服务器,并获取有关另一个对等方的信息(远程ip,用于连接到服务器的端口 现在,我试图通过使用服务器连接在对等方的IP:端口上发送简单的UDP数据包(但再次使用直接)来解决问题。我知道第一个数据包总是被丢弃,所以我以100ms的间隔发送它50,

  • 到目前为止还不错,但这里有一个问题:它只适用于特殊情况。 我知道对称NAT(将您的专用IP和端口映射到您想要到达的每个目的地址的特定不同地址的NAT)引起的问题,因此假设我向S1和S2发送一个数据包,S1将看到端口为50263的公共地址,而S2将看到50264)。我还知道,某些非对称NAT要求您先将UDP数据包发送到特定地址,然后才能从同一地址接收数据包。 所以到目前为止我所理解的是,只要您的NA

  • 问题内容: 我试图在Java中实现UDP-Holepunching的简单草图以测试其概念,并稍后在我的C / C ++应用程序中使用它。 从Wikipedia来说,我的理解是:A和B是未定义网络结构背后的客户端,C是著名的公共可访问服务器。 A将数据包发送到服务器C,服务器保存其IP地址和端口。C将获得A的NAT的公共IP地址。这样做,A前面的NAT将创建一条路由,该路由会将此端口上的所有数据包传

  • 我知道这个话题并不新鲜。虽然存在各种信息,但健壮的解决方案并没有出现(至少我没有找到)。我有一个用python3编写的P2P守护进程,pie上的最后一个元素是通过TCP连接NAT后面的两个客户端。我得此主题得参考资料: https://bford.info/pub/net/P2pnat/ 如何使两个客户机在连接了一个汇点服务器后直接连接? TCP穿孔问题 到目前为止我所做的: 服务器: 现在,当前

  • 我目前正在开发一款网络游戏。在游戏中,需要通过TCP和UDP将数据从服务器发送到客户端。实现UDP漏洞穿孔很容易,但我不太确定如何实现TCP漏洞穿孔: null 是3。或者是4。该怎么走?

  • 我正在开发一个Java客户机/服务器应用程序,它涉及通过TCP进行P2P通信。我正在尝试实现TCP穿孔,如下所述:http://www.brynosaurus.com/pub/net/p2pnat/#sec-tcp。这需要同时侦听并尝试使用同一本地TCP端口建立传出连接。显然,如果使用套接字选项,这应该可以工作,我正在通过Java中的方法进行设置。然而,这并不像我预期的那样奏效。下面是一些测试代码