java - 我如何在我的 LAN 上找到另一台不可公开访问的计算机的正确 IP 地址?

标签 java networking tcp p2p nat-traversal

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

最佳答案

概览

您需要通常称为 "NAT Traversal" 的东西, 或 ICE .当今互联网上使用两种主要协议(protocol) TCP 和 UDP。 TCP 套接字在其中携带大量 session 状态信息;因此,它是一种比 UDP 更难用于 P2P 的协议(protocol)。

UDP隧道

以下列表是更一般的 STUN Protocol (RFC 5389) 的简化概要您可以使用它来实现基于 UDP NAT 遍历的 P2P 服务...

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

相关文章:

java - Apache Beam - BigQuery - Google Pub/Sub Batch

python - Python中的多个ping脚本

java - 在正确的位置绘制多边形

java - 我在 .jar 中有 xxx.class 但是当我启动 tomcat 时它告诉我 java.lang.ClassNotFoundException

java - 这里Spring boot内部是如何处理http请求的呢?

mysql - 只是无法远程连接到 MySQL EC2 ubuntu 实例

networking - 测试 Openflow/SDN Controller 应用程序

debugging - 如何在 Firefox 中调试 TCP 级别的 Web 连接?

android - 跨子网查找和通信

linux - 为什么 GPRS 调制解调器提供嵌入式 TCP/IP 堆栈