10

这就是问题所在,这很简单(理解..):

我家里有两台电脑,它们都有相同的公共 IP 地址(例如 1.2.3.4)。

我在咖啡店有一台电脑(不同的网络),所以它有不同的公共 IP 地址。

我想从咖啡店的计算机向我家中的一台计算机发送一条消息(例如“hi”)。

我正在使用 Java,为发送者考虑以下非常简单的程序(为简单起见,我取消了异常处理):

我主要做:

sendPacket("hi");

我有

void sendPacket(String message){
    DatagramSocket myServerSocket = new DatagramSocket(9000);    // server socket
    byte[] sendData = new byte[message.length()];    // build msg
    sendData = message.getBytes();
    InetSocketAddress destSocketAddr = new InetSocketAddress("1.2.3.4", 9000);    // destination socket addr
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, destSocketAddr);     // make packet 
    myServerSocket.send(sendPacket);    // send packet
}

如果我的侦听器(接收器)在家中的两台计算机上运行(都具有相同的公共 IP 地址 1.2.3.4),我如何指定我打算将此消息发送到哪一台?

4

2 回答 2

18

如果您的两台家庭计算机具有相同的公共 IP 地址,则意味着这些计算机正在使用 NAT 或网络地址转换(严格来说,它是端口地址转换或 NAT 过载,但通常仅称为 NAT)。

这意味着,为了启动从外部到 NAT 内任何机器的连接,必须在路由器(通常是调制解调器)中设置端口转发,以便映射公共家庭 IP 地址的特定端口到您家中的特定私有 IP 地址。

假设您家中有计算机 A 和 B,如下所示:

             Router / Modem
              192.168.0.1 
                  ||
       ++=========++========++
       ||                   ||
  Computer A           Computer B
  192.168.0.2          192.168.0.3

现在,假设您需要计算机 A 监听 TCP 端口9000(端口可以主要是 TCP 或 UDP),您可以将公共端口9000直接转发到计算机 A 的9000端口:

Forward TCP/UDP on public port 9000 to private port 9000 on 192.168.0.2

要将消息发送到计算机 A,只需将其发送到1.2.3.4:9000。但是如果另一台 PC 也只监听端口9000呢?您也不能分配公共端口9000,因为它是由计算机 A 占用的。您可以这样做:

Forward TCP/UDP on public port 9001 to private port 9000 on 192.168.0.3

这样,计算机 B 仍会在端口 接收消息9000,但需要通过 Internet 将它们发送到1.2.3.4:9001。当数据包进入(和离开!)您的家庭网络时,您的路由器的 NAT 会自动转换端口。

最后,发送者需要调整目标端口,以便与 NAT 后面的不同机器“对话”。

希望这是有道理的。

于 2012-04-23T04:46:46.603 回答
3

通常,这些NAT 防火墙会为您将端口转发回原始计算机。

因此,如果您有一台机器在 port 上向咖啡店机器5000发送流量,而另一台在 port 上向咖啡店机器发送流量5001,路由器将跟踪哪个端口用于哪个客户端。因此,当您端口发回数据包时,5000它将转到第一台机器,而当您端口发回数据包时5001,它将转到第二台机器。

不幸的是,您在咖啡店的机器可能也在NAT 防火墙后面,您的家用机器也可能无法直接解决

如果您可以在良好的网络上托管服务器,那么两个对等方都可以联系服务器,并通过中继所有流量。这不是一个糟糕的选择,但它不能很好地扩展。(对于三台机器来说,这没什么大不了的。对于三百万台机器来说,这很重要。)

您可以调查其他选项以尝试穿越 NAT 防火墙,例如UPnP,但这些机制通常需要客户端通过某种方式协商会话才能正常工作。

于 2012-04-23T04:26:34.710 回答