Universität Karlsruhe Fakultät für Informatik Universität Karlsruhe

Proseminar Rechnerkommunikation und Telefon

TCP und UDP

Holger Junker

Inhaltsverzeichnis

        1. Grundlegendes zur Datenkommunikation
                1.1 Kommunikation zwischen Rechnern
                1.2 Adressierung
                1.3 Ports
        2. TCP
                2.1 Grundlegende Eigenschaften
                2.2 Stream-Datenpakete
                2.3 Virtuelle Verbindung
                2.4 Full-duplex-Datentransfer
                2.5 Gepufferte Datenübertragung
                2.6 Multiplexing
        3. Verlässlichkeit
                3.1 Acknowledgement
                3.2 Timer, Neusendung
                3.3 Das gleitende Fenster zur Flußsteuerung
        4. TCP-Verbindung
                4.1 Verbindungsaufbau
                4.2 Verbindungsabbau
        5. TCP Header
        6. UDP
                6.1 Grundlegende Eigenschaften
                6.2 Datagramme
                6.3 Verbindungslosigkeit
                6.4 Verläslichkeit
        7. UDP Header
        8. Zusammenfassung
        Literatur

1. Grundlegendes zur Datenkommunikation

1.1 Kommunikation zwischen Rechnern

Grundlage von Netzwerken ist die Kommunikation zwischen Rechnern, also der Austausch von Daten. Um die Vorgänge bei der Datenkommunikation zu verdeutlichen betrachtet man das sogenannte Schichtenmodell, wie es in der unteren Grafik dargestellt ist. Dabei unterscheidet man zwischen der Applikationsschicht, den beiden Protokollschichten TCP/UDP und IP und der physikalischen Schicht (z.B. Ethernet, Point-To-Point-Line). Da große Unterschiede in der Umsetzung der Schichten bestehen können wird durch die Protokolle lediglich beschrieben, auf welche Art und Weise der Datenaustausch von Statten geht. Netzwerkprotokolle sind daher keine eigenständigen Programme, sondern vielmehr Bibliotheken von Diensten, die von anderen Schichten in Anspruch genommen werden können. Das Prinzip der Einteilung in Schichten ist sehr sinnvoll, da sonst jede Applikation alle benötigten Dienste selbst implementieren müsste. Die wichtigsten und bekanntesten Dienste der im folgenden betrachteten TCP/UDP-Schicht sind FTP, Telnet, Mail oder Network File Systems.


Abb. 1: Schichtenmodell der Rechnerkommunikation

1.2 Adressierung

Die Adressierung von Rechnern innerhalb des Internet erfolgt mittels der sogenannten IP-Adresse. Diese besteht aus einer 32bit Zahl, die getrennt in 4x8bit (sogenannten Oktets) als dreistellige, vorzeichenlose Dezimalzahlen dargestellt wird. Durch diese Adresse wird jeder Rechner innerhalb des Internet eindeutig identifiziert.

1.3 Ports

Bei heutigen Betriebssystemen handelt es sich meist um Multitasking-Betriebssysteme. Es laufen also auf einem Rechner mehrere Prozesse gleichzeitig, die auch gleichzeitig und separat angesprochen werden sollen. Daher findet Datenkommunikation aber nicht zwischen Rechnern, sondern genauer zwischen einzelnen Prozessen statt. Es ist daher notwendig, nicht nur Rechner im Internet eindeutig zu identifizieren sondern auch die einzelnen Prozesse auf diesen Rechnern. Dieses erfolgt durch die sogenannte Portnummer. Dabei handelt es sich um eine 16bit Zahl dargestellt als Integerzahl. Bei den Portnummern unterscheidet man zwischen zwei Arten. Die global festgelegten oder konventionellen Portnummern reichen von 0-49150. Jeder dieser Zahlen ist genau eine Higher-Level-Applikation zugeordnet. Die dynamisch vergebenen Portnummern von 49151-65535 werden wie der Name sagt während der Laufzeit vergeben. Dies bietet Vorteile wie z.B. Erweiterbarkeit. Durch die IP und den Port, die gemeinsam den sogenannten Socket bilden, wird jeder Prozess auf einem Rechner der dem Internet angeschlossen ist eindeutig identifiziert. Eine schematische Darstellung der Ports mit einigen Beispielen ist in der folgenden Grafik dargestellt.


Abb. 2: Spektrum der Port-Nummern und wichtige Ports

2. TCP

2.1 Grundlegende Eigenschaften

TCP bedeutet Transmission Control Protocol. Es wurde 1981 spezifiziert in STD-7/RFC-793. Neuerungen, Erweiterungen und Bugfixes sind festgehalten in den RFCs 1323 und 1122. Ziel bei der Spezifikation dieses Transportprotokolls war es, auf Basis des unzuverlässigen Internet-Protocol (IP) eine verlässliche Datenkommunikation zu gewährleisten.

2.2 Stream-Datenpakete

Die Datenübertragung erfolgt in einem sogenannten Stream. Dieser besteht aus Sequenzen von 8bit, also einem Byte, auch Oktet genannt. Die Größe des übertragenen Streams ist nicht garantiert. Es besteht sowohl die Möglichkeit der Bündelung von Daten als auch die der Aufteilung. Beliebige Paketgrößen sind bei der Übertragung nicht möglich. So gibt es beispielsweise eine obere Schranke für die Paketgröße, genannt Maximum Transmission Unit (MTU). Das theoretische Maximum dieser MTU liegt bei 64 kByte. Ein üblicher Wert ist allerdings 1,5 kByte. Auf Applikationsebene erscheint der TCP-Stream wie eine flat-line. Es ist also auf dieser Ebene nicht möglich zu rekonstruieren, wie die Daten übertragen wurden, also ob z.B. eine Aufteilung stattgefunden hat.

2.3 Virtuelle Verbindung

Die Verbindung zwischen zwei Prozessen wird als virtuell bezeichnet, weil sie wie eine feste, unmittelbare physikalische Verbindung erscheint. In Wirklichkeit besteht aber gar keine direkte Verbindung zwischen den beiden Prozessen. Zu Begin des Datenaustauschs ist es notwendig, die Verbindung aufzubauen. Dazu müssen beide Rechner der Verbindung zustimmen. Dies wird später noch ausführlich beschrieben werden.

2.4 Full-duplex-Datentransfer

Beim TCP-Datentransfer findet das Senden und Empfangen der Daten in der Form statt, als ob zwei separate Verbindungen verwendet würden. In Wirklichkeit erfolgt dies aber über eine Verbindung. TCP verwendet ausserdem das Huckepack-Prinzip. Wird ein Datenpaket in eine Richtung verschickt so enthält es auch Informationen zur Überwachung des Datenverkehrs in die umgekehrte Richtung.

2.5 Gepufferte Datenübertragung

Die Daten werden vom TCP nicht direkt übermittelt, sondern durchlaufen einen Puffer. Daraus erfolgt eine sinnvolle Größeneinteilung der Pakete und somit ein effizienter Datentransfer. Ob nun eine Fragmentierung oder ein Zusammenfassen der Daten erfolgt hängt von vielen Dingen ab, wie z. B. vom Datenverkehr (traffic), von Router-Algorithmen oder zufälligen Fehlern. Besteht die Notwendigkeit Daten unmittelbar zu übertragen wie z. B. bei Durchführung eines remote login oder ssh erfolgt dies mittels des sogenannten Push-Befehls. Alle Daten die gepusht werden, werden unmittelbar übertragen und haben höhere Priorität als gewöhnliche Daten. Erst wenn alle Daten die mit dem Push-flag versehen sind übertragen wurden, wird der reguläre Datentransfer fortgesetzt.

2.6 Multiplexing

TCP ist multiplexingfähig. Es besteht also die Möglichkeit, dass mehrere Hosts gleichzeitig jeweils eine Verbindung zu ein und dem selben Server an ein und dem selben Port betreiben. Hierbei dient der Socket des jeweiligen Rechners und der Header der Pakete zur eindeutigen Zuordnung auf Serverseite.

3. Verlässlichkeit

Eine der Hauptaufgaben des TCP ist es, auf einer unzuverlässigen Basis (nämlich dem Internet) eine zuverlässige Kommunikation zwischen zwei Endprozessen zu gewährleisten.

3.1 Acknowledgement

Diese Zuverlässigkeit wird gewährleistet durch das sogenannte Acknowledgement (ACK). Hierzu wird die Sequence-Number (SEQ) verwendet. Für beide Richtungen der Datenkommunikation wird beim Verbindungsaufbau eine Anfangs-SEQ-Nummer vergeben. Mit dieser Nummer werden nun byteweise die übertragenen Daten durchnummeriert. Die SEQ-Nummer bestimmt also eindeutig die Position des jeweiligen Byte im Stream. Die ACK-Nummer wird nun verwendet, um für erhaltene Datenpakete eine Empfangsbestätigung an den Absender zurückzusenden. Dabei bezieht sich das gesendete ACK immer auf das nächste Byte, was erwartet wird. Das Byte mit der SEQ-Nummer i wird also mit der ACK-Nummer i+1 bestätigt. Es werden stets nur solche Byte bestätigt, bis zu denen alle Byte erhalten wurden. Geht der Vorgänger eines Byte verloren kann das nachfolgende Byte nicht bestätigt werden, bis der Vorgänger empfangen wurde. Weiter ist hier von Vorteil, dass es keine Auswirkungen hat, wenn einzelne ACK-Sendungen verloren gehen. Schließlich wird das verlorenen ACK durch einen bestätigten Nachfolger mitbestätigt. Das ACK gewährleistet also eine fehlerfreie und vollständige Datentransmission unter Beibehaltung der korrekten Reihenfolge der Daten im Stream. Es besteht die Möglichkeit der Autokorrektur bzw. einer Benachrichtigung des anderen Prozesses, falls keine Korrektur möglich ist.


Abb. 3: Das gleitende Fenster und Acknowledgement

3.2 Timer, Neusendung

Zur Überwachung des Datenverkehrs werden im TCP verschiedene Timer eingesetzt. Der retransmission-timer legt fest, nach welcher Zeitspanne die Neusendung eines Datenpakets stattfindet, für das keine Empfangsbestätigung eingegangen ist. Der quiet-timer dient dazu, den Empfang von Paketen zu gewährleisten, die nach dem eigentlichen Verbindungsende empfangen werden. Hierdurch wird also den "Nachzüglern" die Möglichkeit gegeben, doch noch vom Zielprozess empfangen zu werden. Diese beiden Timer werden berechnet nach dem TimeToLive-Wert, welcher bestimmt, wieviel Zeit einem Datenpaket gegeben wird, um sein Ziel zu erreichen und bestätigt zu werden. Ein weiterer Timer ist der sogenannte persistence-timer. Dieser sorgt dafür, dass während einer Fenstergröße von 0 die Aufforderung zum Weitersenden nicht verloren geht. So wird nach Ablauf des persistence-timers eine 1 Byte Sendung zur Kontrolle der Verbindung gesendet. Der keep-alive-timer gewährleistet, dass eine Verbindung nicht unterbrochen wird wenn kurze Zeit keine Daten übermittelt werden. Schließlich existiert noch der idle-timer, nach dessen Ablauf die Verbindung als unterbrochen gilt, falls keine Antwort der Gegenseite während dieser Zeit eingegangen ist.

3.3 Das gleitende Fenster zur Flußsteuerung

Das Acknowledgement gewährleistet mit den verschiedenen Timern eine zuverlässige Datenübertragung. Jedoch wäre es sehr ineffizient, ein einzelnes Paket zu senden und dann jedes Mal auf eine Bestätigung zu warten, bis das nächste gesendet wird. Daher verwendet man im TCP das sogenannte gleitende Fenster welches festlegt, wie viele Daten auf einmal übertragen werden. Bei jedem übertragenen Paket erfolgt ein sogenanntes window-advertisement. Hierdurch erfolgt eine ständige, automatische Anpassung an die Fähgkeiten des Netzwerks und auch verschieden starke Rechner können miteinander kommunizieren. Das Datenvolumen, das sich noch im Puffer des Empfängers befindet wird vom window abgezogen, um den Empfänger nicht zu überlasten. Das Fenster wird um so viele Byte weiter nach rechts bewegt, wie sie bestätigt wurden. Das Byte ganz links im Fenster ist also das älteste Byte für das noch keine Bestätigung vorliegt.


Abb. 4: Das gleitende Fenster

4. TCP-Verbindung

4.1 Verbindungsaufbau

Der Datentransfer im TCP ist verbindungsorientiert. Bevor der eigentliche Datenverkehr stattfinden kann wird also eine Verbindung hergestellt, wobei beide Seiten der Verbindung zustimmen müssen. Dabei wird unter anderem die Größe der Datenpakete ausgehandelt. Dies geschieht durch den Drei-Wege-Handschlag. Damit eine Verbindung hergestellt werden kann, muss beim Server ein Prozeß am Zielport "lauschen". Auf dem Client läuft eine Applikation, die dessen TCP-Schicht mitteilt, dass sie eine Verbindung aufbauen soll. Die TCP-Schicht sendet nun ein Datenpaket an den Server in dem sie ihm eine Anfangs-SEQ-Nummer mitteilt (SEQ=i). Auf Serverseite teilt dessen TCP-Schicht dies der Applikation mit die diesen Prozeß überwacht. Ist diese mit der Verbindung einverstanden sendet sie eine Bestätigung (ACK) der erhaltenen SEQ-Nummer und vergibt seinerseits ebenfalls eine Start-SEQ-Nummer (SEQ=j, ACK=i+1). Diese werden zurück an den Client gesendet. Der Client wiederum bestätigt die erhaltene SEQ-Nummer mit einer Sendung an den Server (ACK=j+1) und teilt der Applikationsschicht mit, dass die Verbindung aufgebaut ist. Der Client führt einen sogenannten active-open-Vorgang aus; das Äquivalent auf Serverseite nennt man passive-open. Die beiden Sequenznummern i und j werden dabei zufällig ausgewählt und liegen zwischen 0 und 2^32.

Hier wird das beim TCP verwendete Huckepack-Prinzip deutlich. Bei Senden von Daten in die eine Richtung werden Informationen zur Kontrolle des Datentransfers in die andere Richtung mitgesendet.


Abb. 5: Verbindungsaufbau im TCP

4.2 Verbindungsabbau

Ist der Datentransfer abgeschlossen wird die Verbindung beendet um Ressourcen zu sparen. Der reguläre Verbindungsabbau ist dem Drei-Wege-Handschlag des Verbindungsaufbaus sehr ähnlich und ist in der untenstehenden Abbildung dargestellt. Der Rechner, der die Verbindung beenden möchte, sendet ein Datenpaket mit dem Finalize-Flag (FIN) unter Angabe der SEQ-Nummer. Der andere Rechner bestätigt diese SEQ-Nummer und sendet seinerseits die SEQ-Nummer zusammen mit dem gesetzten FIN-Flag. Der Rechner, der anfangs die Verbindung beenden wollte, sendet nun noch eine Bestätigung der erhaltenen SEQ-Nummer. Sendet eine Seite ein FIN-Flag und erhält keine Bestätigung innerhalb des doppelten der maximalen Lebenszeit eines Pakets, wird die Verbindung ebenfalls als beendet betrachtet. Auf der anderen Seite wird die Verbindung dann dadurch beendet, dass der idle-timer abläuft.

Des weiteren besteht die Möglichkeit, eine bestehende Verbindung unmittelbar zu beenden ohne den Drei-Wege-Handschlag. Dies geschieht durch Sendung eines Datenpakets mit einem gesetzten Reset-Flag (RST). Wird eine Verbindung auf diese Weise beendet findet kein weiterer Darantransfer statt.

Eine Verbindung wird auch beendet, wenn nach einer bestimmten Zeit keine Daten mehr gesendet wurden um Ressourcen zu sparen.


Abb. 6: Verbindungsabbau im TCP

5. TCP Header

Ein Datenpaket nennt man auch Segment. Jedes Segment besteht aus einem Kopf (Header) und dem Datenpaket, das es von der darüberliegenden Schicht erhält. Dieses Datenpaket aus der darüberliegenden Schicht enthält seinerseits den eigentlichen zu übertragenden Datenteil und Header der darüberliegenden Schichten. Datensegment und Header bilden jeweils die sogenannte Protocol Data Unit (PDU). Die Größe einer solchen PDU ist beschränkt auf 65535 Byte und darf ausserdem die Maximum Transmission Unit des Netzes nicht überschreiten. Der TCP Header, der eine Größe von 20 Byte hat ist in Abbildung 7 dargestellt. Im Feld Quell- und Zielport werden jeweils die 16bit Zahlen eingatragen, die die Ports der beiden Rechner identifizieren. Die Sequenz-Nummer dient wie bereits behandelt zur Bestimmung der Position der gesendeten Daten im Stream. Außerdem wird aus ihr die ACK-Nummer bestimmt. Diese Acknowledgement-Nummer ist Inhalt des nächsten Feldes. Sie dient zur Bestätigung der erhaltenen Bytes. Die Headerlänge beschreibt wieviele Vielfache von 32bit-Wörtern die Länge des Headers beträgt. Das nächste Feld mit einer Länge von 6bit ist reserviert für zukünftige Erweiterungen. Als nächstes folgen die Code-Bits (auch Flags genannt), die die Art der übertragenen Daten kennzeichnen: URG=Urgent: Dringende Daten die unmittelbar übermittelt werden, ACK=Acknowledgement: Bestätigung eines empfangenen Datenpakets, PSH=Push: Der Puffer wird geleert und die Daten werden unmittelbar übertragen, RST=Reset: Sofortiges Beenden der Verbindung, SYN=Synchronize: Zuteilen einer Sequenz-Nummer beim Verbindungsaufbau, FIN=Finalize: Zeigt die reguläre Beendigung einer Verbindung an.

Nun folgt das Fenster, welches beschreibt, wieviele Daten auf einmal übertragen werden können. Die Prüfsumme dient zur Kontrolle der Korrektheit der Datenübermittlung. Die Berechnung der Prüfsumme ist gleich der beim UDP und wird dort noch beschrieben werden. Der urgent-pointer bewirkt den Sprung auf ein bestimmtes Oktet im Bytestream. Schließlich folgt dann der Block mit den eigentlich zu übertragenden Daten. Eine Neuerung zum ursprünglichen TCP ist die der window-scale-size. Bei sehr hohen Bandbreiten kann das 16bit-Fenster unter Umständen zu klein sein. Daher besteht die Möglichkeit das Fenster um bis zu 16bit nach links zu shiften. So wird eine maximale Fenstergröße von 2^32Byte möglich.


Abb. 7: Der TCP-Header

Wie auch beim UDP wird beim TCP ein zweiter Header verwendet, nämlich der sogenannte Pseudo-Header. Dieser erfüllt verschiedene Funktionen. In ihm werden einige Verbindungsinformationen gespeichert. Da der Pseudoheader auch in die Prüfsumme einbezogen wird, erfolgt hierdurch auch eine zusätzliche Kontrolle der Datenkommunikation. Ausserdem wird der Header an die IP-Schicht übergeben und von dieser komplettiert bzw. werden von der IP-Schicht Informationen übernommen. Dies ist zwar ein Bruch mit dem Schichtenkonzept, wo alle Schichten eigenständig arbeiten, aufgrund der Effizienz wird dies aber hingenommen. Der Pseudoheader enthält die Quell- und Ziel-IP, das verwendete Protokoll und die Segmentlänge.


Abb. 8: Der Pseudo-Header

6. UDP

6.1 Grundlegende Eigenschaften

UDP bedeutet User Datagram Protocol und beschreibt ein minimalistisches Transportprotokoll, das lediglich grundlegende Funktionen zum Datentransport bereitstellt. Es wurde 1980 spezifiziert im RFC 768.

6.2 Datagramme

Genau wie das IP werden die zu transportierenden Daten in Paketform verschickt, die hier Datagramme genannt werden.

6.3 Verbindungslosigkeit

UDP arbeitet aufgrund des angestrebten Minimalismus nicht mit einer ständigen, beidseitigen Verbindung. So entfallen beispielsweise sowohl der Verbindungsauf und -abbau als auch die Bestätigung der empfangenen Pakete.

6.4 Verläslichkeit

Beim User Datagram Protocol ist zur Kontrolle des Datenverkehrs lediglich eine Prüfsumme vorgesehen, die dazu noch optional ist. Alle anderen Mechanismen zur Fehlerbehebung, wie sie bei TCP existieren, gibt es hier nicht. Daher ist der Verlust, die Duplizierung und Fehler in der Reihenfolge der zu sendenden Daten möglich. All diese möglichen Fehler müssen dann auf Applikationsebene behandelt werden.

Die Prüfsumme wird wie beim TCP gebildet, in dem die Summe der 1'er-Komplemente aller 16bit-Wörter des Datenbereichs inklusive des Pseudoheaders berechnet wird. Von dieser Summe wird dann das 1'er-Komplement als Prüfsumme eingesetzt. Da der Pseudoheader in die Berechnung einbezogen wird ist sichergestellt, dass die korrekte Zieladresse angesprochen wird. Um auf Empfängerseite die Korrektheit des gesendeten Datagramms zu überprüfen addiert man die Summer aller 16bit-Wörter auf die empfangene Prüfsumme. Ist das Resultat von 0 verschieden ist bei der Datentransmission ein Fehler aufgetreten.

7. UDP Header

Wie das gesamte UDP ist auch dessen Header minimalistisch angelegt. Er besteht lediglich aus vier Felder der jeweiligen Länge von 2 Byte. Diese sind Quellport, Zielport, Datagramm-Größe (Maximum=65535 wie bei TCP) und Prüfsumme (optional).


Abb. 9: Der UDP-Header

8. Zusammenfassung

TCP und UDP sind die beiden gebräuchlichsten Transportprotokolle. Sie senden die zu übertragenden Daten beide in Pakete und bauen beide auf dem Internet Protokoll (IP) auf, welches für den eigentlichen Transport der Pakete sorgt. In den Aspekten Sicherheit und Leistung unterscheiden sich beide nur gering. Für belastete Server ist UDP oft besser geeignet weil weniger Ressourcen verbraucht werden.

Literatur

  [Universität Karlsruhe] [Institut für Technische Informatik] [E-Mail an Autor]  
Letzte Änderung: 2001-02-07 13:22:56