communityWir suchen ständig neue Tutorials und Artikel! Habt ihr selbst schonmal einen Artikel verfasst und seid bereit dieses Wissen mit der Community zu teilen? Oder würdet ihr gerne einmal über ein Thema schreiben das euch besonders auf dem Herzen liegt? Dann habt ihr nun die Gelegenheit eure Arbeit zu veröffentlichen und den Ruhm dafür zu ernten. Schreibt uns einfach eine Nachricht mit dem Betreff „Community Articles“ und helft mit das Angebot an guten Artikeln zu vergrößern. Als Autor werdet ihr für den internen Bereich freigeschaltet und könnt dort eurer literarischen Ader freien Lauf lassen.

TCP/IP Socket-Programmierung in C# - Multicast und Broadcast Drucken E-Mail
Benutzerbewertung: / 982
SchwachPerfekt 
Geschrieben von: Kristian   
Sonntag, den 12. März 2006 um 02:20 Uhr
Beitragsseiten
TCP/IP Socket-Programmierung in C#
Daten senden und empfangen
Höhere Socketklassen
Multicast und Broadcast
Ping, Threads und asynchrone Sockets
Formulare im Internet senden
E-Mail verschicken
Alle Seiten

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.

broad_and_multicast

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.

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:

multicast_to_mac

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;
        }
    }
}

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);
 
            // 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.

multicast_routing

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.

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
            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.

Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation. Alle Rechte vorbehalten.

C:\>ReceiveUDPMulticast.exe 224.0.0.0 777
Item# = 1234567890987654
Description = 5mm Super Widgets
Quantity = 1000
Price (each) = 12999
Total Price = 12999000 (discounted)
Out of Stock

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. Netzwerkteilnehmer könnten einen Broadcast missbrauchen und ganze Netzwerke im Internet mit Paketen fluten.

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.



Zuletzt aktualisiert am Donnerstag, den 02. Januar 2014 um 23:03 Uhr
 
AUSWAHLMENÜ