【发布时间】:2015-11-04 01:21:40
【问题描述】:
问题
我正在尝试开发一个通信系统,其中:
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.X.X,端口 4444 连接到外部暴露 N.N.N.N:4444 因此,只要端口号可用,就会保留端口号,如果不可用,则获取一个新的(随机?)。
测试
我运行的测试看到两端(A、B)都托管在同一台机器上,都绑定到机器的内部 IP,尝试绑定到 127.0.0.1、0.0.0.0,没有任何变化。
如果在他们收听握手时我 echo 与 nc 到 localhost 的东西,它被接收并显示(作为无法识别的消息)没有任何问题。通过 NAT 路由的连接并不难,每个数据包都会被丢弃。
还尝试将 A 托管在机器上,B 托管在移动数据下的 Android 手机上,并使用临时编写的简单应用程序。仍然在等待某些东西,比如 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和tests/config.js中的IP)
然后node tests/PeerServerTest.js 启动服务器(“A”)和node tests/PeerClientTest.js 启动客户端(“B”)。双方将通过 STUN 相互识别,然后在发送自己的握手操作码的同时监听对方的握手操作码。这种情况永远不会发生,所以他们只会一直发送/收听。
节点不是必需的,所以如果有其他语言的更好的解决方案,请告诉,将不胜感激。
【问题讨论】:
标签: networking udp nat stun hole-punching