UDP网络打孔
对于我的学术项目,我正在努力实现这一目标。 一个web服务器节点JS应用程序监听端口3000.所以,如果你curl http://localhost:3000
你会得到Hello World!
。 (一个简单的网页。
现在我在本地机器上运行在webserver上方。 而我的调制解调器在NAT后面。 假设如果我在调制解调器中将端口转发到myip:3000
那么它对世界开放。 但是这里是我卡住的最大的东西 - 我不想使用调制解调器进行端口转发,相反,我将使用第三方服务器进行UDP Punch Hole。
现在我的要求是来自net的任何人都应该能够通过curl http://third-party-server-ip:3000
访问我的web curl http://third-party-server-ip:3000
。
我正在尝试编写另一个客户端 - 它打开与第三方服务器的连接。 说它在41234
港口41234
了一个洞。 该端口是开放的。 第三方主机可以发送一些东西到那个端口。
现在,互联网上的任何人都可以向第三方主机发起此命令curl http://third-party-ip:3000
。 所以第三方返回myip:udpPunchHolePort即myip:41234
。
任何人都会再次蜷缩到myip:41234
它将被节点js UDP punch app收到,所以它会重定向到localhost:3000
。 最后, anyone
将收到localhost:3000
的响应。
我的两个问题 -
注意 - 在这个学术项目中,我们正试图学习如何让任何本地应用程序在调制解调器中无需端口转发的情况下向世界开放。
我们阅读了Skype协议分析,这也是我们的灵感。
不,那不行。
HTTP运行在TCP上,而不是UDP。 打孔UDP洞不会有什么好处 - 与后端HTTP服务器的任何TCP连接仍然会失败。
HTTP重定向并不神奇。 如果用户无法访问特定的主机:端口,将它们重定向到该主机:端口上的URL只会在请求该URL时使其浏览器超时。
您不能从浏览器请求的不同主机:端口发送响应,因为没有与该端点建立TCP连接。
下一篇: How to control which Screen a Window is shown in from QML