问题
我正在尝试开发一个通信系统,其中:
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,没有任何变化。
如果在他们收听echo
与nc
to握手时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 不是必需的,所以如果有其他语言的更好的解决方案,请告诉我们,将不胜感激。