Grundlagen der Programmierung 1 Modul: Programmierung B-PRG Grundlagen der Programmierung 1 – Teil 4 Teil 4 – Verteilte Systeme 1. Einführung 1.1 Vernetzung von Rechnern 1.2 Client / Server - Modell 1.3 ISO-OSI Referenzmodell 1.4 Internet: Architektur, Protokolle Verteilte Systeme Prof. Dr. O. Drobnik Professur Architektur und Betrieb verteilter Systeme Institut für Informatik Fachbereich Informatik und Mathematik 2. Routing: Kürzeste Wege 1. Einführung Protokoll : Regeln für den Austausch von Nachrichten zwischen kommunizierenden Einheiten (Prozessen) : Format, Bedeutung und Reihenfolge (Ordnung) der Nachrichten Aktionen, die zur Übertragung und/oder beim Empfang einer Nachricht oder beim Auftreten eines anderen Ereignisses durchzuführen sind. 1.1 Vernetzung von Rechnern Verteiltes Rechnersystem (Distributed Computer System) Rechner Prozess Kommunikationssystem Menge von autonomen Rechnern (kein gemeinsamer Speicher) Kommunikationssystem, das die Rechner untereinander verbindet und den Austausch von Nachrichten zwischen ihnen (bzw. Prozessen) ermöglicht (Menge von Hardware und Software Komponenten). Prozesse kooperieren zur Erfüllung einer gemeinsamen Aufgabenstellung ; die Kooperation erfolgt über Nachrichtenaustausch. Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 3 Rechnernetz (Computer Network) Rechner und Kommunikationssystem ermöglichen Nachrichtenaustausch (sind kommunikationsfähig) enthalten jedoch keinerlei Mechanismen, die eine kooperative Aufgabenbearbeitung durch mehrere Programme unterstützt. (Anmerkung : Rechnernetz ist Basis eines verteilten Systems ! ) Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 4 Vernetzungsszenarien Internet-Architektur geostationär z.B. GPS, Galileo Internet heute Großes Unternehmen Mobilfunk Clients Server Backend Rechner Token Ring CSMA Fast-Ethernet Gigabit-Ethernet Vermittlungsnetze •ATM ATM Gigabit-Ethernet Sonet Firewall CSMA Internet Service Provider (ISP) Peering Point Backbone Service Provider Data Warehouse •Sonet Backbone Frontend Peering Point Öffentl. Netze Intranet Autonome Systeme Transit ISP ISP Gateway Cluster WLAN Kleinfirma Supercomp. Großes Unternehmen Techn. Prozesse Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 5 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. 1.2 Client / Server - Modell Dienst-Nutzung Client / Server - Modelle beruhen auf dem Grundsatz einer funktionalen Trennung von Benutzer (Client) und Bereitstellung sowie Verwaltung von Betriebsmitteln / Diensten (Server). Um einen Dienst eines Servers nutzen zu können, ist es für den Client erforderlich, folgende Informationen zu besitzen: Betriebsmittel sind u. a.: Rechnerleistung, Datenbestände, Plattenspeicher, etc. Funktion und Leistungsumfang des angebotenen Dienstes. Client: Syntax der Schnittstellen, Datentypen Server: System, das die Dienstleistung eines Servers anfordert und nutzt. Zentrales oder dezentrales System, auf dem Dienste (Services) installiert sind, die vom Client aufgerufen und genutzt werden. © J.W.G-Universität Frankfurt a.M. Semantik der an der Schnittstellen angebotenen Funktionen Auswirkung der Funktionsaufrufe auf den Zustand des Servers, mögliche Aufruffolgen. Zugangsprotokoll Beispiel: WWW-Browser (Client), - Server Grundlagen der Programmierung 1 Folie 6 Folie 7 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 8 Nachrichtenaustausch 1.3 ISO-OSI Referenzmodell Der Client sendet eine Nachrichten an den Server, in der er den zu erbringenden Dienst spezifiziert. Der Server nimmt die Nachricht entgegen und führt den Dienst aus. Falls kein Fehler aufgetreten ist, sendet der Server das Ergebnis in einer weiteren Nachricht an den Client zurück. Im Fehlerfall wird ein Fehlerindikator zurückgeschickt. Der Client nimmt das Ergebnis (bzw. den Fehlerindikator) entgegen und verarbeitet es weiter. Anforderungen (Request) Client receive (p) Ergebnis (Reply) Protokolle werden durch kooperierende Instanzen (Prozesse) abgewickelt. Diese tauschen Protokolldateneinheiten aus, die neben den zu übertragenden Daten die protokollrelevante Informationen erhalten (z.B. Sequenznummern, Prüfsummen). Bei der Kommunikation zwischen Rechnern kommen i.a. mehrere Protokolle zum Einsatz, die verschiedene Aufgaben erfüllen, und aufeinander aufbauen. Elementare Protokolle realisieren Funktionen, die von höheren Protokollen verwendet , um ihrerseits neue Funktionen zu realisieren. Server send (p) Entkopplung, ggf. weitere Aktivitäten und Anforderungen Das ISO-OSI Referenzmodell Bearbeitung von p send (r) receive (r) Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 9 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. ISO-OSI Referenzmodell ISO-OSI Referenzmodell Architekturmodell für Kommunikationssysteme : ISO International Organisation for Standardisation OSI Open Systems Interconnection Zerlegung des komplexen Kommunikationsvorgangs in einfachere Teilfunktionen, die weitgehend voneinander unabhängig betrachtet werden können. Folie 10 1977 – 82/83 : Int. Standard Zweck dieses Modells : Probleme : Identifikation der Teilfunktionen Zusammenwirken der Teilfunktionen zur Erfüllung des Systemzwecks Bereitstellung einer gemeinsamen konzeptuellen Basis zur Koordination der internationalen Entwicklung von existierenden und zukünftigen Standards für die Kommunikation zwischen Systemen im Sinne offener Systeme. Kommunikation : Austausch von Informationen zwischen Partnern mittels Nachrichten über ein Medium. Identifikation von Bereichen, in denen Standards neu entwickelt werden oder verbessert werden müssen. Einschätzung des Werts existierender Standards. Flexibilität gegenüber neueren technischen Entwicklungen. Das Referenzmodell unterteilt die vom Kommunikationssystem zu erbringenden Aufgaben in sieben aufeinander aufbauende Schichten: Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 11 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 12 ISO-OSI Referenzmodell Anwendung (application) 1.4 Internet: Architektur, Protokoll Semantik der durchzuführenden Aktion DNS Darstellung (presentation) Syntaktische Regeln für den Informationstransfer mit Umsetzung Kommunikationssteuerung (session) Organisation und Synchronisation der Kommunikation zwischen Anwendungsprozessen Transport (transport) Transparenter, zuverlässiger und kostengünstiger Transfer von Daten zwischen Anwendungsprozessen Vermittlung (network) Transfer von Daten zwischen Endsystemen über gekoppelte Teilstrecken oder Netze Sicherung (data link) Bitübertragung (physical) SSH HTTP UDP ICMP Anwendung Transport TCP IP IGMP Netzwerk Überwachung von Teilstrecken mit Fehlererkennung und Fehlerkorrektur Strom von Bits ohne Sicherung über Medien Jede Schicht stellt eine Menge von Funktionen bereit, die der Schnittstelle zur darüberliegenden Schicht zur Verfügung steht, und als Dienst bezeichnet wird. Ein Dienst wird an Dienstzugangspunkten bereitgestellt. Dienstzugangspunkte werden durch Adressen identifiziert. Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. RARP ARP Folie 13 Hardware Interface Bitübertragung Medium Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. IP-Adressen (1) IP-Adressen (2) IP : Internet Protocol Eine IP-Adresse der Klasse A,B oder C identifiziert eine Netzschnittstelle, nicht einen Rechner, denn ein Rechner kann mehrere Netzschnittstellen besitzen. IP ist ein verbindungsloses Protokoll. Es bietet die Basis für eine Vielzahl der im Internet verwendeten Protokolle. IP-Adressen Folie 14 Beispiel für eine IP-Adresse Die Adressen der Schicht 3 sind IP-Adressen. IP-Adressen sind 32-Bit Zahlen, die meist byteweise notiert werden, z.B. 141.2.14.16. Als Beispiel dient die IP-Adresse eines Rechners im Netz der Universität Frankfurt : 141.2.14.16. IP-Adressen sind in fünf Klassen unterteilt : Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 15 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 16 Verwaltung des IPIP-Adressraums Domain Name System (DNS) ICANN (the Internet Corporation for Assigned Names and Numbers) ist verantwortlich für : IP Adressraum Zuordnung, DNS verwendet einen hierarchischen Namensraum (Baum), ähnlich dem Unix-Dateisystem. DNS (Domain Name System) Management, Jeder Knoten hat einen Namen (label) von bis zu 63 Zeichen. An der Wurzel des Baums befindet sich ein besonderer Knoten mit einem Namen der Länge 0. Root Server System-Managementfunktionen. Groß- und Kleinschreibung in Namen ist irrelevant. Protokollparameter Zuweisung, Der Domainname eines Knotens ist die Liste der Knotennamen beginnend mit dem Namen des Knotens selbst bis zur Wurzel, wobei die Namen mit Punkten („ .“) voneinander getrennt werden. DNS : DNS ist eine verteilte Datenbank u.a. zur Abbildung von Rechnernamen auf Adressen (und umgekehrt). Eigenschaften: Ein Domainname, der mit einem Punkt endet, heißt absoluter oder voll qualifizierter Domainname (fully qualified domain name, FQDN), zum Beispiel: Es gibt keine Instanz auf dem Internet, der die kompletten Informationen vorliegen. Nameserver stellen Daten zur Verfügung. hera.rbi.informatik.uni-frankfurt.de. Zugang zum DNS : über Resolver (Bibliothek). Die TCP/IP-Protokolle wissen nichts über DNS. Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. (IP-Adresse: 141.2.1.1) Folie 17 Socket-basierte Kommunikation © J.W.G-Universität Frankfurt a.M. Grundlagen der Programmierung 1 Sockets Seit BSD Unix 4.2 (~1984), mittlerweile in (fast) allen Betriebssystemen als „kleinster gemeinsamer Nenner“ der Abstraktion einer Netzschnitt- Die Adressen der Schicht 4 sind Sockets. Sockets bestehen aus : stelle verfügbar. IP-Adresse und Portnummer Sockets : sind das grundlegende Konzept für Interprozesskommunikation unter Unix, Port: Adreßkomponente, identifiziert Speicherbereich für die Daten einer Kommunikationsverbindung bilden die Schnittstelle zum Betriebssystem für die Abwicklung von Kommunikationsaufträgen, Portnummer: Zahl zwischen 0-65535. bilden die Kommunikationsendpunkte zwischen zwei Prozessen. Schreibweise für Sockets : 141.2.1.1:22. orientieren sich am Unix-Prinzip für Datei-Zugriff: Open O Read R Write W Close C Grundlagen der Programmierung 1 Folie 18 © J.W.G-Universität Frankfurt a.M. IP-Adresse:Port, z.B. : Sockets erlauben die Adressierung verschiedener Empfänger innerhalb eines Rechners, z.B. verschiedener Prozesse. Folie 19 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 20 UDP : User Datagram Protocol Sockets Durch die feste Zuordnung eines Teils der Portnummern zu Diensten (RFC 3232 ) wird die Bereitstellung von Internetweit verfügbaren Diensten ermöglicht. Internet Assigned Numbers Authority - Liste der zugeordneten Ports: http://www.iana.org/assignments/port-numbers well known ports: UDP (RFC 768) stellt einen verbindungslosen Transportdienst bereit. UDP verwendet IP zum Transport der Datagrame, dabei ist die maximale Größe der UDP-Daten durch die maximale Größe eines IP-Pakets bestimmt. 0 – 1023 Port 21 : File Transfer Protocol (FTP) Port 22 : Secure Shell (SSH) Port 80 : Hypertext Transfer Protocol (HTTP) registered ports: 1024 – 49151 dynamic and/or private ports: 49152 – 65535 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 21 TCP : Transmission Control Protocol Die Kommunikation zwischen Endsystemen erfolgt bei TCP in drei Schritten Aufbau der Kommunikationsverbindung, Austausch von Daten, Abbau der Kommunikationsverbindung. TCP unterteilt Anwendungsdaten in Segmente (TCP-Segmente), die mit IP transportiert werden. Die Größe der Segmente kann von den Kommunikationspartnern beim Verbindungsaufbau bestimmt werden. © J.W.G-Universität Frankfurt a.M. © J.W.G-Universität Frankfurt a.M. Folie 22 IPIP-Routing TCP ist ein verbindungsorientiertes, zuverlässiges Transportprotokoll. Grundlagen der Programmierung 1 Grundlagen der Programmierung 1 Folie 23 Beim Transport eines IP-Paketes lassen sich zwei Fälle unterscheiden. Der Empfänger ist direkt mit dem Sender verbunden, z.B. über eine PPP-Verbindung oder durch eine Schnittstelle zum gleichen Netz : IP-Pakete können direkt an den Empfänger gesendet werden. Der Empfänger ist nicht direkt mit dem Sender verbunden : IP-Pakete müssen über Netzgrenzen hinweg transportiert werden. Dazu werden die IP- Pakete an den Default-Router des lokalen Netzes gesendet, der sie auf der Basis seiner Routing-Tabellen an den Empfänger liefert. Routing Protokolle (RIP, OSPF) dienen der Erstellung der Routing – Tabellen. Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 24 2.1 Routing: Kürzeste Wege Routing: Kürzeste Wege Der kürzeste Weg von einer Quelle zu anderen Knoten In Anlehnung an Dijkstra: Betrachte eine Menge S der Knoten, zu denen bereits ein kürzester Weg gefunden wurde. (Single Source Shortest Path, SSSP) Gegeben: ein gerichteter Graph G = (V, E) mit Kosten GE : E → Nat. Der Knoten v0 ∈ V ist der Startknoten. Beginne mit S = {ø} Gesucht: der Weg mit minimalen Kosten von v0 zu allen anderen Knoten: kürzester Weg In jedem Schritt wird ein Knoten v ∈ V \S zu S hinzugefügt, dessen Abstand zu s minimal ist (minimal unter dem Knoten in V \S). Beispiel: Startknoten: v0 Dieser Knoten v läßt sich erreichen, indem man nur über Knoten in S läuft. Es kann also keinen kürzeren Weg zu v geben, der über einen Knoten w ∈ V \S läuft. 45 v0 50 20 10 15 v2 Weg v1 35 20 v3 15 10 v4 1 2 3 4 30 3 v0v2 v0v2v3 v0v2v3v1 v0v4 Länge/Kosten Falls (s, · · · , w, · · · v) kürzer ist als (s, · · · , v), wäre nicht v gewählt worden, sondern w. Daher muß w ∈ S gelten. 10 25 45 45 Es genügt also, den kürzesten Pfad ausgehend von den Knoten in S aus zu suchen. v5 © J.W.G-Universität Frankfurt a.M. Grundlagen der Programmierung 1 Folie 25 © J.W.G-Universität Frankfurt a.M. Grundlagen der Programmierung 1 Routing: Kürzeste Wege Routing: Kürzeste Wege Variablen im Programm: Repräsentation von Graphen: g Graph g als Datenstruktur: class D graph result Liste der kürzesten Wege einschließlich der zugeordneten Kosten short Menge der Knoten, zu denen bereits kürzeste Wege bestimmt worden sind: {key:value} (dictionary) vertices Diferenzmenge Vshort: Liste distance Kosten der bisher gefundenen kürzesten Weges von v zu Knoten vj in vertices über Knoten vi in short pathcost Kosten des aktuell betrachteten Weges Knoten aus vertices, zu dem der bisher kürzeste Weg gefunden wurde anchor Direkter Vorgänger von nearest in short Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. init: addvertex: addedge: getvertices: Erzeugen eines Graphen Hinzufügen eines Knotens Hinzufügen einer markierten Kante Liefert die Menge der Knoten cost: Liefert Kosten zu einer Kante des Graphen, sofern die Kante existiert; None: Sonst Interne Kantendarstellung: None: unendl. Kosten, keine Kante if distance == None or distance > pathcost nearest Folie 26 Folie 27 e e[0][0] e[0][1] e[1] = ((v1,v2,),c) = v1 = v2 =c Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 28 Routing: Kürzeste Wege Routing: Kürzeste Wege def getvertices(self): return copy.copy(self.knotenListe) import copy class DGraph: def __init__(self): self.knotenListe = [] self.kantenListe = [] def cost(self, v1, v2): ret = None for i in self.kantenListe: a1 = i[0][0] a2 = i[0][1] if a1 == v1 and a2 == v2: ret = i[1] return ret def addvertex(self, v1): if v1 not in self.knotenListe: self.knotenListe.append(v1) def addedge(self, v1, v2, c): if not v1 == v2: self.addvertex(v1) self.addvertex(v2) for i in self.kantenListe: a1 = i[0][0] a2 = i[0][1] if a1 == v1 and a2 == v2: self.kantenListe.remove(i) self.kantenListe.append(((v1,v2),c)) Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. def addedges(self, tupelListe): for i in tupelListe: a1 = i[0][0] a2 = i[0][1] c = i[1] self.addedge(a1,a2,c) Folie 29 Routing: Kürzeste Wege © J.W.G-Universität Frankfurt a.M. Folie 30 Routing: Kürzeste Wege def printshort(dict,result): ## debug-Ausgabe-Funktion print eins = "short = " for v in dict.keys(): print "%s '%s' : %s" % (eins,v,dict[v]) eins = " " print "result = %s" % result Grundlagen der Programmierung 1 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 31 # SSSP nach Dijkstra def sssp(g, v): result = [] vertices = g.getvertices() vertices.remove(v) short = {v: ([v], 0)} printshort(short,result) ### debug-Ausgabe while len(vertices) > 0: distance = None for v0 in short.keys(): for v1 in vertices: pathcost = g.cost(v0,v1) if pathcost <> None: pathcost = pathcost + short[v0][1] if distance == None or distance > pathcost: distance = pathcost nearest = v1 anchor = v0 if distance == None: break vertices.remove(nearest) short[nearest] = (short[anchor][0] + [nearest], short[anchor][1] + g.cost(anchor, nearest)) result.append((short[nearest][0], short[nearest][1])) printshort(short,result) ### debug-Ausgabe return result Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 32 Routing: Kürzeste Wege Routing: Kürzeste Wege tl = [(("v0","v1"),50), (("v0","v2"),10), (("v2","v0"),20), (("v1","v2"),15), (("v2","v3"),15), (("v1","v4"),10), (("v3","v4"),35), (("v4","v3"),30), (("v5","v3"),3), (("v0","v4"),45), (("v3","v1"),20)] g = DGraph() g.addedges(tl) ergebnis = sssp(g, "v0") > python sssp.py short = 'v0' : (['v0'], 0) result = [] Grundlagen der Programmierung 1 'v0' : (['v0'], 0) 'v2' : (['v0', 'v2'], 10) result = [(['v0', 'v2'], 10)] short = short = 'v0' : (['v0'], 0) 'v2' : (['v0', 'v2'], 10) 'v3' : (['v0', 'v2', 'v3'], 25) 'v4' : (['v0', 'v4'], 45) result = [(['v0', 'v2'], 10), (['v0', 'v2', 'v3'], 25), (['v0', 'v4'], 45)] © J.W.G-Universität Frankfurt a.M. Folie 33 = 'v0' : (['v0'], 0) 'v1' : (['v0', 'v2', 'v3', 'v1'], 45) 'v2' : (['v0', 'v2'], 10) 'v3' : (['v0', 'v2', 'v3'], 25) 'v4' : (['v0', 'v4'], 45) result = [(['v0', 'v2'], 10), (['v0', 'v2', 'v3'], 25), (['v0', 'v4'], 45), (['v0', 'v2', 'v3', 'v1'], 45)] Grundlagen der Programmierung 1 = 'v0' : (['v0'], 0) 'v2' : (['v0', 'v2'], 10) 'v3' : (['v0', 'v2', 'v3'], 25) result = [(['v0', 'v2'], 10), (['v0', 'v2', 'v3'], 25)] Routing: Kürzeste Wege short short © J.W.G-Universität Frankfurt a.M. Folie 35 Grundlagen der Programmierung 1 © J.W.G-Universität Frankfurt a.M. Folie 34