fragen stichworte

Was ist der Unterschied zwischen Bind-, Netzwerk- (Interface) und Multicast-Adressen?

Die DatagramSocketImpl in Java verfügt über eine joinGroup -Methode, die eine Socketadresse (IP und PORT) plus die Schnittstellenadresse (IP und PORT) verwendet. Ich versuche, den Unterschied und Zweck der drei Adressen im Multicast-Stack zu verstehen:

  1. Wozu dient die Bindeadresse? Benötigt es einen Port?
  2. Wozu dient die Schnittstellenadresse? Benötigt es einen Port?
  3. Was ist der Zweck der Multicast-Adresse? Benötigt es einen Port?

Ich bin verwirrt: Ich kenne den Unterschied zwischen der Bindeadresse und der Schnittstellenadresse nicht. Ich bin auch nicht sicher, ob die Multicast-Adresse wirklich einen Port benötigt. Kann ich die IP der Multicast-Adresse als Multicast-Adressgruppe bezeichnen?

antworten

Es gibt tatsächlich drei Methoden, die Sie hier verwechseln. Die erste ist bind, die verwendet wird, um den Socket an eine bestimmte Adresse und einen Port zu binden. Mit dieser Methode öffnen Sie im Prinzip einen UDP-Port und warten auf Daten an diesem Port an dieser Adresse. Die zweite ist die Join-Methode, mit der ein Socket einer bestimmten Multicast-Gruppe beitreten kann. Ein Beispiel für eine Multicast-Gruppe ist 224.0.0.1 - die Multicast-Gruppe "Alle Hosts" - die alle Hosts im selben Netzwerksegment anspricht. Die dritte Methode ist joinGroup, mit der ein Socket einer angegebenen Multicast-Gruppe auf einer angegebenen Netzwerkschnittstelle beitreten kann. Wie Sie sehen können, werden Methode zwei und drei für IP-Multicasting verwendet und Methode eins wird für UDP verwendet (nicht unbedingt in Kombination mit Multicasting). Durch den Beitritt zu einer Multicast-Gruppe kann der Socket Datagramme empfangen, die mit IP-Multicasting gesendet wurden. Beide können natürlich kombiniert werden, zB Daten mit Multicasting empfangen und dann ggf. mit Multicasting (wenn die Daten für alle Hosts in der Gruppe interessant sind) oder direkt mit dem Absender antworten (wenn die Daten nur für den Absender interessant sind) .

  1. Wenn Sie einen Socket über die bind-Methode an eine Adresse binden, handelt es sich auch um einen Port. Nur Datagramme für diese spezifische Adresse/Port-Kombination sind/können empfangen werden, es sei denn, der Socket tritt auch einer Multicast-Gruppe bei.

  2. Ich bin mir nicht sicher, wie Sie von der JoinGroup zur Schnittstellenadresse gekommen sind. Was Sie brauchen, ist eine SocketAddress und ein NetworkInterface. Das NetworkInterface kann entweder durch den Namen der Schnittstelle (NetworkInterface.getByName) oder durch die Adresse (NetworkInterface.getByInetAddress) abgerufen werden. Im Fall von getByInetAddress könnten Sie es wahrscheinlich die Schnittstellenadresse nennen, aber es wird nur das NetworkInterface abgerufen, das die angegebene Adresse hat und daher keine Port-Nummer verwendet.

  3. Multicast-Adressen werden in IP-Multicasting verwendet, das zum Senden von IP-Datagrammen an eine Gruppe von Hosts verwendet wird (wenn diese an dem Empfang der Datagramme interessiert sind). Sie können einen Port verwenden (wenn Sie UDP verwenden), müssen dies aber nicht tun. Die CIDR der IPv4-Multicast-Adressen ist 224.0.0.0/4 (224.0.0.0 - 239.255.255.255) und IPv6-Multicast-Adressen haben das Präfix ff00 ::/8. Jede IP-Adresse in diesen Bereichen repräsentiert eine Multicast-Gruppe. Es gibt verschiedene Blöcke von Multicast-Adressen (und Multicast-Gruppen), die unterschiedlich zu behandeln sind. Beispielsweise dürfen 224.0.0.0/24 nicht aus ihrem ursprünglichen Subnetz geroutet werden, während 239.192.0.0/14 geroutet werden können und global geroutet werden müssen.