2012-04-23 38 views
6

Đây là vấn đề, rất đơn giản (để hiểu ..):Cách gửi gói UDP tới một máy tính cụ thể khi tất cả máy tính trên mạng có cùng địa chỉ IP công cộng?

Tôi có 2 máy tính ở nhà, cả hai đều có cùng địa chỉ IP công cộng (ví dụ: 1.2.3.4).

Tôi có 1 máy tính tại một nơi cà phê (mạng khác nhau) để nó có một địa chỉ IP công cộng khác.

Tôi muốn gửi thư (ví dụ: "hi") từ máy tính tại quán cà phê đến MỘT trong số các máy tính tôi có ở nhà.

Tôi đang sử dụng Java, suy nghĩ của chương trình rất đơn giản sau đây cho người gửi (tôi cất cánh xử lý ngoại lệ vì đơn giản):

Trong chính tôi làm:

sendPacket("hi"); 

và tôi có

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 
} 

Nếu tôi có người nghe (người nhận) đang chạy trên cả hai máy tính ở nhà (cả với cùng địa chỉ IP công cộng 1.2.3.4) làm cách nào tôi có thể chỉ định thư nào tôi định gửi thư này?

+5

Hãy hiểu: không có máy tính nào trong số hai máy tính trong nhà của bạn có địa chỉ IP công khai đó. Bộ định tuyến của bạn có địa chỉ công cộng đó. Và bộ định tuyến của bạn cung cấp cả hai máy tính của bạn một địa chỉ IP riêng. Bạn có thể sử dụng tính năng "chuyển tiếp cổng" trên bộ định tuyến để giúp bạn. Xem "NAT" trên wikipedia để biết thêm thông tin cơ bản về điều này. – Haozhun

Trả lời

3

Thông thường, các NAT firewalls này sẽ chuyển tiếp lưu lượng truy cập ngược trở lại máy tính gốc cho bạn. Vì vậy, nếu bạn có một máy gửi lưu lượng truy cập đến máy coffeeshop của bạn trên cổng 5000 và máy kia gửi lưu lượng truy cập đến máy coffeeshop trên cổng 5001, bộ định tuyến sẽ theo dõi cổng nào dành cho máy khách nào. Do đó, khi bạn gửi các gói trở lại từ cổng 5000 nó sẽ chuyển đến máy đầu tiên và khi bạn gửi gói trở lại từ cổng 5001, nó sẽ chuyển đến máy thứ hai.

Phần đáng tiếc là máy tính của bạn tại coffeeshop có lẽ cũng đằng sau một bức tường lửa NAT và máy nhà của bạn có thể không thể trực tiếp giải quyết , một trong hai.

Nếu bạn có thể lưu trữ máy chủ trên mạng tốt, thì cả hai đồng nghiệp có thể liên hệ với máy chủ và chuyển tiếp tất cả lưu lượng truy cập qua . Đó không phải là một lựa chọn tồi nhưng nó không mở rộng tốt. (Đối với ba máy, nó không có gì to tát. Trong ba triệu máy, nó quan trọng hơn rất nhiều.)

Bạn có thể điều tra tùy chọn khác để cố gắng traverse the NAT firewall như UPnP, nhưng những cơ chế thường yêu cầu một số đường cho khách hàng thương lượng các phiên trước khi chúng hoạt động.

12

Nếu cả hai máy tính gia đình của bạn có địa chỉ IP công cộng cùng, có nghĩa là những máy tính đang sử dụng NAT hoặc Network Address Translation (nói đúng, đó là Cảng Address Translation hoặc NAT Overload, nhưng thường được gọi là chỉ NAT) .Điều này có nghĩa là để bắt đầu kết nối từ bên ngoài đến bất kỳ máy nào của bạn bên trong NAT, cần phải đặt Chuyển tiếp cổng trong bộ định tuyến (thường là modem của bạn) để bạn ánh xạ một cổng cụ thể địa chỉ IP nhà riêng của bạn tới một địa chỉ IP riêng trong nhà của bạn.

Hãy nói rằng bạn có máy tính A và B trong nhà của bạn như thế này:

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

Bây giờ, chúng ta hãy giả sử bạn cần máy tính A lắng nghe trên cổng TCP 9000 (cổng chủ yếu có thể TCP hoặc UDP), bạn có thể phía trước cổng công 9000 trực tiếp đến cổng 9000 máy tính A của:

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

để gửi một thông điệp tới máy tính A, chỉ cần gửi nó đến 1.2.3.4:9000. Nhưng nếu máy tính khác chỉ nghe trên cổng 9000 thì sao? Bạn có thể không còn gán cổng công 9000 bởi vì nó được thực hiện bởi máy tính A. Bạn có thể làm điều này:

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

Bằng cách này, máy tính B vẫn nhận được tin nhắn trong cổng 9000, nhưng họ sẽ cần phải được gửi qua Internet để 1.2.3.4:9001. NAT của router của bạn sẽ tự động dịch cổng khi các gói dữ liệu nhập (và rời khỏi!) Mạng gia đình của bạn.

Cuối cùng, người gửi sẽ cần phải điều chỉnh cổng đích để 'nói chuyện' với các máy khác nhau sau NAT.

Hy vọng điều này có ý nghĩa.

+0

Cảm ơn bạn, điều này có ý nghĩa! –

Các vấn đề liên quan