F Fußnoten i Inhaltsverzeichnis < Kapitel 6 > Kapitel 8 L Literaturverzeichnis M Materialien © Copyright

^ 7.3 Unterrichtsreihe "Grundlagen der Protokollsprachen des Internet"
Teilabschnitte dieses Abschnitts
v 7.3.5.1 Einfache Protokollsprachen
v 7.3.5.2 Fehlererkennung
v 7.3.5.3 Exkurs: Hamming-Codes
v 7.3.5.4 Fragmentierung und paketweise Übermittlung
v 7.3.5.5 Das OSI-Basisreferenzmodell - Einordnung von IP und TCP
v 7.3.5.6 Programmierung einer Client-Server-Anwendung auf dem Internet

7.3.5 Unterrichtsablauf

7.3.5.1 Einfache Protokollsprachen

Typischerweise wurden im Informatikunterricht bisher Programme erstellt, die auf einem Rechner abliefen und keinen Kontakt mit Benutzern auf anderen Rechnern erforderten. Häufig sollen aber Daten, die auf einem Rechner vorliegen, auch an anderen Orten jederzeit verfügbar sein.

Beispiele
Wenn ein Kunde bei einer Bank seinen Kontoauszug drucken will, so möchte er dieses möglichst in jeder beliebigen Filiale können, in deren Nähe er sich gerade befindet.
Ein Dokument, daß auf einem Rechner abgelegt wurde, soll auch an anderen Rechnern im Internet abrufbar sein.
Eine Mitteilung von einem Menschen an einen anderen soll an einem Rechner geschrieben und an einem anderen gelesen werden können, ohne daß die Übermittlung lange dauert oder ein Ausdrucken und verschicken mit der Post notwendig ist.

Über Leitungen können Daten übertragen werden, indem sie in elektrische Impulse umgesetzt werden. Die binäre Kodierung eines Zeichens kann auf der Leitung zum Beispiel in eine Folge der Zustände "unter Spannung" und "nicht unter Spannung" übertragen werden, die an einem anderen Rechner an der gleichen Leitung wieder in die binäre Kodierung zurückübersetzt werden. Damit ist allerdings noch nicht klar, wie die empfangenen Zeichen zu interpretieren sind, ob zum Beispiel gerade ein Dokument abgerufen werden soll oder ob ein elektronischer Brief übermittelt wird. Man benötigt also eine Vereinbarung, was die ankommenden Zeichen bedeuten sollen. Im zwischenmenschlichen Bereich werden solche Vereinbarungen durch die Sprache geleistet.

Für die Informatik sind neben Programmiersprachen Protokollsprachen von besonderer Bedeutung. Programmiersprachen bilden die wichtigste Schnittstelle zwischen Benutzer und Computer. Mit ihnen können Rechenvorschriften im Sinne von Algorithmen eindeutig formuliert werden, so daß durch sie die Übergabe von Problemen an den Computer ermöglicht wird.
Protokollsprachen dienen der Kommunikation zwischen Rechneranwendungen. Durch eine Protokollsprache werden Regeln festgelegt, wie ein Kommunikationsvorgang abläuft.

Beispiel für eine Protokollsprache für zwischenmenschliche Kommunikation:
Im Funksprechverkehr in der Luftfahrt wird durch ein "Roger" der Erhalt einer Nachricht quittiert, mit "Over" wird ein Wechsel der Sprechrichtung angezeigt. Durch "Over" wird gewährleistet, daß jeweils nur ein Partner spricht, was bei einer herkömmlichen einkanaligen Funkverbindung notwendig ist. Durch "Roger" ist sichergestellt, daß keine Nachrichten zum Beispiel durch Frequenzstörungen verlorengehen.

Für die Kommunikation zwischen Rechneranwendungen, die auch auf verschiedenen Rechnern laufen können, werden ebenfalls Regeln benötigt, die die Übermittlung von Daten steuern.
Da es aber weitaus mehr Regeln für die Datenübermittlung zwischen zwei Rechnern geben muß als nur ein "Roger" und ein "Over", sind für verschiedene Aufgabenbereiche unterschiedliche Protokolle entwickelt worden.

Die Unit Protokoll stellt einige Prozeduren zur Verfügung, mit denen einfache Kommunikationsvorgänge zwischen verschiedenen Anwendungen oder Rechnern simuliert werden können. Die Leitung, über den der Datenaustausch stattfindet, wird dabei durch eine Datei simuliert, in die geschrieben werden kann (senden) und aus der gelesen werden kann (empfangen). Schnittstelle für den Programmierer bilden die beiden Prozeduren
PROCEDURE Sende(zeichenkette: String);
PROCEDURE Empfange(VAR anzahl: Integer; zeichenkette: String);

Mit der Prozedur Sende wird eine Zeichenkette auf die Leitung gesendet.
Mit der Prozedur Empfange kann eine definierte Anzahl von Zeichen von der Leitung empfangen werden. Dabei gilt:
Fallsanzahl viele Zeichen gesendet aber noch nicht empfangen wurden, werden diese empfangen und in zeichenkette abgelegt.
Sonst ist Length(zeichenkette) gleich 0.

Es ist sichergestellt, daß die Zeichen in der gleichen Reihenfolge empfangen werden, in der sie geschrieben wurden und daß keine Zeichen verlorengehen.

Die Simulation entspricht in etwa einer Netzwerkkarte, die Daten auf ein Netzwerkkabel schreibt bzw. von diesem liest. Gelesene Zeichen werden gepuffert. (Im Gegensatz zu realen Netzwerkkarten werden hier allerdings beliebig viele Zeichen gepuffert.)

Aufgabe 1:
Testen Sie die beiden Prozeduren Sende und Empfange.
Schreiben Sie dazu ein Programm, in dem eine beliebige Zeichenkette gesendet wird. Die Zeichenkette soll dann zeichenweise empfangen und ausgegeben werden.

Mit den Prozeduren Sende und Empfange ist schon eine einfache Kommunikation zwischen zwei Rechnern möglich. Ein Rechner sendet Informationen, die der andere empfängt.

Ungeeignet sind diese Prozeduren allerdings, wenn die Rolle des Senders und des Empfängers ohne Absprache vertauscht werden können oder wenn mehrere Rechner an das Rechnernetz angeschlossen sind.

Wer einen Brief verschickt, muß den Empfänger auf diesem Brief ebenfalls kenntlich machen. Dieses geschieht durch das Anbringen der Adresse des Empfängers. Außerdem wird die Adresse des Absenders notiert, unter anderem damit der Empfänger bei Erhalt des Briefes weiß, von wem der Brief kommt. Er kann anhand der Absenderadresse zum Beispiel entscheiden, ob er den Brief annehmen will.

Es ist also notwendig, daß sich Rechner im Netz mit einer Adresse identifizieren. Die einfachste Möglichkeit ist, jedem Rechner eine Nummer zuzuweisen. Laufen auf einem Rechner zugleich mehrere Programme, die Nachrichten senden oder empfangen wollen, so benötigt jedes der Programme eine eigene Nummer.

Außerdem muß gesichert sein, daß das Ende einer Nachricht erkannt wird. Solange nur gewöhnliche Textzeilen verschickt werden, genügt dazu ein Zeilenendezeichen (char(13)) oder sonst irgendein nicht im Text vorkommendes Zeichen. Eine andere Möglichkeit ist die Kodierung der Länge der Nachricht.

Aufgabe 2:
a) Entwickeln Sie eine einfache Protokollsprache P1, mit denen eine Nachricht beliebigen Inhalts zwischen zwei Anwendungen auf beliebigen Rechnern verschickt werden kann. Die Nachricht soll durch einen String gegeben sein, der aus beliebigen Zeichen bestehen darf.
Wie kann die Syntax dieser Protokollsprache dargestellt werden? (Folien S. 92-94)
b) Implementieren Sie Ihre Sprache durch zwei Prozeduren SendeP und EmpfangeP, die die Prozeduren Sende und Empfange verwenden. Zur Identifikation der Sende- und der Empfangsanwendung sollen Zahlen im Bereich von 0 bis 255 verwendet werden, so daß durch die Standard-Funktion char die Adreßangaben in Zeichen umgesetzt werden können.
c) Testen Sie Ihre Prozedur mit einem Programm "Sender" und einem Programm "Empfänger", mit denen Tastatureingaben im Fenster des Senders im Fenster des Empfängers ausgegeben werden.
ˆ

7.3.5.2 Fehlererkennung

Ähnlich der Versendung von Briefen mit der Post können inzwischen Nachrichten per Computer versendet werden. Bei dem Versand von Briefen kann es schon einmal geschehen, daß Briefe nicht ankommen oder beschädigt werden. Vergleichbares kann auch bei der Übertragung von Nachrichten per Computer geschehen116.
In der Simulation wurden bisher alle Nachrichten genauso empfangen, wie sie gesendet wurden. Es traten also keine Fehler in Form von "Störungen" auf, die bei der Übertragung von Daten durch ein Kabel immer möglich sind. Eine mögliche Ursache von Störungen sind elektrische oder magnetische Felder, die möglicherweise einzelne Dateneinheiten verfälschen. Aber auch Manipulationen anderer Rechner können Gründe für eine Störung liefern.
Übertragungsfehler treten in Rechnernetzen immer wieder auf, besonders dann, wenn die Qualität der physikalischen Verbindungen nicht gut ist. Bei einer (analogen) Standard-Telefonleitung werden übermittelte Daten zuerst analogisiert - d. h. in Töne (Frequenzen) umgesetzt - und anschließend wieder digitalisiert. Ein "Grundrauschen" der Leitung oder unerwartete Nebengeräusche können so Störungen bewirken.

Die Unit Protokoll erlaubt auch die Simulation gestörter Übertragungen. Dazu stehen folgende Prozeduren zur Verfügung:
PROCEDURE Uebertragungsfehler(simulation: boolean);
PROCEDURE SetzeFehlerrate(rate: real);

Durch einen Aufruf Uebertragungsfehler(true) wird die Fehlersimulation eingeschaltet, mit dem Parameter false kann man sie wieder abschalten. Mit der Prozedur SetzeFehlerrate kann man eine Fehlerrate für den Empfang von Nachrichten einstellen (Voreinstellung: 0.0001).
So bedeutet zum Beispiel eine Fehlerrate von 0.01, daß von 100 empfangenen Bits durchschnittlich 0.01 * 100 Bits, also 1 Bit verfälscht wird.

Man benötigt demnach ein Protokoll, daß zusätzlich zu der bisher beschriebenen Funktion der Adressierung (von Sender und Empfänger) eine Fehlererkennung bereitstellt. Eine Fehlererkennung muß sich immer auf beide Gesprächspartner beziehen: der Empfänger muß feststellen können, daß er mit den empfangenen Daten nicht arbeiten darf oder kann, der Sender muß bemerken, daß seine Nachricht ihren Zweck nicht erfüllen kann.

Aufgabe 3
Welche Verfahren für eine Fehlererkennung wendet man bei herkömmlicher Kommunikation per Post/per Telefon an?
Beurteilen Sie, welche dieser Verfahren man auf eine Rechnerkommunikation sinnvoll übertragen kann. Bedenken Sie dabei auch, daß die Menge der zusätzlich zu übertragenden Daten möglichst gering sein sollte.
Formulieren Sie weitere Vorschläge für einfach zu implementierende Fehlererkennungsverfahren, die für die Rechnerkommunikation eingesetzt werden können.

Einfache Fehlererkennungsverfahren in der Rechnerkommunikation117 basieren zum Beispiel auf Quittungen (vergleichbar mit einem Einschreibebrief mit Rückschein), Überwachung der verstrichenen Zeit (vergleichbar mit der Nachfrage, wenn der Kommunikationspartner länger nichts von sich hören ließ) und Prüfsummen (ohne Pendant).
Gemeinsam ist allen Verfahren, daß sie nur ein zweiwertiges Kriterium kennen: entweder die übertragene Nachricht ist fehlerhaft, oder sie ist fehlerfrei. Eine genauere Beschreibung der Stelle, an der der Fehler auftrat, gibt es im allgemeinen nicht.

Aufgabe 4
Schreiben Sie eine Funktion zur Berechnung einer Prüfsumme eines Strings.
Erweitern Sie Ihre Protokollsprache P1 so zu einer Protokollsprache P2, daß Fehler bei der Übertragung anhand einer Prüfsumme erkannt werden können.
(EmpfangeP soll zu einer boolschen Funktion umgeschrieben werden, die im Falle einer falschen Prüfsumme den Wert false und sonst true ergibt.)
Testen Sie P2 mit einer Fehlerrate von 0,5% und 100 verschickten Nachrichten.

Bei der Beurteilung der Qualität einer Prüfsummenfunktion ist zu berücksichtigen, wie groß ihr Aufwand ist und welche Unterschiede zwischen zwei Nachrichten nicht zu unterschiedlichen Prüfsummen führen. Eine einfache Prüfsummenfunktion ist die Summierung aller 16-Bit-Worte einer Nachricht unter Vernachlässigung jedes Übertrags.

Stellt der Empfänger fest, daß in einer Nachricht ein Fehler enthalten ist, so kann er sie entweder ignorieren oder den Absender auffordern, die Nachricht noch einmal zu übermitteln. Dieses setzt allerdings voraus, daß die Nachricht eine eindeutige Kennung trägt, mit der dem Absender mitgeteilt werden kann, welche Nachricht noch einmal zu senden ist.

Da der Absender zumeist eine Reaktion des Empfängers auf seine Nachricht erwartet, genügt es häufig schon, daß der Absender bei Ausbleiben der Reaktion für eine bestimmte Zeitspanne die Nachricht noch einmal abschickt.

Gegebenenfalls können mehrere Korrekturversuche unternommen werden, allerdings muß ein Abbruch der Kommunikation nach einer gewissen Zeitspanne vorgesehen werden. Ansonsten wäre es möglich, daß trotz Zusammenbruchs der physikalischen Verbindung (zum Beispiel durch Unterbrechung der Telefonleitung) ein Kommunikationspartner unentwegt damit beschäftigt bliebe, die Kommunikation fortzuführen.ˆ

7.3.5.3 Exkurs: Hamming-Codes

Ein etwas anspruchsvolleres und recht effektives Verfahren zur Fehlererkennung und Fehlerkorrektur beruht auf den Arbeiten von Richard Wesley Hamming. Häufig wird es direkt in die Hardware implementiert, so daß eine softwaremäßige Programmierung nicht erfolgt.
Zuerst definiert man den Hamming-Abstand118 zweier Wörter eines Binärcodes als die Anzahl der Stellen, in denen sich die Codewörter unterscheiden. Der Hamming-Abstand eines Codes ist der kleinste auftretende Abstand zweier Codewörter.

Übung
Bestimmen sie den Hamming-Abstand d des Beispielcodes (Arbeitsblatt HC1 unten, Seite 107).

Durch den Hamming-Abstand d = 3 ist eine Fehlerkorrektur bei Übermittlungsfehlern in nur einer Stelle des Codeworts möglich, wie an einem Beispiel zu erarbeiten ist (Folie HC2, Seite 108). Dazu nimmt man eine Nachricht, die aus kodierbaren Zeichen unseres Beispielcodes besteht, und simuliert eine fehlerhafte Übermittlung durch Veränderung einzelner Bits der Bitfolge, wobei zunächst immer nur ein Bit pro Wort verfälscht werden soll. Man vergleicht die erhaltene Bitfolge dann wortweise mit den zulässigen Codewörtern. Für alle Wörter, die keine gültigen Codewörter sind, sucht man nach dem Codewort, das nur in einer Stelle einen Unterschied aufweist und ersetzt es dadurch.

Übung
(Arbeitsblatt HC5, Seite 111) Betrachten Sie die empfangenen Bitfolgen. Suchen Sie alle Wörter, die offensichtlich Fehler enthalten, und korrigieren Sie sie, wenn es eindeutig möglich ist.

Allgemein gilt:
Wird bei der Übertragung von Zeichen eine Kodierung mit dem Hamming-Abstand d > 0 verwendet, so können alle Fehler, die weniger als d/2 Bits betreffen, automatisch korrigiert werden. Fehler, die weniger als d Bits betreffen, können immerhin noch erkannt werden.

Die meisten Betriebssysteme verwenden Erweiterungen des ASCII-Codes, bei denen die Wortlänge eines Codewortes 8 Bit beträgt (siehe Arbeitsblatt HC1 oben, Seite 107). Man erkennt, daß die Kodierungen der Zeichen A und C sich nur in einer Stelle unterscheiden. Also ist im ASCII-Code der Hamming-Abstand d = 1, so daß bei der Übermittlung von Nachrichten im ASCII-Code keine Fehlerkennung geschweige denn eine automatische Fehlerbehebung möglich sind.
Natürlich genügt es nicht, Zeichen aus einem Code übermitteln zu können, der nur vier verschiedene Codewörter kennt. Es stellt sich also die Frage, wie man mit dem Beispielcode "gewöhnliche", im erweiterten ASCII-Code vorliegende Nachrichten übermitteln kann.

Interpretiert man ein Zeichen im ASCII-Code nun in 4 Gruppen zu je 2 Bit, so kann man diese zwei Bits jeweils durch einen Buchstaben im Beispielcode kodieren. Aus der Kodierung 00 wird dann ein A im Beispielcode (kodiert durch 00000), aus 01 wird ein B (01111), aus 10 ein C (10110) und aus 11 ein D (11001).

Beispiel
Umkodierung des Zeichens K in den Beispielcode aus Beispiel 2 (Folie HC3, Seite 109).

Aufgabe 5
Schreiben Sie eine Funktion Kodiere(ein: String): String, die die Kodierung einer Bitfolge im String ein (dargestellt durch eine Folge der Zeichen '0' und '1') als Bitfolge im Beispielcode liefert.

Aufgabe 6
Schreiben Sie eine weitere Funktion Dekodiere(ein: String): String, die entsprechend der Funktion Kodiere die Dekodierung übernimmt. Ergebnis soll ein String aus den Zeichen '0' und '1' sein, der die Bitfolge des dekodierten Wortes darstellt.

Aufgabe 7
Testen Sie Ihre Funktionen mit dem Aufruf teste(kodiere,dekodiere). Sie müssen dazu die Unit "BitStr" einbinden und den Text {$F+}119 nach dem Programmkopf einfügen.

Durch eine Kodierung von beliebigen im erweiterten ASCII-Code vorliegenden Nachrichten in einen Code mit d >= 3 können demnach alle Nachrichten, in denen höchstens 1 Bit pro Codewort verfälscht wurde, automatisch korrigiert werden.
Ein Nachteil des Verfahrens wird bereits an dem Beispiel deutlich: für jedes Zeichen müssen anstelle von 8 Bits mit der Fehlerkorrektur 20 Bits übertragen werden, was eine Steigerung des Datenaufkommens um 150% bedeutet.

Durch geschicktere Wahl des Codes kann man den zusätzlichen Datenaufwand verringern. So gibt es Codes mit einem Hamming-Abstand von d = 3, einer Wortlänge von 6 Bit und 8 verschiedenen Codewörtern (Folie HC4, Seite 110). Hier würde man zur Übertragung dreier Zeichen im erweiterten ASCII-Code anstelle von 24 Bit 48 Bit benötigen, was nur noch 50% zusätzliches Datenaufkommen durch die Kodierung bedeutet.ˆ

7.3.5.4 Fragmentierung und paketweise Übermittlung

Die bisher in der Simulation verwendeten Prozeduren Sende und Empfange erlauben nur das Versenden von Strings, also von Zeichenketten mit einer Länge von höchstens 255 Zeichen. Will man aber längere Nachrichten übertragen - zum Beispiel ganze Dokumente oder Programmdateien - erscheint die Begrenzung der Nachrichtenlänge störend. Schließlich erscheint es doch viel einfacher, wenn man eine Datei Byte für Byte übermitteln kann, ohne zwischendurch irgendwelche "Pausen" einzulegen.

Das Übermitteln großer Datenmengen in einem Stück oder "Fluß" hat neben dem Vorteil, daß der Verwaltungsaufwand gering ist. Allerdings sind auch Nachteile damit verbunden:

Werden die Daten jedoch in kleine Pakete aufgeteilt ("fragmentiert"), muß im Falle eines Fehlers nur noch das fehlerhafte Paket neu übermittelt werden. Der Verwaltungsaufwand wird aber größer, denn nun muß ja jedes einzelne Paket - man nennt diese Teilpakete auch Fragmente - mit einem eigenen Protokollkopf versehen werden, und außerdem muß der Empfänger kontrollieren, ob er wirklich alle Pakete erhalten hat.

Will während der Übermittlung vieler Fragmente einer langen Nachricht ein anderer Rechner eine Nachricht schicken, so kann er dieses tun, indem er seine Pakete so abschickt, daß sie zwischen denen des anderen Senders übermittelt werden.
Damit der Empfänger erkennt, wann eine Nachricht komplett empfangen wurde, muß ihm beispielsweise eine Endekennung oder die Anzahl der noch folgenden Pakete mitgeteilt werden. Wieder bietet sich der Vergleich mit der Post an, die ebenfalls Nachrichten paketorientiert übermittelt. Hat ein Absender zum Beispiel viele einzelne Waren zu verschicken, verpackt er sie in einzelne Pakete, die dann von der Post entgegengenommen werden. Geht ein einzelnes Paket verloren, muß nicht die gesamte Sendung neu geschickt werden, sondern nur dieses eine Paket120.

Die Nachrichten in den Aufgaben 8 und 9 dürfen länger als 255 Zeichen sein. Dazu sollen sie jeweils in einem Feld (array[1..n] of char) abgelegt werden, auf das ein Zeiger vom Typ PChar zeigt.

Um Strings in Felder vom Typ PChar zu kopieren, kann man die Funktion StrPCopy der Unit Strings verwenden. Um umgekehrt genau anzahl Zeichen aus einem Feld von Typ PChar in einen String zu kopieren, verwende man die Prozedur PCharInString der Unit Protokoll:
PROCEDURE PCharInString (anzahl: Byte; von: PChar; VAR zu:string);

Aufgabe 8
Schreiben Sie eine Prozedur SendePkte, die eine Nachricht in Paketen mit einer jeweils auf eine konstante Anzahl Zeichen begrenzte Länge verschickt. Die Prozedur SendePkte soll die Prozedur SendeP zum Versenden verwenden.

Aufgabe 9
Schreiben Sie eine Funktion EmpfangePkte, die die von SendePkte gesendeten Pakete empfängt und wieder zu einer Nachricht zusammensetzt. Sie soll die Funktion EmpfangeP benutzen.
Tritt ein Fehler auf, soll die Funktion den Wert false zurückliefern. Für jedes falsche oder fehlende Paket soll eine Nachricht auf dem Bildschirm ausgegeben werden (der Empfang wird aber fortgesetzt).

In Aufgabe 9 kann statt der Implementierung auch nur die Skizzierung der Funktion verlangt werden.
Je nach Formulierung der Lösung zu den Aufgaben 8 und hat man eine Protokollsprache P3 definiert, mit der man eine Nachricht aus mehreren Paketen unter der Voraussetzung wieder zusammensetzen kann, daß von dem Empfänger zwischendurch keine Pakete anderer Absender empfangen werden. Solche Pakete wurden entweder ignoriert und verhinderten somit eine problemlose Kommunikation zwischen dem anderen Sender und dem Empfänger oder führten zu einer Fehlermeldung.

Aufgabe 10
Diskutieren Sie, wie es erreicht werden kann, daß

  1. Nachrichten korrekt empfangen werden, auch wenn mehrere Sender "gleichzeitig" eine Nachricht an einen Empfänger schicken,
  2. fehlerhafte Pakete nicht dazu führen müssen, daß die gesamte Nachricht noch einmal übertragen werden muß,
  3. der Sender den Erfolg der Übermittlung überprüfen kann.

Eine Möglichkeit, für eine korrekte Übermittlung zu sorgen, ist der Aufbau einer Verbindung. Das bedeutet, daß vor dem Senden der eigentlichen Nachricht der Sender bei dem Empfänger die Bereitschaft zum Empfang der Daten erfragt und die Daten erst nach einer entsprechenden Meldung des Empfängers sendet. Dieser Verbindungsaufbau wird als Handshake ("Händeschütteln") bezeichnet. Entsprechend werden empfangene Daten quittiert und der Verbindungsabbau signalisiert. Die "Verbindung" muß aber nicht im Sinne einer physikalischen Verbindung (Telefonleitung) direkt zwischen dem Sender und dem Empfänger bestehen, sondern ist eine logische Verbindung (auch: virtuelle Verbindung), die durch das Handshaking kontrolliert wird. Es ist zum Beispiel auch denkbar, daß zwischen Sender und Empfänger noch weitere Rechner mit der Weiterleitung der Datenpakete beschäftigt sind.
Ein Protokoll, das diese Funktionen vorsieht, bezeichnet man als verbindungsorientiertes Protokoll121. Die bisher implementierten Protokolle P2 und P3 (Aufgaben 4, 8 und 9) benötigen keinen Handshake und stellen daher verbindungslose Protokolle dar.
Datenpakete in verbindungslosen Protokollen sind vergleichbar mit Telegrammen: sie werden abgeschickt und bilden in sich abgeschlossene Informationseinheiten. Man nennt sie Datagramme.ˆ

7.3.5.5 Das OSI-Basisreferenzmodell - Einordnung von IP und TCP

Bisher wurden drei aufeinander aufbauende Protokolle verwendet: das (nicht näher besprochene) Protokoll P0 der Unit Protokoll, das Protokoll P2 und das Protokoll P3122.
Jedes der Protokolle stellte je eine Sende- und eine Empfangsroutine zur Verfügung.

P3ermöglicht mit den in Aufgabe 10 erarbeiteten Erweiterungen eine Übermittlung einer Nachricht in einzelnen Paketen sowie eine einfache Korrektur erkannter Fehler.
P2stellt sicher, daß jeder Empfänger nur die für ihn bestimmten Nachrichten erhält und Fehler in Nachrichten erkannt werden können
P0sorgt dafür, daß Daten überhaupt gesendet und empfangen werden können.

Die Übertragung von Nachrichten geschieht also in drei Schichten, die von Sender und Empfänger jeweils nacheinander verwendet werden.

Vorgänge bei der sendenden Anwendung (Folie SCH, Seite 103):
Die Nachricht wird an die Sendeprozedur des Protokolls P3 übergeben, diese teilt die Nachricht in Pakete und fügt jeweils ihren eigenen Protokollkopf hinzu und übergibt sie an die Sendeprozedur des Protokolls P2, diese fügt wiederum ihren Protokollkopf und die Prüfsumme hinzu und gibt die Teilnachrichten an die Sendeprozedur des Protokolls P0, von der sie zeichenweise übertragen wird.

Vorgänge bei der empfangenden Anwendung:
Die Nachricht wird zeichenweise von der Empfangsprozedur des Protokolls P0 empfangen, die Empfangsfunktion von P2 erkennt ihren Protokollkopf, kontrolliert mittels Prüfsumme auf Fehler und übergibt die Nachrichten ohne Protokollkopf und Prüfsumme an die Empfangsfunktion von P3, die schließlich die paketweise erhaltene Originalnachricht wieder zusammensetzt und bereitstellt.

Der Vorteil dieser "schichtweisen" Verarbeitung ist, daß eine Änderung in einer der Schichten ohne weiteres möglich ist, solange die Schnittstellen zu den anderen Schichten nicht verändert werden müssen. Wenn nun zum Beispiel die unterste Schicht die Übermittlung nicht länger durch eine Datei simulieren sondern über eine Leitung realisieren sollte, so müßte nur das Protokoll P0 der Unit Protokoll entsprechend geändert werden, während die Protokolle P2 und P3 unverändert blieben.
Soll die Fehlererkennung des Protokolls P2 verbessert werden, sind entsprechend P0 und P3 von keinen Änderungen betroffen.

Um Protokolle zur Rechnerkommunikation beschreiben zu können, wurde ein Modell entwickelt, das die Vorgänge der Rechnerkommunikation schichtweise beschreibt. Dieses Basisreferenzmodell namens Open Systems Interconnect (OSI) Reference Model legt einige Fachbegriffe fest, mit denen es vereinfacht wird, verschiedene Protokolle zu vergleichen und Aufgaben von Protokollen zu beschreiben.

Übung
(Folie/Arbeitsblatt OSI123, Seite 104) Ordnen Sie die Protokolle P0, P2 und P3 den einzelnen Schichten des OSI-Basisreferenzmodells zu. Ist eine eindeutige Zuordnung möglich?

Nicht immer lassen sich Protokolle eindeutig zu einer der Schichten des OSI-Basisreferenzmodells zuordnen, da sie einzelne Aufgaben aus mehreren Schichten übernehmen, dafür aber nicht unbedingt alle Anforderungen einer Schicht erfüllen.

Die Bitübertragungsschicht enthält die Vereinbarung über die Verkabelung lokaler Netze. Die unteren zwei Schichten - die Bitübertragungsschicht und die Sicherungsschicht - werden meistens durch direkt in die Hardware integrierte Protokolle realisiert. In lokalen Rechnernetzen wird die Sicherungsschicht zum Beispiel häufig durch das Ethernet-Protokoll CSMA/CD (Carrier Sense Multiple Access with Collision Detect) verwirklicht, das dafür sorgt, daß immer nur ein Rechner Daten auf die Leitung gibt und durch Zufall entstehende Kollisionen entdeckt.

Übung
(Folie ET1124, Seite 99) Vergleichen Sie den Aufbau eines Ethernet-Datenpaketes mit den von Ihnen implementierten Protokollsprachen. Welches Ihrer Protokolle weist die größten Übereinstimmungen auf? Wo liegen Unterschiede?

Ethernet-Adressen sind weltweit eindeutig, da jedem Hersteller der benötigten Hardware, dem Ethernet-Controller, von einer internationalen Normenkommission (IEEE, Institute of Electrical and Electronics Engineers) Nummern zugeteilt werden.

Übung
Wie viele verschiedene und weltweit eindeutige Ethernet-Adressen können theoretisch vergeben werden?

Aufgabe 11
Diese Aufgabe eignet sich auch für ein Schülerreferat.
Lesen Sie den (englischsprachigen) Text RFC1920125.
Beschreiben Sie das Verfahren der Standardisierung von Protokollen für das Internet.
Welche Stadien durchläuft ein Protokoll, bevor es zum erklärten Standard wird?

Das Internet-Protokoll stellt das Fundament aller im Internet verwendeten Protokolle dar, es "ist der Leim, der das Internet zusammenhält"126. Es setzt auf den unteren beiden Schichten, die den Netzzugang regeln, auf und liegt in der Vermittlungsschicht. Alle Daten, die über das Internet laufen, müssen das Internet-Protokoll durchlaufen.
Es erfüllt vor allem die folgenden Aufgaben127:

In der Transportschicht angesiedelt ist zum Beispiel das verbindungsorientierte Transmission Control Protocoll (TCP), das von vielen Anwendungen benutzt wird (Folie TCP128, Seite 101). Es enthält unter anderem Mechanismen, die in Aufgabe 10 schon angedacht worden sein können.
Da die Adressierung auf IP-Ebene nur auf einen Rechner bezogen ist, auf diesem aber mehrere Anwendungen laufen können, die Daten über das Netz transportieren, benötigt man noch einen Adressierungsmechanismus innerhalb eines Rechners. Hierfür werden in TCP sogenannte Portnummern129 für jeden Benutzer (also jede Anwendung, die Transporte über das Netz durchführen läßt) vergeben. Da diese die Länge 16 Bit haben, könnte ein Rechner theoretisch bis zu 65536 Verbindungen aufbauen. Jede Verbindung eines Rechners mit der Außenwelt wird über einen eigenen "Hafen" abgewickelt, in dem die zugehörigen Daten "einlaufen" oder "auslaufen".

Ein verbindungsloses Protokoll der Transportschicht ist das User Datagram Protocol (UDP), das durch den Verzicht auf die aufwendigen Mechanismen zum Verbindungsaufbau und -abbau verzichtet und keinerlei Kontrolle über verlorengegangene Pakete gewährleistet. Daher bietet es sich vor allem für solche Programme an, die nur kurze Nachrichten schicken, die also kaum fragmentiert werden müssen, und die gegebenenfalls ihre Anfrage wiederholen, wenn sie keine Antwort erhalten. UDP bedient sich wie TCP der Portnummern zur Adressierung.

Die Aufgaben der oberen drei Protokollschichten des OSI-Basisreferenzmodells werden im Internet meistens durch die jeweiligen Anwendungen realisiert. Es gibt einige mehr oder weniger standardisierte Protokolle für typische Anwendungen. Dazu gehören zum Beispiel

Diesen Protokollen ist gemeinsam, daß es stets eine Anwendung gibt, die einen Dienst wünscht (also zum Beispiel die Übertragung einer Datei von oder zu einem anderen Rechner) und eine, die allen anderen diesen Dienst anbietet. Die anfragende Anwendung wird dabei als Client ("Kunde") bezeichnet, die anbietende Anwendung als Server ("Bediener").ˆ

7.3.5.6 Programmierung einer Client-Server-Anwendung auf dem Internet

Mit Hilfe des oben beschriebenen Transmission Control Protocol ist es nun möglich, eigene Internet-Anwendungen zu schreiben. Wie schon beschrieben wurde, ist der typische Fall einer solchen Anwendung, daß ein Rechner als Server einen Dienst anbietet, den andere Rechneranwendungen als Clients nutzen. Ein recht einfaches Beispiel hierfür ist eine Anwendung namens Finger. Ein Client stellt eine Verbindung zu einem Server her und übermittelt ihm eine Leerzeile oder den Namen eines Benutzers über den er Informationen wünscht130. Die Antwort des Servers enthält dann einige Auskünfte über die verbundenen Benutzer oder über den Benutzer, nach dem gefragt wurde. Üblicherweise gehört zu diesen Auskünften neben dem Namen im Klartext die Information, ob er zur Zeit mit dem Rechner des Finger-Servers verbunden ist, wann er zuletzt Eingaben auf der Konsole gemacht hat, eventuell auch noch die dienstliche Adresse mit Telefonnummer und eine Auskunft, wann er zuletzt seine elektronische Post gelesen hat.
Der Umfang der Auskünfte kann aber auch verringert werden, so daß zum Beispiel nur die Namen der aktuellen Benutzer ausgegeben werden131. (Folie RUIP, Seite 105)
Da unter TCP und UDP jeweils 65536 Ports zur Verfügung stehen, stellt sich noch die Frage, woher ein Client denn weiß, an welchem Port ihn der Server bedienen will. Dazu sind für die Standarddienste (bzw. Standardprotokolle) des Internet weltweit eindeutige Portnummern festgelegt worden, die jedem Internet-Rechner bekannt sind.

Unter Windows steht eine Schnittstelle namens WinSock132 zur Benutzung (unter anderem) von TCP zur Verfügung, so daß mit einigen wenigen Prozeduren schon eine Verbindung aufgebaut werden kann. Allerdings sind die Bezeichnungen der Prozeduren, Typen und Fehlermeldungen der Socket-Schnittstelle zum Teil etwas kryptisch. Es kostet zunächst einigen Aufwand, um eine Verbindung einzurichten, unter anderem sind Umwandlungen zwischen verschiedenen Notationen für Portnummern oder Adressen notwendig. Daher steht die kleine Unit Sockets zur Verfügung, die wiederum eine Schnittstelle zur Winsock darstellt (Arbeitsblatt SO, Seite 106). Sie übernimmt kleine Umwandlungen von Daten in verschiedene Formate und stellt Prozeduren, Funktionen und Typen mit verständlichen Namen zur Verfügung. Im Sinne der didaktischen Reduktion verringert sie die Schwierigkeiten für Schülerinnen und Schüler, indem sie komfortable Prozeduren und Funktionen für den Verbindungsaufbau, den Verbindungsabbau, das Senden und Empfangen von Texten, die Einrichtung und die Bindung von Sockets zur Verfügung stellt133.

Ein Socket enthält die notwendigen Informationen über eine Verbindung134 zu einem anderen Rechner. Um einen Socket zu verwenden, muß man ihn zunächst als neuen ("leeren") Socket erzeugen lassen. Ein Client muß außerdem die Adresse des anderen Rechners (Hosts) zum Beispiel mit SucheHost feststellen sowie eine Portnummer festlegen. Will man einen Standarddienst benutzen, kann man dessen Portnummer durch einen Aufruf von SucheServicePortnummer ermitteln. Dann kann man eine Verbindung aufbauen und so lange Daten schreiben und lesen, bis die Verbindung wieder abgebaut werden soll.

Aufgabe 12
Formulieren Sie ein Programm, mit dem Informationen über beliebige Benutzer an beliebigen Rechnern eingeholt werden können.
Implementieren Sie Ihren Finger-Client und testen ihn mit verschiedenen Rechnernamen135.

Etwas anspruchsvoller gestaltet sich die Programmierung eines Finger-Servers, weil für diesen eine asynchrone Bearbeitung der am Socket eingehenden Nachrichten implementiert werden muß. Hierfür benötigt man Fensterbotschaften. Haben die Schülerinnen und Schüler keine Erfahrung im Umgang mit Fensterbotschaften unter Windows, kann zur Vereinfachung kann die Datei WinsockM.inc136 eingebunden werden, in der deren Verwaltung geschieht.

Damit sollte die folgende Aufgabe für alle Schülerinnen und Schüler lösbar sein.

Aufgabe 13
Analysieren Sie das Programm in der Datei "auf13.pas".
Welche Schritte müssen nacheinander ausgeführt werden, um einen Finger-Server einzurichten?

Alternativ kann können die Grundlagen für ein solches Programm auch im Unterrichtsgespräch behandelt und teilweise erarbeitet werden.

In der Unterrichtsreihe wurden Grundlagen von Protokollsprachen erarbeitet und die wichtigsten Internet-Protokolle vorgestellt. Außerdem wurde schon ein Client für einen Standarddienst (Finger) implementiert.
Durch die Kenntnis dieser Vorgänge beim Senden und Empfangen von Nachrichten kann man Aussagen über die Sicherheit der Daten im Netz treffen.

Aufgabe 14
Kann sich ein Anwender im Internet mit Sicherheit darauf verlassen, daß die Daten, die er erhält, auch so von dem Absender abgeschickt wurden?
Wer kann über das Internet versendete Daten empfangen?
Beurteilen Sie den Finger-Dienst unter dem Aspekt des Datenschutzes!
ˆ


Fußnoten:
116 Vgl. [KROL95], S. 29.
117 Vgl. [SANT90], S. 12.
118 Vgl. [DUD93], S. 292f.
119 Die Compileroption {$F+} erzwingt unter Turbo Pascal für Windows die Verwendung von FAR-Aufrufen für Prozeduren und Funktionen. Ein solcher wird benötigt, wenn - wie hier - eine Prozedurvariable übergeben werden soll.
120 Hier gibt es noch weitere Analogien zum Internet (möglicherweise nehmen die Pakete verschiedene Routen, einzelne Pakete kommen später an als früher gesendete, vgl. [KROL95] S. 29), die hier noch nicht thematisiert werden sollten.
121 Vgl. [HUNT95], S. 13 und [SANT90], S. 13f.
122 Da P2 eine Erweiterung von P1 ist, wird P1 im folgenden nicht mehr betrachtet.
123 Vgl. [SANT90] und [HUNT95].
124 Vgl. [SANT90], S. 58
125 [RFC1920], Kapitel 1 und 4.
126 [HUNT95], S. 12
127 Vgl. [HUNT95], S. 12f.
128 Vgl. [SANT90], S. 38ff.
129 Port bedeutet im Englischen so viel wie Hafen
130 Bei der Implementierung ist wichtig, daß alle Eingaben an den Server mit CRLF (char(13)+char(10)) abgeschlossen werden.
131 Vgl. [RFC1288]
132 WinSock wird von Windows Socket abgeleitet. Socket bedeutet soviel wie Sockel.
133 Dabei ist aber gewährleistet, daß nach wie vor alle charakteristischen Aufgaben beim Erstellen einer Verbindung durchgeführt werden müssen.
134 Ein Socket ist sogar mehr - mit Sockets kann man z. B. auch verbindungslose Protokolle wie UDP verwenden.
135 Hat man einen Finger-Server eingerichtet (z. B. fingserv.exe), können hier die Namen der Rechner im lokalen Schulnetz verwendet werden. Es sollten aber auch andere Rechner (z. B. von Universitäten und Firmen) ange"finger"t werden.
136 In der Datei befinden sich ein paar wichtige Hinweise zur Gestaltung der einbindenden Datei.


ˆ Seitenanfang i Inhaltsverzeichnis < Kapitel 6 > Kapitel 8 L Literaturverzeichnis M Materialien © Copyright