Multicast und Broadcast

Werbung
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
TCP/IP Socket‐Programmierung in C# (Ci‐sharp)‐ Multicast und Broadcast AUFGABE:  Schreiben Sie das Beispiel in JAVA um Multicast und Broadcast Bei allen TCP‐Verbindungen handelt es sich um bidirektionale, byte‐orientierte, zuverlässige Datenströme zwischen exakt zwei
Endpunkten, in der Regel zwischen einem Server und einem Clienten. Diese Art der Kommunikation wird Unicast genannt. Manchmal müssen Informationen an mehr als einen Empfänger gleichzeitig versendet werden. In derartigen Fällen müsste man bei Unicast explizit eine Kopie der Daten an jeden Empfänger senden. Diese Methode ist bei großen Datenmengen und vielen Empfängern allerdings ineffizient. Unicast verschwendet innerhalb des Netzwerks unnötig Bandbreite, weil multiple Kopien mehrfach versendet werden. Tatsächlich wird die maximale Datenrate und somit die Zahl der Empfänger von unserer Bandbreite bei der Internetverbindung begrenzt. Wenn beispielsweise ein Videoserver 1 Mbps Streams versendet und die zur Verfügung stehende Bandbreite nur 3 Mbps groß ist, können allerhöchstens 3 Benutzer simultan bedient werden. Glücklicherweise stellt das Internet Protokoll in Version 4 und 6 Mechanismen bereit, die Bandbreite effektiver zu nutzen. Statt den Sender für die Duplizierung der Datenpakete verantwortlich zu machen, kann diese Aufgabe an das Netzwerk delegiert werden. Handelt es sich um paketorientierte Datenübertragung, findet die Vervielfältigung der Pakete an jedem Verteiler (Switch, Router) auf der Route im Netzwerk statt. Man unterscheidet zwischen vier wesentlichen Routingschemen. 



Unicast liefert eine Nachricht an einen spezifizierten Knoten; Broadcast liefert eine Nachricht an alle Knoten im Netzwerk; Multicast liefert eine Nachricht an eine bestimmte Gruppe von Knoten im Netzwerk, die an dieser Nachricht interessiert sind; Anycast liefert eine Nachricht an jeden Knoten innerhalb einer Gruppe von Knoten, typischerweise den an der Quelle nächstgelegenen. Es existieren zwei unterschiedliche Punkt zu einer Gruppe Verbindungen, die auch Mehrpunktverbindungen genannt werden: Broadcast und Multicast. Ein Broadcast bzw. Rundruf in einem Computernetzwerk ist eine Nachricht, bei der Datenpakete von einem Punkt aus an alle Teilnehmer eines Netzes übertragen werden. In der Vermittlungstechnik ist ein Broadcast eine spezielle Form der Mehrpunktverbindung. Multicast bezeichnet hingegen eine Nachrichtenübertragung von einem Punkt zu einer Gruppe. Dabei werden die Datenpakete an eine sogenannte Multicast‐Adresse gesendet, das Netzwerk liefert die Pakete anschließend an die Hosts aus, die sich bei dieser Adresse für den Empfang von Nachrichten eingetragen haben. C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
1
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Es ist nur UDP‐Sockets gestattet Broadcast und Multicast zu nutzen, weil eine TCP‐Verbindung technisch bedingt immer vom Typ Unicast ist. Da die herkömmlichen, im Internet eingesetzten Router in aller Regel nicht Broadcast‐ und Multicast‐fähig sind, bleiben Multicast‐fähige Teilnetze im Internet häufig isoliert und bilden so genannte Multicasting‐Inseln. Diese Inseln können mittels Tunneling, also durch Kapseln eines Multicast‐Pakets in ein Unicast‐Paket, überbrückt werden und bilden so ein weltumspannendes Multicast‐Netz, den MBONE. Broadcast Ein Broadcast wird in einem Computernetz vorwiegend verwendet, wenn die Adresse des Empfängers der Nachricht noch unbekannt ist. Das Broadcasting von UDP Datagrammen ist ähnlich wie das Unicasting von Datagrammen, mit der Ausnahme das statt einer normalen IP‐Adresse (Unicast) eine spezielle Broadcast‐Adresse verwendet wird. Die lokale Broadcast‐Adresse 255.255.255.255 sendet eine Nachricht an jeden Host, der sich in demselben Netzwerk befindet. Dieses Ziel liegt immer im eigenen Netz und wird direkt in einen Ethernet‐Broadcast umgesetzt. Lokale Broadcast Nachrichten werden niemals von Routern weitergeleitet. Das IP spezifiziert auch directed broadcasts. Das Ziel sind die Teilnehmer eines bestimmten Netzes. Aufgrund von Sicherheitsproblemen mit DoS‐Angriffen wurde das voreingestellte Verhalten von Routern in RFC 2644 für directed broadcasts geändert. Router sollten directed broadcasts nicht weiterleiten, weshalb diese Art hier im Artikel nicht weiter besprochen wird. Es existiert keine Broadcast‐Adresse, mit der es möglich wäre Nachrichten an alle Hosts zu versenden. Würde es eine derartige Adresse geben, hätte das fatale Folgen auf jeden Host im Internet. Beim Versenden eines Datagramms, würde es im gesamten Netzwerk zu einer enormen Zahl an Verfielfältigungen, hervorgerufen durch die Router, kommen. Dies würde die Bandbreite in allen Netzen erheblich beeinträchtigen. Innerhalb eines überschaubaren Netzwerks kann ein Broadcast allerdings sinnvoll sein. Oft wird er verwendet um Informationen innerhalb eines Spielenetzwerks zu versenden, wo sich alle Spieler innerhalb desselben Netzes bewegen. In C# ist der Code für
Broadcast und Unicast derselbe. Hierzu muss lediglich die IP‐Adresse durch die Broadcast‐Adresse ausgetauscht werden. Sie können das im Beispiel UdpClientSample ausprobieren. C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
2
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Multicast Multicast ist die übliche Bezeichnung für IP‐Multicast, das es ermöglicht, in IP‐Netzwerken effizient Daten an viele Empfänger zur gleichen Zeit zu senden. Der Vorteil von Multicast besteht darin, dass gleichzeitig Nachrichten an mehrere Teilnehmer oder an
eine geschlossene Teilnehmergruppe übertragen werden können, ohne dass sich beim Sender die Bandbreite mit der Zahl der Empfänger multipliziert. Der Unterschied zu Broadcast besteht darin, dass beim Broadcast Content verbreitet wird, den jeder mit der entsprechenden Empfangsausrüstung ansehen kann, beim Multicast dagegen eine vorherige Anmeldung bei dem Aussender des Contents vonnöten ist. Das passiert mit einer speziellen Multicast‐Adresse. In IPv4 ist hierfür der Adress‐Bereich 224.0.0.0 bis 239.255.255.255, in IPv6 jede mit FF00::/8 beginnende Adresse reserviert. Bei der Übertragung über Ethernet werden die IPv4‐ bzw. IPv6‐Multicastadressen auf bestimmte Pseudo‐MAC‐Adressen abgebildet, um bereits durch die Netzwerkkarte eine Filterung nach relevantem Traffic zu ermöglichen. Die Abbildung erfolgt dabei nach folgenden Regeln: In C# kommunizieren Anwendungen, die Multicast verwenden, in der Regel indem sie eine Instanz der Klasse UdpClient
verwenden. Es ist wichtig zu wissen das es sich bei einem Multicast‐Socket tatsächlich um einen UDP‐Socket handelt, der über zusätzliche, spezifische Multicast‐Attribute verfügt, die manuell beeinflußt werden können. Mit den Informationen lässt sich zunächst eine Hilfsklasse implementieren, die eine gegebene IP‐Adresse überprüft und true
zurückliefert, wenn es sich um eine gültige Multicast‐Adresse handelt. Wir beschränken uns hier auf IPv4. using System; using System.Collections.Generic; using System.Text; namespace CodePlanet.Articles.ProgrammingSockets { public class MCIPAddress { // Überprüfe ob es sich um eine gültige IPv4 Multicast‐Adresse handelt public static bool isValid(string ip) { try { int octet1 = Int32.Parse(ip.Split(new Char[] { '.' }, 4)[0]); if ((octet1 >= 224) && (octet1 <= 239)) return true; } catch (Exception e) { } return false; } C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
3
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
} } Anschließend kann eine Information über UDP versendet werden. Bitte beachten Sie das einige Klassen, wie ItemQuote, hier nicht näher aufgeführt werden. Die Klasse repräsentiert ein Artikelobjekt, welches später kodiert (serialisiert) und in einem UDP‐Paket versendet wird. Die fehlenden Klassen befinden sich im Dateianhang zu diesem Artikel. using System; using System.Net; using System.Net.Sockets; namespace CodePlanet.Articles.ProgrammingSockets { public class SendUDPMulticast { public static void Main(string[] args) { if ((args.Length < 2) || (args.Length > 3)) throw new ArgumentException("Parameter(s): <Multicast Addr> <Port> [<TTL>]"); // Prüfe ob es sich um eine gültige Multicast‐Adresse handelt if (!MCIPAddress.isValid(args[0])) throw new ArgumentException("Valid MC addr: 224.0.0.0 ‐ 239.255.255.255"); IPAddress destAddr = IPAddress.Parse(args[0]); // Zieladresse int destPort = Int32.Parse(args[1]); // Zielport int TTL; // Time‐to‐live für das Datagramm if (args.Length == 3) TTL = Int32.Parse(args[2]); else TTL = 1; // Standard TTL // Generiere einen neuen Artikel ItemQuote quote = new ItemQuote(1234567890987654L, "5mm Super Widgets", 1000, 12999, true, false); Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // Multicast Socket // Setze TTL sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, TTL); // Textkodierer ItemQuoteEncoderText encoder = new ItemQuoteEncoderText(); // Kodiere den Artikel mit dem Textkosierer in eine Bytesequenz byte[] codedQuote = encoder.encode(quote); C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
4
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
// Generiere Endpunkt IPEndPoint endPoint = new IPEndPoint(destAddr, destPort); // Sende den kodierten Artikel als UDP‐Paket sock.SendTo(codedQuote, 0, codedQuote.Length, SocketFlags.None, endPoint); sock.Close(); } } } Es ist zu erkennen das es nur einen signifikanten Unterschied zwischen Unicast und Multicast gibt. Neben dem Umstand, dass nun zuerst die Adresse geprüft wird, wird auch eine sogenannte TTL gesetzt. Die Time‐to‐live oder TTL ist der Name eines Header‐Felds des Internetprotokolls, das verhindert, dass unzustellbare Pakete endlos lange von Router zu Router weitergeleitet werden. Laut RFC 791 muss die TTL von Paketen auf jedem Router, den das Paket auf dem Weg vom Sender zum Ziel passiert, um mindestens 1 verringert werden. Sofern das Paket längere Zeit auf dem Router „hängt“, sollte das TTL‐Feld pro Sekunde um 1 verringert werden. IP‐Pakete mit einer TTL von 0 werden vom Router als Irrläufer verworfen und das Paket geht verloren. Mit der Angabe der TTL können wir also die Lebenszeit des Paketes einschränken und somit die Distanz die es zurücklegen kann. Innerhalb der Klasse Socket wird hierfür die Methode SetSocketOption verwendet und die Eigenschaft SocketOptionName.MulticastTimeToLive. Im Gegensatz zu Broadcast, wo die Empfänger nichts weiter zu tun haben, müssen bei Multicast die Empfänger zunächst einer Multicast‐Gruppe beitreten. Das Beitreten veranlasst den Betriebssystemkern dazu Pakete an höhere Schichten weiterzuleiten. Beim guten alten Analogradio entspräche das der Frequenz, die die Hörer für den Empfang eines Senders einstellen müssen. Im Fall von IP‐Multicast muss der Kernel also sozusagen die "Frequenz" (die Multicast‐Gruppe) für den Empfang von Multicast‐
Paketen erfahren, damit der Anwender zum Beispiel einer Videokonferenz beiwohnen kann. Er muss der Multicast‐Gruppe "beitreten" (Join), um Daten zu empfangen. C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
5
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Um eine Multicast‐Gruppe wieder zu verlassen, muss ein Drop an die Adresse versendet werden. Alternativ dazu kann der Socket geschlossen werden, was implizit dazu führt das man die Gruppe verlässt. In .NET stellt die höhere Socketklasse UdpClient die Methoden JoinMulticastGroup und DropMulticastGroup zur Verfügung. In dem nachfolgenden Beispiel, wird auf dem Socket die Option SocketOptionName.AddMembership verwendet um einer Gruppe beizutreten. using System; using System.Net; using System.Net.Sockets; namespace CodePlanet.Articles.ProgrammingSockets { public class ReceiveUDPMulticast { public static void Main(string[] args) { if ( args.Length != 2 ) throw new ArgumentException("Parameter(s): <Multicast Addr> <Port>"); if (!MCIPAddress.isValid(args[0])) throw new ArgumentException("Valid MC addr: 224.0.0.0 ‐ 239.255.255.255"); IPAddress address = IPAddress.Parse(args[0]); // Zieladresse int port = Int32.Parse(args[1]); // Multicast port Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // Multicast Socket // Adresse wiederverwenden sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); // Generiere Endpunkt IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port); sock.Bind(endPoint); // Mitgliedschaft in der Multicast Gruppe sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(address, IPAddress.Any)); IPEndPoint receivePoint = new IPEndPoint(IPAddress.Any, 0); EndPoint tempReceivePoint = (EndPoint)receivePoint; // Generiere und empfange das Datagramm byte[] packet = new byte[ItemQuoteTextConst.MAX_WIRE_LENGTH]; int length = sock.ReceiveFrom(packet, 0, ItemQuoteTextConst.MAX_WIRE_LENGTH, SocketFlags.None, ref tempReceivePoint); // Textdekodierer C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
6
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
ItemQuoteDecoderText decoder = new ItemQuoteDecoderText(); ItemQuote quote = decoder.decode(packet); Console.WriteLine(quote); // Kündige Mitgliedschaft in der Multicast Gruppe sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.DropMembership, new MulticastOption(address, IPAddress.Any)); sock.Close(); } } } Starten Sie den Empfänger in der Konsole mit einer Multicast‐Adresse und einer Portnummer. Versenden Sie anschließend mit dem Sender ein Paket an diese Gruppe. Sie werden erkennen können, dass der Empfänger in der Methode ReceiveFrom
blockiert, bis er ein Datenpaket für die Gruppe empfangen hat. Multicast Datagramme können direkt mit Sockets versendet werden oder mit der höheren Klasse UdpClient, indem einfach eine gültige Multicast‐Adresse verwendet wird. In diesem Fall beträgt die TTL 1. Die Entscheidung für oder gegen Broad‐ bzw. Multicast, hängt von verschiedenen Faktoren ab. Für gewöhnlich wird Broadcast verwendet, wenn Datagramme in einem sehr begrenzten lokalen Netzwerk versendet werden sollen. Sollen Daten innerhalb eines größeren Netzwerkes übertragen werden, wird auf Multicast zurückgegriffen, sofern die Router in diesem Netzwerk Multicast‐fähig sind. Die Nutzung von Broadcast wird innerhalb des Internets nicht unterstützt. Multicast beschränkt sich heute im Internet auf globale Multicast Backbones (MBONE) mit den entsprechenden Routern. Obwohl das IPv4 und IPv6 sowohl Broad‐ als auch Multicast definieren, sind die im Internet eingesetzten Router größtenteils nicht Broadcast‐ und Multicast‐fähig, so dass ihre Nutzung auf lokale Netzwerke beschränkt bleibt. Gründe sind unter anderem darin zu finden, dass die Umsetzung von Multicast bei großen Netzwerken, wie dem Internet, technische Schwierigkeiten bereitet, die insbesondere die Skalierbarkeit betreffen. Die Nutzung von Multicast setzt voraus, dass dem Sender und Empfänger die Adresse der Gruppe bekannt ist, damit sie sich dort registrieren können. Die unterliegende Schicht bleibt bei den verschiedenen Übertragungsarten immer das User Datagram Protocol. Ein Empfänger, der an Port Y lauscht, empfängt sowohl Unicast, als auch Multicast Datagramme, die für diesen Port bestimmt sind. C:\Users\munz\Desktop\Netzwerkprogrammierung\Broadcast_versenden.doc
7
Herunterladen