Rechnernetze
Home Nach oben

Beispiel einer Implementierung der Transportschicht

Um ein Protokoll nach dem ISO/OSI-Basisreferenzmodell zu implementieren, verwendet man in der Regel eine geeignete höhere Programmiersprache, welche u.a. die Implementierung paralleler Prozesse gestattet. Diese werden verwendet, um die einzelnen Verbindungen quasi-unabhängig zu bedienen, um Timer zu implementieren und für weitere Managementfunktionen. Die Prozesse interagieren in der Regel über Warteschlangen oder Mailboxen, über welche Ereigniskontrollblöcke (ECB=event control block) ausgetauscht werden. Diese enthalten die für die Kommunikation notwendige Information, z.B. in Form eines Datensatzes (gegebenenfalls mit tagged field, wie in C möglich).

TRANSPORTECB.WMF (8740 Byte)

Die lokalen Schichten enthalten in ihren Daten nur die Zeiger (pointer) auf diese Datensätze; sollen Protokolldatenelemente (PDU=protocol data unit) ausgetauscht werden, so werden die Zeiger in die entsprechenden Warteschlangen eingefügt. Der angesprochene Prozess, der regelmäßig seine Eingangswarteschlangen abfragt, verwendet diesen Zeiger als Referenz auf den ECB und führt die geforderten Aktionen aus.

Wird mehr als eine Verbindung verwaltet, so werden üblicherweise für jede Verbindung eigene Warteschlangen erzeugt. Das erleichtert die Verwaltung dieser Warteschlangen beträchtlich (z.B. bei Vorrangdaten); allerdings wird dadurch auch die Verwendung paralleler Prozesse (von denen jetzt beliebig viele instanziert werden müssen) erzwungen. Dieses erfordert einige Unterstützung durch das Laufzeitsystem; eine Programmiersprache, die zu diesem Zweck entwickelt wurde, ist CHILL (CCITT High-Level Language).

Die Benutzerdaten, die in einem Protokolldatenelement übergeben werden, werden durch den Zeiger UDBPointer (UDB=user date block) referenziert. Die Länge dieses Blocks steht in dem Feld UDPlength. Zum Senden wird eine Protokoll-Kontrollinformation (PCI=protocol control information) erzeugt; diese wird den Benutzerdaten vorangestellt. Da jede Schicht eine PCI erzeugt, wird der eigentlich zu übertragende Datenblock immer länger (siehe nächstes Bild).

Umgekehrt muß durch eine empfangende PDU jeweils diese PCI wieder entfernt werden. Dieses geschieht schichtenweise. Eine Schicht, die eine solche PDU ausgepackt hat, sendet sie weiter an die übergeordnete Schicht, wobei sich der Adressat (bei mehreren Verbindungen) aus der entfernten PCI ergibt.

PCI-DATEN.WMF (20538 Byte)

Die ECBs würden in einer Programmiersprache wie Pascal auf dem Heap angelegt werden. In anderen Programmiersprachen könnte man sich vorstellen, dass zunächst eine Menge von ECBs erzeugt wird, welche dann entweder in einer Freispeicherliste eingehängt sind, oder von den einzelnen Instanzen verwendet werden.

Die Prozesse, die eine Verbindung verwalten, realisieren im wesentlichen eine Schleife, die einen Zustand und ein eintreffendes Ereignis (abhängig von dessen Typ) auf eine Folge von Aktionen abbilden. Diese können noch von einem Prädikat abhängen.

TCP-PROCESS.WMF (3408 Byte)

Wir gehen hier davon aus, dass ein Prozess, der eine bestimmte Verbindung bearbeitet, erzeugt (instanziert) und wieder gelöscht wird, sobald die Verbindung geschlossen wird, d.h. der Zustand CLOSED angenommen wird. Dazu ist es notwendig, dass jeder Schicht ein Prozess zugeordnet ist, der auf Anforderung neue Prozesse dieser Schicht erzeugt. Dieser sind zugleich bestimmte Warteschlangen zugeordnet, über die mit diesen Prozessen kommuniziert werden kann.