10

ここに問題があります、それは非常に簡単です(理解するために..):

自宅に 2 台のコンピューターがあり、どちらも同じパブリック IP アドレス (例: 1.2.3.4) を持っています。

コーヒー ショップ (別のネットワーク) に 1 台のコンピューターがあるため、別のパブリック IP アドレスを持っています。

喫茶店のコンピュータから自宅にあるコンピュータの 1 つにメッセージ (例: 「こんにちは」) を送信したいと考えています。

私はJavaを使用しています。送信者用の次の非常に単純なプログラムを考えてください(単純にするために例外処理を取りました):

主に私は:

sendPacket("hi");

そして、私が持っています

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
}

自宅の両方のコンピューター (両方とも同じパブリック IP アドレス 1.2.3.4) でリスナー (レシーバー) を実行している場合、このメッセージの送信先を指定するにはどうすればよいですか?

4

2 に答える 2

18

両方のホーム コンピューターが同じパブリック 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

ここで、コンピューター A が TCP ポート (主に TCP または UDP のポート) でリッスンしている必要があるとします。パブリック ポートをコンピューター A のポートに直接9000転送できます。90009000

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

コンピューター 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

この方法では、コンピューター B は引き続きポート9000でメッセージを受信しますが、インターネット経由で に送信する必要があります1.2.3.4:9001。ルーターの NAT は、データ パケットがホーム ネットワークに入る (そして出る!) ときにポートを自動的に変換します。

最後に、送信者は、NAT の背後にある別のマシンと「通信」するために宛先ポートを調整する必要があります。

これが理にかなっていることを願っています。

于 2012-04-23T04:46:46.603 に答える
3

通常、これらのNAT ファイアウォールは、元のコンピューターにトラフィックをポート転送します。

そのため、1 つのマシンがポートでコーヒーショップ マシン5000にトラフィックを送信し、もう 1 つのマシンがポートでコーヒーショップ マシンにトラフィックを送信している5001場合、ルーターはどのポートがどのクライアントに向けられているかを追跡します。したがって、ポートからパケットを送り返すと、パケットは最初のマシンに送られ、ポートから5000パケットを送り返すと、2 番目のマシンに送られます。5001

残念なことに、コーヒーショップのマシンもおそらくNAT ファイアウォールの背後にあり、自宅のマシンもそれに直接対処できない可能性があります。

適切なネットワーク上でサーバーをホストできる場合、両方のピアがサーバーに接続し、サーバーを介しすべてのトラフィックをリレーできます。これは悪いオプションではありませんが、うまくスケーリングできません。(3 台のマシンの場合、それは大したことではありません。300 万台のマシンの場合、それは非常に重要です。)

UPnPなどの NAT ファイアウォールを通過する他のオプションを調査することもできますが、これらのメカニズムでは通常、クライアントがセッションを機能させる前に何らかの方法でセッションをネゴシエートする必要があります。

于 2012-04-23T04:26:34.710 に答える