嘿,我正在开发一个在 java 中创建 p2p 网络的项目。我已经为本地局域网使用 UDP 构建了 n/w,并且我正在努力通过互联网发送 UDP 数据报。我遇到了这个称为 UDP 打孔的概念,但似乎找不到任何相关的主题或库。有人可以帮忙吗?
5 回答
以下是一些强烈推荐的 UDP(或 TCP)打孔技术资料:
http://www.usenix.org/events/usenix05/tech/general/full_papers/ford/ford_html/
或者,当然,维基百科:
http://en.wikipedia.org/wiki/UDP_hole_punching
从本质上讲,由于大多数计算机都位于所谓的网络地址转换器 (NAT) 后面,因此您需要使用计算机的公共 IP 和公共端口,因为互联网上有人看到它们。此外,您将需要私有 IP 和私有端口(或者当应用程序本身看到它的套接字时……这是以防万一您位于与您尝试连接的其他应用程序/计算机/节点相同的 NAT 之后)。然后两个节点都尝试通过尝试公共和私有地址来建立连接。当这两个应用程序建立联系时,它们已经成功地穿越了 NAT——它们已经成功地打孔了。
一种流行的方法是让两个客户端都连接到有助于协调两个客户端的服务器。它协调将公共和私有 IP 和端口发送到另一个客户端,然后他们使用它们来执行“打孔”。
此外,显然使用了 UDP 协议,因为它比 TCP 更(经验上)成功。注意:我试图找到这方面的统计数据,但没有成功。
我认为这就是通常所说的 NAT 穿透。也许您会更幸运地使用该标题进行搜索。
您可能正在寻找uPnP的 NAT 穿越工具。许多消费者路由器支持以编程方式打开整个防火墙并为任何类型的应用程序转发端口。或者蠕虫。无论哪种方式。:)
查看关于NAT-to-NAT traversal 的其他问题。Erik 对 UDP 打孔有很好的描述。
您不能通过 inetrnet 进行 UDP 广播/多播。但是,您可以通过 Internet 传递 TCP。
我建议您尝试在您的网络上设置一个网关来侦听您选择的 UDP 数据包,通过 TCP 将数据传递到另一个网络上的另一个网关,该网关可以将此信息转换回 UDP。