2012-04-23 8 views
6

Ecco il problema, è molto semplice (per capire ..):Come inviare un pacchetto UDP a un computer specifico quando tutti i computer della rete hanno lo stesso indirizzo IP pubblico?

Ho due computer a casa, entrambi hanno lo stesso indirizzo IP pubblico (ad esempio 1.2.3.4).

Ho 1 computer in un caffè (rete diversa), quindi ha un indirizzo IP pubblico diverso.

Desidero inviare un messaggio (ad esempio "ciao") dal computer al posto del caffè a UNO dei computer che ho a casa.

sto usando Java, pensare il seguente programma molto semplice per il mittente (ho tolto la gestione delle eccezioni per semplicità):

In main devo fare:

sendPacket("hi"); 

e ho

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 
} 

Se il mio listener (ricevitore) è in esecuzione su entrambi i computer a casa (entrambi con lo stesso indirizzo IP pubblico 1.2.3.4), come posso specificare a quale intendo inviare questo messaggio?

+5

Si prega di comprendere: nessuno dei due computer in casa ha quell'indirizzo ip pubblico. Il tuo router di casa ha quell'indirizzo pubblico. E il tuo router di casa fornisce ai tuoi computer un indirizzo IP privato. Probabilmente puoi usare la funzione "port forwarding" sul tuo router per aiutarti. Vedi "NAT" su wikipedia per maggiori informazioni di base su questo. – Haozhun

risposta

3

In genere, questi NAT firewalls eseguiranno il port-forward del traffico verso il computer di origine.

Quindi, se si avesse una macchina che inviava traffico alla macchina per caffè sulla porta 5000 e l'altra che inviava traffico alla macchina coffeeshop sulla porta 5001, il router teneva traccia di quale porta è destinata a quale client. Pertanto, quando si inviano i pacchetti dalla porta5000, si passa alla prima macchina e quando si inviano pacchetti dalla porta5001, si passa alla seconda macchina.

La parte spiacevole è che la vostra macchina al coffeeshop è probabilmente anche dietro un firewall NAT, e le macchine a casa non può essere in grado di affrontare direttamente si, neanche.

Se è possibile ospitare un server su una buona rete, entrambi i peer possono contattare il server e inoltrare tutto il traffico tramite e. Questa non è una cattiva opzione, ma non si adatta bene. (Per tre macchine, non è un grosso problema. Per tre milioni di macchine, che conta molto.)

È possibile esaminare altre opzioni per cercare di traverse the NAT firewall quali UPnP, ma quei meccanismi di solito richiedono qualche modo per i clienti di negoziare le sessioni prima che funzionino.

12

Se entrambi computer di casa hanno lo stesso indirizzo IP pubblico, questo significa che i computer stanno utilizzando NAT o Network Address Translation (in senso stretto, è Port Address Translation o NAT sovraccarico, ma comunemente indicato come solo NAT) .

Ciò significa che, al fine di avviare una connessione dall'esterno per una macchina qualsiasi all'interno di NAT, un Port Forwarding deve essere impostato nel router (in genere il modem), in modo da mappare una porta specifica del tuo indirizzo IP della tua casa pubblica a uno specifico indirizzo IP privato all'interno della tua casa.

Diciamo che dispone di computer A e B nella vostra casa in questo modo:

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

Ora, supponiamo che avete bisogno di Computer A in ascolto sulla porta TCP 9000 (le porte possono essere principalmente TCP o UDP), si potrebbe porta pubblica avanti 9000 direttamente alla porta del computer a 9000:

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

per inviare un messaggio a computer a, basta inviare a 1.2.3.4:9000. Ma cosa succede se l'altro PC ascolta solo sulla porta 9000? Non è inoltre possibile assegnare porto pubblico 9000 perché viene presa dal computer A. Si potrebbe fare questo:

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

In questo modo, il computer B riceve ancora messaggi sulla porta 9000, ma avrebbe bisogno di essere inviati attraverso Internet per 1.2.3.4:9001. Il NAT del tuo router traduce automaticamente la porta mentre i pacchetti di dati entrano (e lasciano!) La tua rete domestica.

Alla fine, il mittente dovrebbe regolare la porta di destinazione in modo da "parlare" con macchine diverse dietro NAT.

Spero che questo abbia senso.

+0

Grazie, questo ha senso! –