web-dev-qa-db-ja.com

バインド、ネットワーク(インターフェース)、マルチキャストアドレスの違いは何ですか?

JavaのDatagramSocketImplには、ソケットアドレス(IPとPORT)とインターフェイスアドレス(IPとPORT)を受け取るjoinGroupメソッドがあります。マルチキャストスタック内のこれら3つのアドレスのそれぞれの違いと目的を理解するには:

  1. バインドアドレスの目的は何ですか?ポートが必要ですか?
  2. インターフェイスアドレスの目的は何ですか?ポートが必要ですか?
  3. マルチキャストアドレスの目的は何ですか?ポートが必要ですか?

混乱しています。バインドアドレスとインターフェイスアドレスの違いがわかりません。また、マルチキャストアドレスに本当にポートが必要かどうかもわかりません。マルチキャストアドレスのIPをマルチキャストアドレスグループと呼ぶことはできますか?

3
chrisapotek

ここで実際に組み合わせる方法は3つあります。 1つ目は、ソケットを指定されたアドレスとポートにバインドするために使用されるバインドです。この方法を使用すると、基本的にudpポートを開き、そのアドレスのこのポートへのデータを待ちます。 2つ目は、ソケットを指定されたマルチキャストグループに参加させるために使用されるjoin-methodです。マルチキャストグループの例は224.0.0.1(「すべてのホスト」マルチキャストグループ)で、同じネットワークセグメント上のすべてのホストをアドレス指定します。 3番目のメソッドはjoinGroupで、ソケットが指定されたネットワークインターフェイス上の指定されたマルチキャストグループに参加できるようにします。ご覧のとおり、方法2と3はIPマルチキャストに使用され、方法1はUDPに使用されます(必ずしもマルチキャストと組み合わせて使用​​する必要はありません)。マルチキャストグループに参加することにより、ソケットはIPマルチキャストを使用して送信されたデータグラムを受信できます。もちろん、両方を組み合わせることができます。たとえば、マルチキャストを使用してデータを受信し、必要に応じて、マルチキャストを使用して(データがグループ内のすべてのホストにとって興味深い場合)、または送信者に直接応答します(データが送信者にとってのみ興味深い場合)。 。

  1. Bindメソッドを使用してソケットをアドレスにバインドする場合、これにはポートも含まれます。ソケットもマルチキャストグループに参加しない限り、その特定のアドレス/ポートの組み合わせのデータグラムのみを受信できます。

  2. JoinGroupからインターフェイスアドレスにどのように取得したのかわかりません。必要なのはSocketAddressとNetworkInterfaceです。 NetworkInterfaceは、インターフェイス名(NetworkInterface.getByName)またはアドレス(NetworkInterface.getByInetAddress)のいずれかで取得できます。 getByInetAddressの場合、おそらくそれをインターフェイスアドレスと呼ぶことができますが、それは、指定されたアドレスを持ち、したがってポート番号を使用しないNetworkInterfaceを取得することだけです。

  3. マルチキャストアドレスは、IPデータグラムをホストのグループに送信するために使用されるIPマルチキャストで使用されます(データグラムの受信に関心がある場合)。ポートを使用できますが(UDPを使用している場合)、その必要はありません。 IPv4マルチキャストアドレスのCIDRは224.0.0.0/4(224.0.0.0-239.255.255.255)であり、IPv6マルチキャストアドレスのプレフィックスはff00 ::/8です。これらの範囲の各IPアドレスは、マルチキャストグループを表します。異なる方法で処理されるマルチキャストアドレス(およびマルチキャストグループ)の異なるブロックがあります。たとえば、224.0.0.0/24は元のサブネットからルーティングされませんが、239.192.0.0/14はルーティングでき、グローバルにルーティングされる場合はカプセル化する必要があります。

3
lsmooth