我正在编写一个分布式 Java 应用程序,但是网络方面的事情让我很困惑。由于某种原因,它无法正常工作。我认为这是因为我通过 ipconfig/all 获得的 IP 地址无法从 LAN 外部访问。我感谢任何提示或建议。

最佳答案

概述

您需要众所周知的 "NAT Traversal"ICE 。目前互联网上使用的主要协议(protocol)有 TCP 和 UDP 两种。 TCP 套接字在其中携带大量 session 状态信息;因此,它是一个比 UDP 更难用于 P2P 的协议(protocol)。

UDP隧道

以下列表是更通用的 STUN Protocol (RFC 5389) 的简化大纲,您可以使用它来实现基于 UDP NAT Traversal 的 P2P 服务...

  • 使用公共(public)地址部署 UDP 服务器并开始监听来自客户端的 UDP 数据包。客户端会将他们的私有(private) IP 地址嵌入发送到您服务器的 UDP 数据包中;实现某种形式的身份验证以确保您从有效客户端(而不是某些随机数据包扫描程序)获得连接是一个好主意。
  • 服务器读取他们的私有(private) IP 地址是如何从 UDP 数据报转换为公共(public) IP 地址的。
  • 如果您想在特定用户之间建立连接,也可以将此信息嵌入从客户端发送到您的服务器的数据包中;您的服务器将实现一个用户名目录,以将客户端 UDP 套接字信息与用户名(对等方将尝试连接到)相关联。
  • 您的 UDP 服务器应将相应信息发送回其他相关对等方。
  • 现在,peers 可以通过向这些转换后的地址发送 UDP 数据报来直接通信;只要允许有问题的 UDP 端口,并且此协议(protocol)引入的延迟不会触发 NAT 设备中的状态超时,这些数据包就会通过路径中的客户端 NAT 设备。

  • 建立 UDP 连接后,您可以使用 OpenVPN 之类的东西在两个客户端之间形成 UDP SSL VPN;这将为您提供一个简单的 channel 来启动客户端之间的 TCP 连接。但是,在此连接模型中需要考虑重要的安全和信任问题;它不太可能在互联网上的随机用户之间有用。

    TCP

    如果需要 TCP 连接,我建议查看这个互联网草案,MMUSIC-ICE-TCP:TCP Candidates with Interactive Connectivity Establishment (ICE)

    关于java - 我如何在我的 LAN 上找到另一台不可公开访问的计算机的正确 IP 地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6555570/

    10-15 23:41