3

问题

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

A , B是 NAT 下的机器,A是服务器B是客户端 S是 STUN 服务器

S正在 Internet 上可访问的机器上运行

流程如下:

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.XX,在端口 4444 上连接到暴露 NNNN:4444 的外部,因此只要端口号空闲,就会保留该端口号,如果不可用,则获取一个新的(随机?)一个。

测试

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

如果在他们收听echoncto握手时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 中打一个洞,丢弃第一个数据包并随后转发。但什么也没发生,没有尽头得到消息。

我也试过:

从本地机器 echo "GREET UNKOWN PEER" | nc -u <PUBLIC IP> 4567 -p 4568

从公共机器 echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4568 -p 4567

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


代码

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

index.js包含 STUN 服务器,tests 文件夹包含测试用例:test.js启动 stun 服务器,PeerClientTest.js并且PeerServerTest.js是客户端和服务器的模型。

运行node tests/test.js以在公共机器上启动服务器(在config.js和中更改 IP tests/config.js

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

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

4

1 回答 1

1

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

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

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

于 2015-08-12T04:44:03.090 回答