当网络上的所有计算机具有相同的公共IP地址时,如何将UDP数据包发送到特定计算机?

Sta*_*Two 7 java udp network-programming ip-address packet

这是问题所在,它非常简单(理解......):

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

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

我想从咖啡馆的电脑发送一条消息(例如"hi")到我家里的一台电脑.

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

在主要我做:

sendPacket("hi");
Run Code Online (Sandbox Code Playgroud)

我有

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
}
Run Code Online (Sandbox Code Playgroud)

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

MrF*_*ion 15

如果两台家用计算机具有相同的公共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
Run Code Online (Sandbox Code Playgroud)

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

Forward TCP/UDP on public port 9000 to private port 9000 on 192.168.0.2
Run Code Online (Sandbox Code Playgroud)

要向计算机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
Run Code Online (Sandbox Code Playgroud)

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

最后,发送方需要调整目标端口,以便与NAT后面的不同计算机"通话".

希望这是有道理的.


sar*_*old 3

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

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

不幸的是,您在咖啡店的机器可能位于 NAT 防火墙后面,并且您的家用机器也可能无法直接寻址

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

您可以研究其他选项来尝试穿越 NAT 防火墙,例如UPnP,但这些机制通常需要某种方式让客户端在工作之前协商会话。