【发布时间】:2011-02-23 09:02:50
【问题描述】:
嘿,我正在做一个用 java 创建 p2p 网络的项目。 我已经为本地局域网使用 UDP 构建了 n/w,我正在研究 通过 Internet 发送 UDP 数据报。我遇到了这个称为 UDP 打孔的概念,但似乎找不到任何相关的主题或库。 有人可以帮忙吗?
【问题讨论】:
标签: java udp p2p nat-traversal
嘿,我正在做一个用 java 创建 p2p 网络的项目。 我已经为本地局域网使用 UDP 构建了 n/w,我正在研究 通过 Internet 发送 UDP 数据报。我遇到了这个称为 UDP 打孔的概念,但似乎找不到任何相关的主题或库。 有人可以帮忙吗?
【问题讨论】:
标签: java udp p2p nat-traversal
我认为这就是通常所说的NAT punch-through。也许你会更幸运地使用这个标题进行搜索。
【讨论】:
这里有一些强烈推荐的 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 更(经验上)成功。注意:我试图找到这方面的统计数据,但没有成功。
【讨论】:
您不能通过 inetrnet 进行 UDP 广播/多播。但是,您可以通过 Internet 传递 TCP。
我建议您尝试在您的网络上设置一个网关来侦听您选择的 UDP 数据包,通过 TCP 将数据传递到另一个网络上的另一个网关,该网关可以将此信息转换回 UDP。
【讨论】:
您可能正在寻找uPnP 的NAT 穿越工具。许多消费者路由器支持以编程方式打开整个防火墙并为任何类型的应用程序转发端口。或者蠕虫。无论哪种方式。 :)
【讨论】:
在NAT-to-NAT traversal 上查看其他问题。 Erik 对 UDP 打孔有很好的描述。
【讨论】: