2012-04-23 6 views
6

Oto problem, jest bardzo prosty (aby zrozumieć ..):Jak wysłać pakiet UDP do określonego komputera, gdy cały komputer w sieci ma ten sam publiczny adres IP?

Mam 2 komputery w domu, oba mają ten sam publiczny adres IP (np. 1.2.3.4).

Mam 1 komputer w kawiarni (inna sieć), więc ma inny publiczny adres IP.

Chcę wysłać wiadomość (np. "Cześć") z komputera w kawiarni na JEDEN z komputerów, które mam w domu.

Używam Java, pomyśl o następującym bardzo prosty program do nadawcy (Zdjąłem obsługę wyjątków dla uproszczenia):

W głównym zrobić:

sendPacket("hi"); 

i mam

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 
} 

Jeśli mój słuchacz (odbiornik) działa na obu komputerach w domu (oba z tym samym publicznym adresem IP 1.2.3.4), w jaki sposób mogę określić, do którego z nich chcę wysłać tę wiadomość?

+5

Proszę zrozumieć: żaden z dwóch komputerów w twoim domu nie ma tego publicznego adresu IP. Twój domowy router ma ten publiczny adres. Router domowy zapewnia obu komputerom prywatny adres IP. Prawdopodobnie możesz skorzystać z funkcji "przekierowania portów" na routerze, aby Ci pomóc. Zobacz "NAT" na wikipedii, aby dowiedzieć się więcej na ten temat. – Haozhun

Odpowiedz

3

Zazwyczaj te numery NAT firewalls przesyłają z wyprzedzeniem ruch z powrotem do komputera źródłowego.

Tak więc, jeśli masz jeden komputer wysyłający ruch do maszyny coffeeshop na porcie 5000, a drugi wysyłający ruch do automatu coffeeshop na porcie 5001, router będzie śledzić, który port jest przeznaczony dla tego klienta. Tak więc, po wysłaniu pakietów z powrotem z port 5000 trafi on do pierwszego komputera, a kiedy wyślesz pakiety z powrotem z port 5001, przejdzie on do drugiego komputera.

Niefortunne jest to, że urządzenie jest w Coffeeshop prawdopodobnie również za NAT firewall, a twoje maszyny domu może nie być w stanie bezpośrednio zająć go, albo.

Jeśli możesz hostować serwer w dobrej sieci, to oba komputery równorzędne mogą skontaktować się z serwerem i przekazać cały ruch przez to. To nie jest zła opcja, ale nie skaluje się dobrze. (Dla trzech maszyn, to nic wielkiego. Przez trzy miliony maszyn, to wiele spraw.)

można zbadać inne opcje, aby spróbować traverse the NAT firewall takich jak UPnP, ale te mechanizmy wymagają zwykle trochę drogę dla klientów do negocjuj sesje, zanim będą działać.

12

Jeśli zarówno z komputerów domowych mają ten sam publiczny adres IP, co oznacza, że ​​te komputery używają NAT lub Network Address Translation (ściśle mówiąc, to Port Address Translation lub NAT przeciążenia, ale powszechnie określane jako tylko NAT) .

Oznacza to, że w celu zainicjowania połączenia z zewnątrz do dowolnego urządzenia wewnątrz NAT, należy ustawić router Port Forwarding (zazwyczaj modem), aby zmapować określony port adresu IP twojego domowego domu na konkretny prywatny adres IP w twoim domu.

Powiedzmy masz komputery A i B w swoim domu tak:

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

Teraz załóżmy, trzeba Komputer A nasłuchuje na porcie TCP 9000 (porty mogą być głównie TCP lub UDP), można forward portu publicznego 9000 bezpośrednio do portu komputera a za 9000:

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

aby wysłać wiadomość do komputera a, wystarczy wysłać go do 1.2.3.4:9000. Ale co, jeśli drugi komputer słucha również na porcie 9000? Nie można również przypisać portu publicznego 9000 ponieważ jest podejmowana przez Computer A. Można to zrobić:

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

ten sposób komputer B nadal odbiera komunikaty na porcie 9000, ale muszą one być wysyłane przez Internet do 1.2.3.4:9001. NAT twojego routera automatycznie tłumaczy port, gdy pakiety danych wchodzą (i opuszczają!) Twoją sieć domową.

W końcu, nadawca musiałby dostosować port docelowy, aby "rozmawiać" z różnymi maszynami za NATem.

Mam nadzieję, że to ma sens.

+0

Dziękuję, to ma sens! –

Powiązane problemy