Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme

4.4.3 Verbindungsauf- und -abbau

Dreiwege-Handschlag

TCP benutzt ein Verfahren namens Dreiwege-Handschlag (Three-Way Handshake), um zwischen zwei Anwendungen eine Verbindung aufzubauen, und es benutzt das gleiche Verfahren, um diese Verbindung später wieder abzubauen. Mit einem Dreiwege-Handschlag wird in drei Kommunikationsschritten eine wechselseitige Bekanntgabe zwischen zwei Kommunikationspartnern durchgeführt. Das Verfahren wird in vielen Netzwerkprotokollen eingesetzt und in den nächsten beiden Absätzen am Beispiel von TCP verdeutlicht. Bei den zugehörigen Segmentübertragungen wird davon ausgegangen, dass sie fehlerfrei erfolgen.

Verbindungsaufbau

Die Kommunikation zwischen zwei TCP-Stationen beginnt mit einem Dreiwege-Handschlag. Eine Station, die mit einem Partner eine TCP-Verbindung eingehen möchte, sendet diesem ein Segment mit gesetztem SYN-Flag und ohne Anwendungsdaten. Das ist der erste Schritt des Handschlags. Ist der Partner willens und in der Lage, eine TCP-Verbindung mit der sendenden Station einzugehen, dann sendet er, und das ist der zweite Schritt des Handschlags, ein Segment ohne Anwendungsdaten zurück, mit dem er das SYN-Segment bestätigt, und mit dem er seinerseits durch Setzen des SYN-Flags seine Bereitschaft zum Verbindungsaufbau erklärt. Als letzten Schritt des Handschlags bestätigt der Empfänger dieses SYN-Segment. Als Nebeneffekt dieser drei Kommunikationsschritte werden die beiden zufällig gewählten Anfangssequenznummern ausgetauscht. Das folgende Beispiel zeigt das Vorgehen:

Angenommen, von zwei TCP-Stationen A und B hat die Station A ihre Anfangssequenznummer isnA als 66 festgelegt und die Station B isnB mit 1112. Weiter angenommen, A will eine TCP-Verbindung zu B aufbauen, dann eröffnet A die Kommunikation, indem die Station das folgende Segment an B sendet:

A -> B [ SYN, seq=66, no data ]

In dem Beispiel soll die TCP-Station B in den Aufbau einer TCP-Verbindung mit A einwilligen und antwortet mit:

B -> A [ ACK, ack=67, SYN, seq=1112, no data ]

Daraufhin bestätigt die Station A den Erhalt des SYN-Segments von B mit:

A -> B [ ACK, ack=1113, seq=67, no data ]

In diesem dritten Segment könnten bereits Anwendungsdaten von A an B mit übertragen werden. Nach dem Verbindungsaufbau wissen beide TCP-Stationen, mit welcher Sequenznummer der jeweilige Partner bei der Zählung seiner Anwendungsdatenbytes beginnen wird.

Verbindungsabbau

Auch der Abbau einer TCP-Verbindung zwischen zwei TCP-Stationen erfolgt mit einem Dreiwege-Handschlag. Die Station, die eine Verbindung abbauen möchte, sendet ihrem Partner ein Segment mit gesetztem FIN-Flag und ohne Anwendungsdaten. Allerdings muss dabei eine häufig auftretende Situation berücksichtigt werden. Bei dieser hat einer der beiden Kommunikationspartner die Daten, die für den anderen vorgesehen waren, bereits vollständig übertragen und möchte die Verbindung abbauen. Der Partner jedoch kann in diesen Abbauwunsch nicht einwilligen, weil er mit der Übermittlung seiner Daten noch nicht fertig ist. Um solchen Situationen gerecht zu werden, sieht TCP ein sogenanntes Halbschließen (Half Close) einer Verbindung vor. Realisiert wird dies im zweiten Schritt des Handschlags durch eine Trennung von Bestätigung des FIN-Segments des Partners und Setzen des FIN-Flags im Antwortsegment in zwei Segmente. Jetzt kann das Segment mit dem FIN-Flag solange zurückgehalten werden, bis alle Anwendungsdaten übertragen sind. Die folgenden beiden Beispiele sollen diesen Sachverhalt veranschaulichen.

Zunächst soll die folgende Situation betrachtet werden, bei der kein Halbschließen auftritt:

Die Betrachtung des Segmentaustauschs soll damit beginnen, dass die Station A ihre letzten Anwendungsdatenbytes überträgt:

A -> B [ seq=86, 5 bytes data ]

Die Station B bestätigt den Erhalt der Daten:

B -> A [ ACK, ack=91, seq=1113, no data ]

A hat jetzt für B keine Daten mehr und möchte die Verbindung abbauen. Das ist der erste Schritt des Dreiwege-Handschlags:

A -> B [ FIN, seq=91, no data ]

B bestätigt den Erhalt des FIN-Segments und ist bereit, ihrerseits die Verbindung abzubauen. Man beachte, dass hier als zweiter Schritt des Handschlags zwei Segmente direkt nacheinander gesendet werden:

B -> A [ ACK, ack=92, seq=1113, no data ] B -> A [ FIN, seq=1113, no data ]

A bestätigt den Erhalt des FIN-Segments:

A -> B [ ACK, ack=1114, no data ]

Jetzt ist die TCP-Verbindung zwischen den TCP-Stationen A und B auf beiden Seiten abgebaut. Dieses Beispiel ohne Halbschließen einer TCP-Verbindung zeigt auch, dass der Austausch von Segmenten zwischen zwei TCP-Stationen keineswegs strikt alternierend erfolgen muss.

Als Nächstes soll eine Situation beschrieben werden, bei der ein Halbschließen einer TCP-Verbindung erforderlich ist:

Beschrieben wird ein Segmentaustausch, der damit beginnt, dass die Station A die gerade von B erhaltenen Bytes bestätigt und mit dieser Bestätigung ihre letzten fünf Bytes an Anwendungsdaten überträgt (während B noch 14 Bytes für A hat):

A -> B [ ACK, ack=1066, seq=86, 5 bytes data ]

B bestätigt den Erhalt dieser Daten und sendet ihrerseits fünf ihrer restlichen Anwendungsdatenbytes (und hat dann noch neun):

B -> A [ ACK, ack=91, seq=1066, 5 bytes data ]

A bestätigt den Erhalt der Daten, hat selbst aber keine Daten mehr für B und möchte als ersten Schritt des Handschlags die Verbindung abbauen. In diesem Segment dürfen keine Anwendungsdaten übertragen werden:

A -> B [ ACK, ack=1071, FIN, seq=91, no data ]

Die Station B bestätigt den Erhalt des FIN-Segments, kann selbst jedoch noch kein FIN-Flag setzen, weil noch neun Datenbytes für A zu übertragen sind. Von diesen sendet B vier Bytes zusammen mit der Bestätigung. Das ist der erste Teilschritt des zweiten Schritts des Handschlags:

B -> A [ ACK, ack=92, seq=1071, 4 bytes data ]

A bestätigt den Erhalt der Daten, wobei ab hier ihre Sequenznummer keine Rolle mehr spielt:

A -> B [ ACK, ack=1075, no data ]

Die Station B braucht nichts zu bestätigen und sendet ihre letzten fünf Bytes an Anwendungsdaten:

B -> A [ seq=1075, 5 bytes data ]

A bestätigt den Erhalt dieser Daten:

A -> B [ ACK, ack=1080, no data ]

B beendet jetzt das Halbschließen und damit den zweiten Schritt des Handschlags mit dem Senden eines FIN-Segments:

B -> A [ FIN, seq=1080, no data ]

Die Station A bestätigt als dritten Schritt des Handschlags das FIN-Segment von B:

A -> B [ ACK, ack=1081, no data ]

Jetzt ist die TCP-Verbindung auf beiden Seiten abgebaut.



Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme