2012-04-23 21 views
6

Aquí está el problema, es muy simple (para comprender ...):¿Cómo enviar un paquete UDP a una computadora específica cuando toda la computadora en la red tiene la misma dirección IP pública?

Tengo 2 computadoras en casa, ambas tienen la misma dirección IP pública (por ejemplo, 1.2.3.4).

Tengo 1 computadora en una cafetería (red diferente) por lo que tiene una dirección IP pública diferente.

Deseo enviar un mensaje (por ejemplo, "hola") de la computadora en el lugar de café a UNA de las computadoras que tengo en casa.

estoy usando Java, pensamos en el siguiente programa muy simple para el remitente (que se quitó el manejo de excepciones para simplificar):

En principal que hacer:

sendPacket("hi"); 

y tengo

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 
} 

Si tengo mi oyente (receptor) ejecutándose en las dos computadoras en mi hogar (ambas con la misma dirección IP pública 1.2.3.4) ¿cómo puedo especificar a cuál me propongo enviar este mensaje?

+5

Por favor, comprenda: ninguna de las dos computadoras en su hogar tiene esa dirección IP pública. Su enrutador doméstico tiene esa dirección pública. Y el enrutador de su hogar proporciona a sus computadoras una dirección IP privada. Probablemente pueda usar la función de "reenvío de puertos" en su enrutador para ayudarlo. Consulte "NAT" en la wikipedia para obtener más información acerca de esto. – Haozhun

Respuesta

3

Normalmente, estos NAT firewalls transportarán el tráfico hacia adelante a la computadora original.

Por lo tanto, si tiene que enviar tráfico a su máquina de cafetería en el puerto 5000 y el otro envío de tráfico a la máquina de cafetería en el puerto 5001 una máquina, el router sería realizar un seguimiento de qué puerto está destinado a qué cliente. Por lo tanto, cuando envíe paquetes desde puerto 5000 irá a la primera máquina y cuando envíe paquetes desde puerto , irá a la segunda máquina.

La parte desafortunada es que su máquina en la cafetería es, probablemente, también detrás de un firewall NAT, y sus máquinas de casa puede no ser capaz de abordar directamente que, tampoco.

Si puede alojar un servidor en una buena red, ambos pueden contactar al servidor y retransmitir todo el tráfico a través del . Esa no es una mala opción, pero no escala bien. (Por tres máquinas, que no es gran cosa. Por tres millones de máquinas, importa mucho.)

Puede investigar otras opciones para tratar de traverse the NAT firewall como UPnP, pero los mecanismos por lo general requieren algunos manera para que los clientes negociar sesiones antes de que funcionen

12

Si ambos equipos domésticos tienen la misma dirección IP pública, eso significa que esas computadoras están utilizando NAT o Network Address Translation (estrictamente hablando, es Puerto de traducción de direcciones de o NAT sobrecarga, pero comúnmente se denomina simplemente NAT) .

Lo que esto significa es que con el fin de iniciar una conexión desde el exterior a cualquiera de sus máquinas dentro de NAT, un Port Forwarding se debe establecer en su router (normalmente el módem), de modo que asigne un puerto específico de la dirección IP de su hogar público a una dirección IP privada específica dentro de su hogar.

Digamos que tiene equipos A y B en su casa como esta:

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

Ahora, vamos a suponer que necesita el equipo A que escucha en el puerto TCP 9000 (puertos pueden ser principalmente TCP o UDP), usted podría puerto público hacia adelante 9000 directamente al puerto del ordenador un 9000:

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

para enviar un mensaje a un ordenador, simplemente enviarlo a 1.2.3.4:9000. ¿Pero qué pasa si la otra PC solo escucha en el puerto 9000 también? No se puede también asignar puerto público 9000 porque está tomada por ordenador A. Se podría hacer esto:

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

De esta manera, el equipo B sigue recibiendo mensajes en el puerto 9000, pero tendría que ser enviados a través de Internet a 1.2.3.4:9001. La NAT de su enrutador traduce automáticamente el puerto a medida que los paquetes de datos ingresan (¡y se van!) A su red doméstica.

Al final, el remitente tendría que ajustar el puerto de destino para 'hablar' a diferentes máquinas detrás de NAT.

Espero que esto tenga sentido.

+0

¡Gracias, esto tiene sentido! –

Cuestiones relacionadas