2017-07-30 74 views
1

我经历了Programming P2P application SO帖子。但我认为我还不清楚STUN如何在引擎盖下工作。了解眩晕工作

所以,我想发布我的理解并希望能够纠正它们。

具体根据示例

假设机(A)IP是关于(STUN服务器上TCP客户端请求)4900(在4900在TCP上运行TCP客户端请求STUN服务器)和STUN服务器运行192.168.1.2返回的公共NAT设备即128.11.12.138888

现在我希望机器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.对吧?

我正确吗?

这是什么方法或我在这里大声思考? :)

回答

2

事实上,你不能直接连接到端口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服务器的连接,然后在同一端口创建一个侦听套接字。

+0

你能否解释一下,stun-client在接收到一个成功的stun响应后必须关闭与stun服务器的连接的最后一件事(原因是Stun RFC指出一个代理(可以是客户端或者stun服务器)可以随时发送指示消息给定如果我不关闭端口'3000'的stun-client,我将无法在特定端口启动TCP服务器,也就是'3000',因为它,对吧?假设TCP服务器将使用“任何地址” – Viren