gpt4 book ai didi

networking - 使用 STUN 在 NAT 下为服务器/客户端通信进行 UDP 打洞

转载 作者:行者123 更新时间:2023-12-02 03:23:03 24 4
gpt4 key购买 nike

问题

我正在尝试开发一个通信系统,其中:

A,B是NAT下的机器,A是server B是clientS 是 STUN 服务器

S 正在互联网上可访问的机器上运行

流程如下:

A hits S with an opcode saying he's the server
S registers A as server

B hits S with an opcode saying he's the client
S sends to A B's external infos (IP, PORT)
S sends to B A's external infos (IP, PORT)

A starts sending B an opcode saying he's the server every 500ms
and meanwhile listens for packets saying he's got a client

B starts sending A an opcode saying he's the client every 500ms
and meanwhile listen for packets saying he's got the server


麻烦

这就是麻烦的开始,STUN 服务器完成了它的工作,因为两端都收到了关于对方的正确信息。

但是我从来没有收到另一端的消息,所以两端都在没有收到握手操作码或其他任何东西的情况下继续监听。

NAT 的行为

我确实检查了这个 NAT 的行为,看起来它确实是这样的

A 位于 192.168.X.X,端口 4444连接到外面暴露 N.N.N.N:4444所以端口号会一直保留,只要它是免费的,如果不可用,就会得到一个新的(随机的?)。

测试

我运行的测试看到两端(A,B)托管在同一台机器上,都绑定(bind)到机器的内部 IP,尝试绑定(bind)到 127.0.0.1、0.0.0.0,没有任何变化。

如果当他们正在监听握手时我将 echonc 转换为 localhost ,它会毫无问题地被接收和显示(作为无法识别的消息)。通过 NAT 路由的连接不可靠,每个数据包都被丢弃。

还尝试在机器上托管 A,在移动数据下的 Android 手机上托管 B,并使用一个临时编写的简单应用程序。仍然锁定等待某些东西,比如 nodejs 测试。


更新:我尝试做的另一件事是用 nc 打开一个洞

我在同一 NAT 下的两台不同机器上运行:

echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4567 -p 4568

echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4568 -p 4567

每台机器的时间不同。根据我的理解,这应该在 NAT 中打一个洞,丢弃第一个数据包并转发后续数据包。但是什么也没有发生,没有结束得到消息。

我也试过:

来自本地机器 ojit_代码

来自公共(public)机器 ojit_代码

这个有效,NAT 下的本地机器与公共(public)机器联系,并且在第一个丢弃的数据包能够在分配的端口上接收和发送。我想知道为什么这在同一 NAT 下的两台机器上不起作用(???)


代码

我没有展示任何代码,因为我认为这其中存在某种逻辑缺陷,但这是 github 项目。

echo "GREET UNKOWN PEER" | nc -u <PUBLIC IP> 4567 -p 4568 包含 STUN 服务器,tests 文件夹包含测试用例:echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4568 -p 4567 启动 stun 服务器,index.jstest.js 是客户端和服务器的模型。

运行 PeerClientTest.js 以在公共(public)机器上启动服务器(更改 PeerServerTest.jsnode tests/test.js 中的 IP)

然后 config.js 启动服务器(“A”)和 tests/config.js 启动客户端(“B”)。双方将通过 STUN 相互识别,然后在发送自己的握手操作码的同时监听另一端的握手操作码。这永远不会发生,所以他们只会一直发送/收听。

Node 不是必需的,所以如果有更好的其他语言的解决方案,请告诉,将不胜感激。

最佳答案

B 的 NAT 正在过滤 A 的数据包并且不让它们通过。 NAT 过滤发送给它的未知数据包。您的服务器 A 正在向客户端 B 发送数据包。但是客户端 B 之前从未通过 NAT 向 A 发送数据包。因此对于 B 的 NAT,A 的数据包是未知的并被丢弃。

你需要在 B 的 NAT 上打一个洞,让 NAT 允许传入的数据包。从 B 发送一个数据包到 A NAT 的 IP:Port。之后,当您从 A 向 B 发送数据包时,B 的 NAT 不会丢弃 A 的数据包。

如果 A 和 B 的 NAT 具有类似 Symmetric 和 Symmetric/PRC NAT 的组合,这将不起作用。在这种情况下,您将不得不使用 TURN 中继服务器。

关于networking - 使用 STUN 在 NAT 下为服务器/客户端通信进行 UDP 打洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31948175/

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