Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式从已知公共服务器进行NAT遍历_Java_Proxy_Ssh_Nat_Tunnel - Fatal编程技术网

Java 以编程方式从已知公共服务器进行NAT遍历

Java 以编程方式从已知公共服务器进行NAT遍历,java,proxy,ssh,nat,tunnel,Java,Proxy,Ssh,Nat,Tunnel,我已经做了一些关于NAT遍历的研究,并从web上获得了一些关于P2P应用的建议。但我的情况与传统的P2P应用有所不同,我已经有了一个公共服务器,我只需要从已知的公共服务器访问NAT背后的设备 关于我的案例的详细信息如下: 1.PC-A have public IP 2.PC-B is behind NAT, does not have public IP. In my case PC-A and PC-B is under full control. 3.PC-C is also behind

我已经做了一些关于NAT遍历的研究,并从web上获得了一些关于P2P应用的建议。但我的情况与传统的P2P应用有所不同,我已经有了一个公共服务器,我只需要从已知的公共服务器访问NAT背后的设备

关于我的案例的详细信息如下:

1.PC-A have public IP
2.PC-B is behind NAT, does not have public IP. In my case PC-A and PC-B is under full control.
3.PC-C is also behind NAT, and could be reached from PC-B
问题是:

  • 有没有办法在公共服务器PC-a和PC-B之间建立一个隧道,这样我就可以通过TCP协议(甚至UDP)从PC-a到达PC-C
  • 值得注意的是,所有这些都应该以编程方式完成,特别是在Java中。有任何库可以做到这一点吗

  • 在P2P对话中,您的PC-A通常被称为“中继”

    基本原则是防火墙后面的所有对等方(在您的情况下是PC-B和PC-C)建立到PC-A的出站连接。PC-A然后“链接/绑定”连接。 通常这些连接是通过HTTP进行的,HTTP是防火墙友好的。因此,对于PC-B与PC-C对话,简化的顺序是:

    • PC-B和PC-C都与PC-A建立HTTP连接
    • PC-B向PC-A发出信号,表示希望向PC-C发送数据
    • PC-B根据出站请求将其数据发送给PC-A
    • PC-A通过同步响应将数据转发给PC-C
    当你加入时,事情变得(非常)复杂

    • 认证
    • 保安
    • 冗余继电器
    • 连接超时、可靠性、恢复等
    大多数P2P框架都实现了某种中继。这是JXTA和XMPP的情况(检查ICE)


    我相信Ian Mc Ginnis也开发了一种叫做HTTP隧道的东西,作为Netty项目的一部分(最初是作为JXTA继电器的替代品,这种继电器有些次优)

    @BGR,很抱歉我错过了我无法控制PC-C的部分,因此PC-C不会建立到PC-A甚至PC-B的HTTP连接。在我的情况下,中继功能应该在PC-B上。@BGR,另一件需要解决的事情是,我想通过通用TCP端口访问PC-C,即我可以从PC-A通过SSH或Telent等连接到PC-C。好的。然后让PC-B充当“反向”中继,并建立到PC-a和PC-C的出站连接。然后让PC-a使用响应通道通过PC-B向PC-C发送数据。我不确定“通用TCP端口”是什么意思。端口和协议是两个不同的问题,尽管22通常用于ssh,80通常用于HTTP等等。。。如果不想处理HTTP请求,可以在PC-a/PC-C上运行SSH客户端/服务器(参见SSH Mina了解Java实现);它不关心两个端点之间使用的协议。通常,您使用HTTP将中继连接到端点,并在HTTP请求/响应中“包装”端点之间使用的协议