gpt4 book ai didi

UDP 打洞在 3G 上未通过

转载 作者:行者123 更新时间:2023-12-03 08:41:55 25 4
gpt4 key购买 nike

我正在尝试在软件中实现打洞功能。
问题是,我正在使用一个已经制作好的 TCP 服务器来与用户通信。

这是我到目前为止所拥有的:

  • “A”向 UDP 服务器“US”发送消息(在端口 9333 上)
  • “US”将它连接到的端口发送回“A”(端口 31000 - 本地端口 31005)
  • “A”向 TCP 服务器“TS”发送一条消息,说他想连接到 B(并提供端口 31000)
  • “TS”向“B”发送一条消息,给他“A”的端口(31000)和ip
  • “B”向“US”发送消息(在端口 9333 上)
  • “US”向“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 打洞工作正常,所以问题不是来自我的路由器,而是来自我的协议(protocol)......

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

    编辑 2:

    实际上,我做了一半(问题实际上来自我的代码,而不是协议(protocol)......我已经连接了 2 个用户,一个在 3G 中使用 iPhone,一个在 Wifi 上的 NAT 后面。

    有趣(当然不是那么多)的事情是,只有一个套接字能够在两个用户之间接收和发送数据。 (由 iphone 发起的套接字)根据协议(protocol)我应该有 2 个连接良好的套接字,我错了吗?

    所以我设法在我的 NAT 上打了一个洞,但实际上没有在蜂窝 NAT 上打洞。

    当然,我马上测试了 2 部 3G 连接的 iphone。没有人得到对方的信息。

    我是否错过了有关蜂窝 NAT 的某些内容?

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

    附言2:由于我设法在我的 NAT 上打了一个洞,我更改了标题,添加了“on 3G”

    编辑 3 : 我跑了 http://nattest.net.in.tum.de/test.php再次测试通过我的 iphone 的 3G 连接连接到互联网的计算机。

    结果如下:
    UDP HOLE PUNCHING RESULT

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

    似乎更进一步:

    UDP绑定(bind)测试(?):端点独立绑定(bind),端口预测很容易

    因此,通过 3G 连接连接 2 个对等点应该不会有任何问题(远不及“家庭”NAT 后面)……我说的对吗?

    编辑 4:

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

    长话短说,在两台服务器上连接时,端口(本地和公共(public))是相同的。所以在 EDIT 2 上完成的测试是正确的,udp 是端点独立的,所以我猜打洞应该没有任何问题......(至少对于我的 ISP)

    最佳答案

    不幸的是,没有 100% 可靠的方法来使用 UDP 执行 NAT 打洞。充其量,您可以猜测大部分时间 NAT 和防火墙的行为方式。但总会有异常(exception),而且可能并不罕见。

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

    以下是一些相关问题以及更多详细信息。

  • UDP Hole Punching Algorithm
  • UDP Hole Punching not possible with mobile provider
  • UDP hole punching host-specific failure
  • 关于UDP 打洞在 3G 上未通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12359502/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com