了解眩晕工作
我经历了Programming P2P application SO帖子。但我认为我还不清楚STUN如何在引擎盖下工作。了解眩晕工作
所以,我想发布我的理解并希望能够纠正它们。
具体根据示例
假设机(A)IP是关于(STUN服务器上TCP客户端请求)4900
(在4900
在TCP上运行TCP客户端请求STUN服务器)和STUN服务器运行192.168.1.2
返回的公共NAT设备即128.11.12.13
8888
现在我希望机器B的IP(假设现在B知道公共IP 128.11.12.13
)连接到机器A通过端口3000
(TCP)
什么在这之后发生的事情 -
乙试图将一个带有IP上128.11.12.13
问题1连接:但哪个端口? (它不能直接连接到端口3000)
我想这个答案将我端口转发4900
请求3000
。
但这里的事情
问题-2:怎么样连接到STUN对4900服务器的TCP客户端(发送指示等)。如果应用端口转发,则所有来自Stun服务器的流量都将被重定向到端口3000.对吧?
我正确吗?
这是什么方法或我在这里大声思考? :)
事实上,你不能直接连接到端口3000。你必须连接到是在NAT开启的端口,这是地址:那就是在STUN响应
client A NAT STUN server client B
|---- STUN request --->| | |
| src:192.168.1.2:3000 | | |
| |---- STUN request ---->| |
| | src:128.11.12.13:8888 | |
| | | |
| |<----STUN response-----| |
| | ext:128.11.12.13:8888 | |
|<----STUN response----| | |
| ext:128.11.12.13:8888| | |
| |
|======= APP protocol over rendezvous server =====================>|
| my address is 128.11.12.13:8888 |
| |
|<======= APP protocol over rendezvous server =====================|
| my address is 1.2.3.4:9999 |
| |
|-- direct protocol -->| |
| src:192.168.1.2:3000 | |
| dst:1.2.3.4:9999 |<--------- direct protocol ----------------|
| | dst:128.11.12.13:8888 |
|<-- direct protocol --| |
| dst:192.168.1.2:3000 | |
| | |
STUN只提供了客户端,或许在打开的外部IP地址和端口接收端口NAT设备。客户端B必须尝试连接到此IP和端口(128.11.12.13:8888),并且客户端A必须在STUN请求的源地址:端口中使用的相同IP:端口(192.168.1.2:3000)处侦听。
如果你很幸运,那么上面的场景效果很好。但是你可能会走运,因为有很多NAT类型,特别是对TCP来说可能会发生错误。
EDIT(回答另一个问题在注释):
这是更好地保持到STUN服务器打开的连接。当NAT设备检测到连接关闭时可能会关闭针孔。但是,据我所知,这取决于NAT设备的内部处理,这是不规范的。
客户端A的直接协议的监听套接字必须有SO_REUSEADDR
选项集。如果该选项已设置,则可以建立与STUN服务器的连接,然后在同一端口创建一个侦听套接字。
你能否解释一下,stun-client在接收到一个成功的stun响应后必须关闭与stun服务器的连接的最后一件事(原因是Stun RFC指出一个代理(可以是客户端或者stun服务器)可以随时发送指示消息给定如果我不关闭端口'3000'的stun-client,我将无法在特定端口启动TCP服务器,也就是'3000',因为它,对吧?假设TCP服务器将使用“任何地址” – Viren