Test: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=Wichtige Kenndaten sind die Ports=
+
= Transmission Control Protocol (TCP) =
*TCP muss die empfangenen Daten an die korrekte Applikation weiterleiten.
 
*Zur Adressierung der Anwendungen werden deshalb sogenannte Portnummern verwendet.
 
*Portnummern sind 16 Bit groß
 
*Auch UDP verwendet Portnummern zur Adressierung.
 
*Die Transportprotokolle TCP und UDP haben jeweils eigene Adressräume.
 
*Der Gültigkeitsbereich einer Portnummer ist auf einen Host beschränkt.
 
*IP-Adresse und Portnummer spezifiziert einen Kommunikationsendpunkt, einen sogenannten Socket.
 
*Die Socketnummern von Quelle und Ziel identifizieren die Verbindung (socket1, socket2).
 
*Eine Verbindung ist durch die Angabe dieses Paares eindeutig identifiziert.
 
*Well-known Ports gehen von 0 bis 1023. Nur root/Adminstrator darf diese "öffnen".
 
*Registrierte Ports von 1024 bis 49151.
 
*Dynamische oder auch private Ports 49152 bis 65535.
 
  
=TCP Header=
+
TCP ist ein verbindungsorientiertes, zuverlässiges Transportprotokoll (RFC 793). Es garantiert die Zustellung der Daten in der korrekten Reihenfolge und regelt die Übertragungsgeschwindigkeit je nach Netzlast.
{|class="wikitable" style="text-align:center;
+
 
 +
== Adressierung über Ports ==
 +
* TCP leitet Daten an die korrekte Applikation weiter.
 +
* Portnummern: 16 Bit (0 bis 65535).
 +
* TCP und UDP nutzen getrennte Adressräume.
 +
* '''Socket:''' Kombination aus IP-Adresse und Portnummer (Kommunikationsendpunkt).
 +
* '''Verbindung:''' Eindeutig identifiziert durch das 5-Tupel {Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll}.
 +
 
 +
=== Portbereiche ===
 +
* '''Well-known Ports (0 - 1023):''' Reserviert für Standarddienste (z. B. HTTP 80, SSH 22). Zugriff nur durch Root/Administrator.
 +
* '''Registered Ports (1024 - 49151):''' Für spezifische Anwendungen registriert.
 +
* '''Dynamic/Private Ports (49152 - 65535):''' Vom Betriebssystem für kurzzeitige Client-Verbindungen vergeben.
 +
 
 +
== TCP Header ==
 +
 
 +
{|class="wikitable" style="text-align:center;"
 
!colspan="32"|32 Bit
 
!colspan="32"|32 Bit
 
|-
 
|-
|colspan="16" style="width:50%;" |Source Port
+
|colspan="16"|Source Port || colspan="16"|Destination Port
|colspan="16" style="width:50%;" |Destination Port
 
 
|-
 
|-
|colspan="32"|Sequence Number
+
|colspan="32"|Sequence Number (SN)
 
|-
 
|-
|colspan="32"|Acknowledge Number
+
|colspan="32"|Acknowledgment Number (ACK SN)
 
|-
 
|-
|colspan="4"|Offset
+
|colspan="4"|Offset || colspan="6"|Reserved || colspan="6"|Flags || colspan="16"|Window Size
|colspan="6"|Reserved
 
|colspan="6"|Flags
 
|colspan="16"|Window
 
 
|-
 
|-
|colspan="16"|Checksum
+
|colspan="16"|Checksum || colspan="16"|Urgent Pointer
|colspan="16"|Urgent Pointer
 
 
|-
 
|-
|colspan="10"|Options
+
|colspan="32"|Options (0-40 Byte) & Padding
|colspan="22"|Paddings
 
 
|-
 
|-
|colspan="32" style="background-color:yellow"|Data
+
|colspan="32" style="background-color:yellow"|Data (Payload)
 
|}
 
|}
  
 +
=== Erläuterung der Header-Felder ===
 +
* '''Source / Destination Port (je 2 Byte):''' Identifiziert Sender- und Empfängeranwendung.
 +
* '''Sequence Number (4 Byte):''' Zeiger auf die Position im Datenstrom. Bei SYN-Flag: Initial Sequence Number (ISN). Dient der Sortierung beim Empfänger.
 +
* '''Acknowledgment Number (4 Byte):''' Bestätigt den Erhalt aller Bytes bis zu diesem Wert minus eins. Gibt an, welches Byte als Nächstes erwartet wird. (Nur gültig, wenn ACK-Flag gesetzt).
 +
* '''Data Offset (4 Bit):''' Länge des TCP-Headers in 32-Bit-Worten (notwendig wegen variabler Options-Länge).
 +
* '''Window Size (2 Byte):''' Flusssteuerung (Flow Control). Gibt an, wie viele Bytes der Empfänger aktuell noch puffern kann (Sliding Window).
 +
* '''Checksum (2 Byte):''' Fehlererkennung über Header, Daten und IP-Pseudo-Header.
 +
* '''Urgent Pointer (2 Byte):''' Zeigt auf das Ende von Vorrangdaten im Datenstrom (nur bei URG-Flag).
 +
 +
=== Control Flags (6 Bit) ===
 +
* '''SYN:''' Synchronize – Aufbau einer Verbindung und Abgleich der Sequenznummern.
 +
* '''ACK:''' Acknowledgment – Bestätigung des Empfangs; Acknowledgment Number ist gültig.
 +
* '''FIN:''' Finish – Ordentliches Beenden der Verbindung.
 +
* '''RST:''' Reset – Abrupter Abbruch der Verbindung (Fehlerfall).
 +
* '''PSH:''' Push – Daten sofort an die Anwendung durchreichen, Pufferung umgehen.
 +
* '''URG:''' Urgent – Markiert Daten als besonders dringlich.
 +
 +
== Verbindungssteuerung ==
  
== Aufbau des TCP-Headers ==
+
=== Drei-Wege-Handschlag (3-Way-Handshake) ===
=== Allgemeines ===
+
# Client sendet '''SYN''' (mit zufälliger ISN).
Das TCP-Segment besteht immer aus zwei Teilen, dem Header und der Nutzlast "payload". Die Nutzlast enthält die zu übertragenden Daten, die wiederum Protokollinformationen der Anwendungsschicht wie HTTP oder FTP entsprechen können. Der Header enthält für die Kommunikation erforderliche Daten sowie die Dateiformat-beschreibende Information.  Da das Options-Feld in der Regel nicht genutzt wird, hat ein typischer Header eine Größe von 20 Byte.
+
# Server antwortet mit '''SYN + ACK''' (bestätigt Client-ISN und sendet eigene ISN).
 +
# Client bestätigt mit '''ACK'''.
 +
* Der Zustand der Verbindung wechselt auf '''ESTABLISHED'''.
  
=== Erläuterung ===
 
;''Source Port'' (Quellport) (2 Byte)
 
: Gibt die ''Portnummer'' auf der Senderseite an.
 
; ''Destination Port'' (Zielport) (2 Byte)
 
: Gibt die ''Portnummer'' auf der Empfängerseite an.
 
; ''Sequence Number'' (4 Byte)
 
: ''Sequenznummer'' des ersten Daten-Oktett  dieses TCP-Pakets oder die ''Initialisierungs-Sequenznummer'' falls das SYN-Flag gesetzt ist. Nach der Datenübertragung dient sie zur Sortierung der TCP-Segmente, da diese in unterschiedlicher Reihenfolge beim Empfänger ankommen können.
 
; ''Acknowledgement Number'' (Quittierungsnummer) (4 Byte)
 
: Sie gibt die ''Sequenznummer'' an, die der Empfänger dieses TCP-Segmentes als Nächstes erwartet. ''Sie ist nur gültig, falls das ACK-Flag gesetzt ist.''
 
; ''Data Offset'' (4 Bit)
 
:  Das Feld Offset (oder auch Header Length) gibt die Länge des TCP- Headers in 32-Bit Worten an. Dies entspricht dem Anfang der Daten im TCP-Segment. Das Feld ist notwendig, da der Header durch das Optionsfeld eine variable Länge hat. 
 
; Reserved (6 Bit)
 
: Das ''Reserved''-Feld wird nicht verwendet und muss null sein. RFC 3168 definiert einen Mechanismus zur expliziten Benachrichtigung über Stausituationen im Netz, für den zwei weitere Flags (CWR und ECE) eingeführt werden. Das ''Reserved''-Feld wird entsprechend verkürzt.
 
; Control-Flag (6 Bit)
 
: Sind zweiwertige Variablen mit den möglichen Zuständen ''gesetzt'' und ''nicht gesetzt'', die zur Kennzeichnung bestimmter für die Kommunikation und Weiterverarbeitung der Daten wichtiger Zustände benötigt werden. Im Folgenden werden die Flags des TCP-Headers und die von ihrem Zustand abhängigen, auszuführenden Aktionen beschrieben.
 
;''URG''
 
:Wird das Flag URG auf 1 gesetzt, so bedeutet dies, daß der Urgent Pointer (Dringendzeiger) verwendet wird.
 
;''ACK''
 
:Das ACK-Bit wird gesetzt, um anzugeben, daß die Bestätigungsnummer im Feld Acknowledgement Number gültig ist. Ist das Bit auf 0 gesetzt, enthält das TCP-Segment keine Bestätigung, das Feld Acknowledgement Number wird ignoriert.
 
;''PSH''
 
:Ist das PSH-Bit gesetzt, so werden die Daten in dem entsprechenden Segment sofort bei Ankunft der adressierten Anwendung bereitgestellt ohne sie zu puffern.
 
;''RST''
 
:Das RST-Bit dient dazu eine Verbindung zurückzusetzen, falls ein Fehler bei Übertragung aufgetreten ist. Dies kann sowohl der Fall sein, wenn ein ungültiges Segment übertragen wurde, ein Host abgestürzt ist oder der Versuch eines Verbindungsaufbaus abgewiesen werden soll.
 
;''SYN''
 
:Das SYN-Flag (Synchronize Sequenze Numbers) wird verwendet, um Verbindungen aufzubauen. Zusammen mit der Acknowledgement Number und dem ACK-Bit wird die Verbindung im Form eines Dreiwege-Handshake aufgebaut (siehe oben).
 
;''FIN''
 
:Das FIN-Bit dient zum Beenden einer Verbindung. Ist das Bit gesetzt, gibt dies an, daß der Sender keine weiteren Daten zu Übertragen hat. Das Segment mit gesetztem FIN-Bit muß quittiert werden.
 
  
;''Window''
 
:Das Feld Fenstergröße enthält die Anzahl Bytes, die der Empfänger ab dem bereits bestätigten Byte empfangen kann. Mit der Angabe der Fenstergröße erfolgt in TCP die Flußsteuerung. Das TCP-Protokoll arbeitet nach dem Prinzip eines Schiebefensters mit variabler Größe (Sliding Window). Jede Seite einer Verbindung darf die Anzahl Bytes senden, die im Feld für die Fenstergröße angegeben ist, ohne auf eine Quittung von der Empfängerseite zu warten. Währen des Sendens können gleichzeitug Quittungen für die von der anderen Seite empfangenen Daten eintreffen (diese Quittungen können wiederum neue Fenstergrößen einstellen).
 
:Eine Fenstergröße von 0 besagt, daß die Bytes bis einschließlich der Acknowledgement Number minus Eins empfangen wurden, der Empfänger momentan aber keine weiteren Daten empfangen kann. Die Erlaubnis zum weiteren Senden von Daten erfolgt durch das versenden eines Segments mit gleicher Bestätigungsnummer und einer Fenstergröße ungleich Null.
 
; [[Checksum TCP]] (2 Byte)
 
: Die ''Prüfsumme'' dient zur Erkennung von Übertragungsfehlern und wird über den TCP-Header, die Daten und einen Pseudo-Header berechnet. Dieser Header besteht aus der Ziel-IP, der Quell-IP, der TCP-Protokollkennung (0x0006) und der Länge des TCP-Headers inkl. Nutzdaten (in Bytes).
 
; ''Urgent Pointer'' (2 Byte)
 
: Zusammen mit der Sequenz-Nummer gibt dieser Wert die Position des ersten Bytes ''nach'' den Urgent-Daten im Datenstrom an. Die Urgent-Daten beginnen sofort nach dem Header. Der Wert ist nur gültig, wenn das URG-Flag gesetzt ist.
 
; Options (0–40 Byte)
 
: Das Options-Feld ist unterschiedlich groß und enthält Zusatzinformationen. Die Optionen müssen ein Vielfaches von 32 Bit lang sein. Sind sie das nicht, muss mit Nullbits aufgefüllt werden ({{lang|en|''Padding''}}). Dieses Feld ermöglicht, Verbindungsdaten auszuhandeln, die nicht im TCP-Header enthalten sind, wie zum Beispiel die Maximalgröße des Nutzdatenfeldes.
 
  
=3 Way Handshake=
+
=== Verbindungsabbau ===
*Bei 3 Way Handshake baut eine Seite eine Verbindung auf.
+
# Eine Seite sendet '''FIN'''.
*Dies geschieht durch ein gesetztes SYN Flag
+
# Gegenseite bestätigt mit '''ACK''' und sendet später eigenes '''FIN'''.
*Die Gegenseite bestätigt dies mit einem ACK Flag und schickt ebenfalls ein SYN Flag
+
# Initiator bestätigt das letzte '''FIN''' mit '''ACK'''.
*Der Initiator bestätigt dies mit einem ACK Flag
 
*Ab diesem Zeitpunkt gilt die Verbindung ESTABLISHED
 
{{#drawio:tcp1}}
 
  
=Verbindungsabbau=
+
=== Datenübertragung und Sequenznummern ===
*Beim Vebindungsabbau schickt eine Seite ein FIN FLAG während einer Verbindung.
+
* Sequenznummern (SN) sind in beiden Richtungen unabhängig.
*Die Gegenseite bestätigt dies mit einem ACK Flag und schickt ebenfalls ein FIN Flag
+
* Ein gesetztes SYN- oder FIN-Flag erhöht die SN logisch um 1.
*Der Initiator bestätigt dies mit einem ACK Flag
+
* Beispiel: Client sendet 20 Bytes Daten. Die SN erhöht sich von n auf n+20.
*Ab diesem Zeitpunkt ist die Verbindung beendet.
+
* Die Acknowledgment Number (ACK SN) der Gegenseite bestätigt dies durch Rücksendung des Wertes n+20.
{{#drawio:tcp2}}
 
  
=Eine Vollständige TCP-Verbindung=
+
== Zuverlässigkeitsmechanismen ==
*Bei einer Verbindung ist die Sequenznummer ein Zeiger auf die aktuell übertragenen Daten.
 
*Die Zeiger sind in beiden Richtungen unabhängig voneinander.
 
*Die Lage der Daten vom Client zum Server hat eine andere Posititon wie Server zum Client.
 
*Das heist wenn ich 23 Daten übertragen habe zeigt dieser Zeiger auf die Sequenznummer 23.
 
*Der Zeiger steht am Anfang auf 0
 
*Ein gesetztes SYN-Flag erhöht diesen Zeiger ebenfalls um 1
 
*Das bedeutet das dieser Zeiger am Anfang der Datenübertragung in beiden Richtungen auf 1 steht.
 
*Am Ende der Verbindung wird dieser Zeiger nochmal durch ein gesetztes FIN-Flag um 1 erhöht dies ist aber dann unrelevant, da die Verbindung im Anschluss endet.
 
*In unserem Beispiel wollen wir 20 Bytes vom Client zum Server übertragen und 79 vom Server zum Client.
 
*Der Zeiger von Server zu Client muss somit am Ende auf 21 stehen.
 
*Und der Zeiger von Client zu Server muss somit am Ende auf 80 stehen.
 
  
{{#drawio:tcp1.png}}
+
=== Retransmission (Fehlerkorrektur) ===
 +
* '''Timeout (RTO):''' Wenn innerhalb einer Zeitspanne kein ACK eintrifft, wird das Segment erneut gesendet.
 +
* '''Fast Retransmit:''' Erhält der Sender drei identische ACKs (Duplicate ACKs), wird das fehlende Segment sofort erneut gesendet, ohne auf den Timeout zu warten.
 +
 
 +
=== Überlaststeuerung (Congestion Control) ===
 +
* '''Slow Start:''' TCP beginnt mit einer kleinen Datenmenge und steigert diese exponentiell.
 +
* '''Congestion Avoidance:''' Bei Paketverlust wird die Senderate reduziert, um Netzüberlastung zu vermeiden.
 +
 
 +
=== Maximum Segment Size (MSS) ===
 +
* Wichtigste Option im Header.
 +
* Gibt die maximale Größe der Nutzdaten an (meist 1460 Byte), damit das Paket ohne Fragmentierung in einen Ethernet-Frame (1500 Byte MTU) passt.
 +
 
 +
== Analyse ==
 +
In Wireshark lassen sich der Handshake, die gleitenden Fenster (Sliding Window) und die Sequenznummern-Verläufe visualisieren.
  
 
[[Datei:tcp12.png|900px]]
 
[[Datei:tcp12.png|900px]]
 
Im Gegensatz zum UDP Protokoll, bei dem nur ein Paket gesendet wird, gibt es beim TCP Protokoll mehrere Pakete, um die Verbindung herzustellen.
 
==Abbildung mit Wireshark==
 
 
[[Datei:wireshark.png]]
 
[[Datei:wireshark.png]]

Version vom 29. März 2026, 10:49 Uhr

Transmission Control Protocol (TCP)

TCP ist ein verbindungsorientiertes, zuverlässiges Transportprotokoll (RFC 793). Es garantiert die Zustellung der Daten in der korrekten Reihenfolge und regelt die Übertragungsgeschwindigkeit je nach Netzlast.

Adressierung über Ports

  • TCP leitet Daten an die korrekte Applikation weiter.
  • Portnummern: 16 Bit (0 bis 65535).
  • TCP und UDP nutzen getrennte Adressräume.
  • Socket: Kombination aus IP-Adresse und Portnummer (Kommunikationsendpunkt).
  • Verbindung: Eindeutig identifiziert durch das 5-Tupel {Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll}.

Portbereiche

  • Well-known Ports (0 - 1023): Reserviert für Standarddienste (z. B. HTTP 80, SSH 22). Zugriff nur durch Root/Administrator.
  • Registered Ports (1024 - 49151): Für spezifische Anwendungen registriert.
  • Dynamic/Private Ports (49152 - 65535): Vom Betriebssystem für kurzzeitige Client-Verbindungen vergeben.

TCP Header

32 Bit
Source Port Destination Port
Sequence Number (SN)
Acknowledgment Number (ACK SN)
Offset Reserved Flags Window Size
Checksum Urgent Pointer
Options (0-40 Byte) & Padding
Data (Payload)

Erläuterung der Header-Felder

  • Source / Destination Port (je 2 Byte): Identifiziert Sender- und Empfängeranwendung.
  • Sequence Number (4 Byte): Zeiger auf die Position im Datenstrom. Bei SYN-Flag: Initial Sequence Number (ISN). Dient der Sortierung beim Empfänger.
  • Acknowledgment Number (4 Byte): Bestätigt den Erhalt aller Bytes bis zu diesem Wert minus eins. Gibt an, welches Byte als Nächstes erwartet wird. (Nur gültig, wenn ACK-Flag gesetzt).
  • Data Offset (4 Bit): Länge des TCP-Headers in 32-Bit-Worten (notwendig wegen variabler Options-Länge).
  • Window Size (2 Byte): Flusssteuerung (Flow Control). Gibt an, wie viele Bytes der Empfänger aktuell noch puffern kann (Sliding Window).
  • Checksum (2 Byte): Fehlererkennung über Header, Daten und IP-Pseudo-Header.
  • Urgent Pointer (2 Byte): Zeigt auf das Ende von Vorrangdaten im Datenstrom (nur bei URG-Flag).

Control Flags (6 Bit)

  • SYN: Synchronize – Aufbau einer Verbindung und Abgleich der Sequenznummern.
  • ACK: Acknowledgment – Bestätigung des Empfangs; Acknowledgment Number ist gültig.
  • FIN: Finish – Ordentliches Beenden der Verbindung.
  • RST: Reset – Abrupter Abbruch der Verbindung (Fehlerfall).
  • PSH: Push – Daten sofort an die Anwendung durchreichen, Pufferung umgehen.
  • URG: Urgent – Markiert Daten als besonders dringlich.

Verbindungssteuerung

Drei-Wege-Handschlag (3-Way-Handshake)

  1. Client sendet SYN (mit zufälliger ISN).
  2. Server antwortet mit SYN + ACK (bestätigt Client-ISN und sendet eigene ISN).
  3. Client bestätigt mit ACK.
  • Der Zustand der Verbindung wechselt auf ESTABLISHED.


Verbindungsabbau

  1. Eine Seite sendet FIN.
  2. Gegenseite bestätigt mit ACK und sendet später eigenes FIN.
  3. Initiator bestätigt das letzte FIN mit ACK.

Datenübertragung und Sequenznummern

  • Sequenznummern (SN) sind in beiden Richtungen unabhängig.
  • Ein gesetztes SYN- oder FIN-Flag erhöht die SN logisch um 1.
  • Beispiel: Client sendet 20 Bytes Daten. Die SN erhöht sich von n auf n+20.
  • Die Acknowledgment Number (ACK SN) der Gegenseite bestätigt dies durch Rücksendung des Wertes n+20.

Zuverlässigkeitsmechanismen

Retransmission (Fehlerkorrektur)

  • Timeout (RTO): Wenn innerhalb einer Zeitspanne kein ACK eintrifft, wird das Segment erneut gesendet.
  • Fast Retransmit: Erhält der Sender drei identische ACKs (Duplicate ACKs), wird das fehlende Segment sofort erneut gesendet, ohne auf den Timeout zu warten.

Überlaststeuerung (Congestion Control)

  • Slow Start: TCP beginnt mit einer kleinen Datenmenge und steigert diese exponentiell.
  • Congestion Avoidance: Bei Paketverlust wird die Senderate reduziert, um Netzüberlastung zu vermeiden.

Maximum Segment Size (MSS)

  • Wichtigste Option im Header.
  • Gibt die maximale Größe der Nutzdaten an (meist 1460 Byte), damit das Paket ohne Fragmentierung in einen Ethernet-Frame (1500 Byte MTU) passt.

Analyse

In Wireshark lassen sich der Handshake, die gleitenden Fenster (Sliding Window) und die Sequenznummern-Verläufe visualisieren.

Tcp12.png Wireshark.png