我正在编写一个分布式 Java 应用程序,但网络方面的事情让我很困惑。由于某种原因,它无法正常工作。我认为这是因为我通过 ipconfig /all 获得的 IP 地址无法从 LAN 外部访问。我感谢任何提示或建议。
2 回答
概述
您需要通常称为“NAT Traversal”或ICE的东西。目前互联网上使用的主要协议有两种,TCP 和 UDP。TCP 套接字在其中携带大量会话状态信息;因此,P2P 协议比 UDP 更难用于 P2P。
UDP隧道
以下列表是更通用的STUN 协议 (RFC 5389)的简化大纲,您可以使用它来实现基于 UDP NAT 遍历的 P2P 服务...
- 部署具有公共地址的 UDP 服务器并开始侦听来自客户端的 UDP 数据包。客户端会将其私有 IP 地址嵌入发送到您的服务器的 UDP 数据包中;实施某种形式的身份验证以确保您从有效的客户端(而不是一些随机数据包扫描器)获取连接是个好主意。
- 服务器从 UDP 数据报中读取他们的私有 IP 地址是如何转换为公共 IP 地址的。
- 如果您想在特定用户之间建立连接,也可以将此信息嵌入从客户端发送到服务器的数据包中;您的服务器将实现一个用户名目录以将客户端 UDP 套接字信息与用户名相关联(对等方将尝试连接到该用户名)。
- 您的 UDP 服务器应将相应的信息发送回其他相关对等方。
- 现在,对等点可以通过向这些转换后的地址发送 UDP 数据报直接进行通信;这些数据包将通过路径中的客户端 NAT 设备,只要允许相关的 UDP 端口并且此协议引入的延迟不会触发 NAT 设备中的状态超时。
建立 UDP 连接后,您可以使用 OpenVPN 之类的东西在两个客户端之间形成 UDP SSL VPN;这将为您提供一个简单的通道来启动客户端之间的 TCP 连接。但是,在此连接模型中需要考虑一些重要的安全和信任问题;在互联网上的随机用户之间不太可能有用。
TCP
如果需要 TCP 连接,我建议查看这个互联网草案,MMUSIC-ICE-TCP: TCP Candidates with Interactive Connectivity Establishment (ICE)
某些 IP 地址不可路由:http ://en.wikipedia.org/wiki/IP_address - 如果您有其中之一,您将无法直接从局域网外部访问它。您可以从该局域网上的一个访问局域网上的其他地址。
如果您在局域网之外,则无法启动与局域网上特定机器的 tcp 连接,但该机器可以与您一起启动:http ://en.wikipedia.org/wiki/Network_address_translator