Übertragungssteuerungsprotokoll

Das Transmission Control Protocol (wörtlich " Transmission Control Protocol "), abgekürzt TCP , ist ein zuverlässiges Transportprotokollim verbundenen Modus ,das in IETF RFC  793dokumentiert ist.

Im Internetmodell , auch als TCP / IP-Modell bezeichnet, befindet sich TCP über IP. Im OSI- Modell entspricht es der Transportschicht , der Zwischenschicht der Netzwerkschicht und der Sitzungsschicht . Die Anwendungen übertragen Datenströme über eine Netzwerkverbindung. TCP teilt den Bytestream in Segmente auf, deren Größe von der MTU des zugrunde liegenden Netzwerks ( Datenverbindungsschicht ) abhängt .

TCP wurde 1973 entwickelt und 1983 für Arpanet eingeführt und ersetzt NCP ( RFC  801).

Operation

Eine TCP-Sitzung besteht aus drei Phasen:

Die Verbindung wird durch dreistufiges Handshake hergestellt . Unterbrechen der Verbindung verwendet Vier-Stufen - Handshaking . Während der Verbindungsaufbauphase werden Parameter wie die Sequenznummer initialisiert, um eine zuverlässige Übertragung (verlustfrei und in der richtigen Reihenfolge) von Daten sicherzustellen.

Struktur eines TCP-Segments

In Bits

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Quellport 2 Bytes Zielport 2 Bytes
Sequenznummer
Bestätigungsnummer
Header-Größe Reservieren ECN / NS CWR ECE URG ACK PSH RST SYN ENDE Fenster
Prüfsumme Dringender Datenzeiger
Optionen Füllung
Daten

Bedeutung der Felder:

Eine Verbindung herstellen

Obwohl es zwei Systemen möglich ist, gleichzeitig eine Verbindung zwischen ihnen herzustellen, öffnet ein System im allgemeinen Fall einen " Socket " (Zugangspunkt zu einer TCP-Verbindung) und wartet passiv auf Verbindungsanforderungen von einem anderen System. Diese Operation wird üblicherweise als passives Öffnen bezeichnet und von der Serverseite der Verbindung verwendet. Die Client- Seite der Verbindung führt eine aktive Öffnung in drei Schritten durch:

  1. Der Client sendet ein SYN-Segment an den Server.
  2. Der Server antwortet mit einem SYN / ACK-Segment.
  3. Der Kunde bestätigt mit einem ACK-Segment.

Während dieses ersten Austauschs werden die Sequenznummern der beiden Parteien synchronisiert:

  1. Der Client verwendet seine anfängliche Sequenznummer im Feld "Sequenznummer" des SYN-Segments (z. B. x).
  2. Der Server verwendet seine anfängliche Sequenznummer im Feld "Sequenznummer" des SYN / ACK-Segments (z. B. y) und fügt die Sequenznummer des Clients plus eins (x + 1) in das Feld "Bestätigungsnummer" ein.
  3. Der Client bestätigt dies durch Senden einer ACK mit einer um eins (x + 1) erhöhten Sequenznummer und einer Bestätigungsnummer, die der Sequenznummer des Servers plus eins (y + 1) entspricht.

Datenübertragung

Während der Datenübertragungsphase stellen bestimmte Schlüsselmechanismen die Robustheit und Zuverlässigkeit von TCP sicher. Insbesondere werden Sequenznummern verwendet, um empfangene TCP-Segmente zu bestellen und verlorene Daten zu erkennen, Prüfsummen ermöglichen die Fehlererkennung und Bestätigungen und Zeitüberschreitungen ermöglichen die Erkennung verlorener oder verzögerter Segmente.

Sequenz- und Bestätigungsnummern

Dank der Sequenz- und Bestätigungsnummern können die Terminalsysteme die empfangenen Daten an die Empfängeranwendung liefern.

Sequenznummern werden verwendet, um die Daten im Bytestream zu zählen. In jedem TCP-Segment gibt es immer zwei dieser Nummern, nämlich die Sequenznummer und die Bestätigungsnummer . Die Sequenznummer repräsentiert die eigene Sequenznummer des TCP-Absenders, während die Bestätigungsnummer die Sequenznummer des Empfängers repräsentiert. Um die Zuverlässigkeit von TCP sicherzustellen, muss der Empfänger die empfangenen Segmente bestätigen und angeben, dass er alle Daten des Bytestroms bis zu einer bestimmten Sequenznummer empfangen hat.

Die Sequenznummer gibt das erste Byte der Daten an.

Zum Beispiel bei einem Segmentaustausch durch Telnet  :

  1. Host A sendet ein Segment an Host B, das ein Datenbyte, eine Sequenznummer von 43 (Seq = 43) und eine Bestätigungsnummer von 79 (Ack = 79) enthält.
  2. Host B sendet eine ACK an Host A. Die Sequenznummer des Segments entspricht der Bestätigungsnummer des Hosts A (Seq = 79), und die von B empfangene Bestätigungsnummer in der Sequenznummer A wird um den Betrag erhöht von Daten in empfangenen Bytes (Ack = 43 + 1 = 44),
  3. Host A bestätigt den Empfang des Segments durch Senden einer ACK an den Host B, wobei die Sequenznummer der neuen Sequenznummer , nämlich 44 (Seq = 44), und als Nummer der Bestätigung das zuvor empfangene Sequenznummernsegment um den Betrag von erhöht wird empfangene Daten (Ack = 79 + 1 = 80).

Sequenznummern sind vorzeichenlose 32-Bit- Ganzzahlen , die nach Erreichen von (2 ^ 32) -1 auf Null zurückgesetzt werden. Die Wahl der anfänglichen Sequenznummer ist einer der Schlüssel zur Robustheit und Sicherheit von TCP-Verbindungen.

Eine Verbesserung des TCP, die als selektive Bestätigung (SACK) bezeichnet wird, ermöglicht es dem TCP-Empfänger, Datenblöcke zu bestätigen, die nicht in der richtigen Reihenfolge empfangen wurden.

Prüfsumme

Eine Prüfsumme von 16 Bit, bestehend aus dem Komplement der Summe, die zu allen Elementen eines TCP-Segments (Header und Daten) komplementiert ist, wird vom Sender berechnet und in das übertragene Segment aufgenommen. Der Empfänger berechnet die Prüfsumme des empfangenen Segments neu. Wenn sie mit der empfangenen Prüfsumme übereinstimmt, gilt das Segment als intakt und fehlerfrei empfangen.

Zeitverzögerung

Der Verlust eines Segments wird von TCP mithilfe eines Timeout- und Neuübertragungsmechanismus behandelt. Nach dem Senden eines Segments wartet TCP eine bestimmte Zeit, um die entsprechende Bestätigung zu erhalten. Eine zu kurze Zeit führt zu einer großen Anzahl unnötiger Neuübertragungen, und eine zu lange Zeit verlangsamt die Reaktion bei Verlust eines Segments.

Tatsächlich muss die Verzögerung vor der erneuten Übertragung größer sein als die durchschnittliche RTT eines Segments, dh die Zeit, die ein Segment benötigt, um den Roundtrip zwischen dem Client und dem Server durchzuführen. Da dieser Wert im Laufe der Zeit variieren kann, werden in regelmäßigen Abständen Proben "entnommen" und ein gewichteter Durchschnitt berechnet:

RTT moyen = (1-) * RTT moyen + * RTT échantillon

Ein typischer Wert für ist 0,125. Der Einfluss von Proben nimmt mit der Zeit exponentiell ab.

Die zu verwendende Verzögerung ergibt sich aus dieser Schätzung der durchschnittlichen RTT und durch Hinzufügen einer Sicherheitsmarge. Je größer der Unterschied zwischen einer Stichprobe und dem Durchschnitt ist, desto größer ist der zu erwartende Sicherheitsspielraum. Die Berechnung erfolgt aus der gewichteten Varianz zwischen Stichprobe und Mittelwert:

Variance RTT = (1-) * Variance RTT + * |RTT échantillon - RTT moyen|

Ein typischer Wert für ist 0,25. Das Zeitlimit für die Verwendung wird schließlich durch die folgende Formel angegeben:

Délai = RTT moyen + 4 * Variance RTT

Der Karn-Algorithmus ermöglicht es, die Verzögerung bei mehrdeutigen Bestätigungen besser zu bewerten . Wenn ein gesendetes Segment verloren gegangen ist, verursachen die nachfolgenden Segmente Bestätigungen, in denen die Nummer des ersten fehlenden Bytes erscheint, und es ist daher nicht mehr bekannt, welchem ​​gesendeten Segment diese Bestätigungen entsprechen.

Manchmal, wenn die Verzögerung zu lang ist, ist es vorteilhaft, nicht zu warten, bevor ein Segment erneut übertragen wird. Wenn ein Host 3 ACKs für dasselbe Segment empfängt, berücksichtigt er, dass alle nach dem bestätigten Segment übertragenen Segmente verloren gegangen sind, und überträgt sie daher sofort erneut ( schnelle erneute Übertragung ).

Ablaufsteuerung

Jeder Partner in einer TCP-Verbindung verfügt über einen Empfangspuffer, dessen Größe nicht unbegrenzt ist. Um zu verhindern, dass ein Host den anderen überlastet, bietet TCP mehrere Flusssteuerungsmechanismen. Somit enthält jedes TCP-Segment die Größe, die im Empfangspuffer des Hosts verfügbar ist, der es gesendet hat. Als Reaktion darauf begrenzt der Remote-Host die Größe des Sendefensters, um es nicht zu überlasten.

Andere Algorithmen wie Nagle oder Clarck erleichtern ebenfalls die Flusskontrolle.

Überlastungskontrolle

Eine Überlastung tritt auf, wenn zu viele Quellen versuchen, zu viele Daten zu schnell zu senden, als dass das Netzwerk sie übertragen könnte. Dies führt zum Verlust vieler Pakete und zu langen Verzögerungen.

Die Bestätigungen der übertragenen Daten oder das Fehlen von Bestätigungen werden von den Sendern verwendet, um den Zustand des Netzwerks zwischen den Endsystemen implizit zu interpretieren. Mithilfe von Zeitüberschreitungen können TCP-Absender und -Empfänger das Verhalten des Datenflusses ändern. Dies wird allgemein als Überlastungskontrolle bezeichnet.

Es gibt eine Vielzahl von Algorithmen zur Vermeidung von Überlastungen für TCP .

Andere

TCP verwendet eine Reihe von Mechanismen, um eine gute Robustheit und hohe Leistung zu erzielen. Diese Mechanismen umfassen die Verwendung eines Schiebefensters, des Algorithmus für langsamen Start , des Algorithmus zur Vermeidung von Überlastungen , der Algorithmen für schnelle Neuübertragung und schnelle Wiederherstellung ( schnelle Wiederherstellung ) usw. Derzeit wird geforscht, um TCP zu verbessern, um Verluste effizient zu behandeln, Fehler zu minimieren, Überlastungen zu bewältigen und in Umgebungen mit sehr hoher Geschwindigkeit schnell zu sein.

Langsamer Start

Slow Start (TCP) ist ein Algorithmus, der die Geschwindigkeit einer Netzwerkverbindung ausgleicht. Durch langsamen Start wird die übertragene Datenmenge schrittweise erhöht, bis die maximale Transportkapazität des Netzwerks erreicht ist.

Der langsame Start von TCP ist einer der ersten Schritte im Überlastungskontrollprozess. Es gleicht die Datenmenge aus, die ein Sender senden kann (als Überlastungsfenster bezeichnet), und die Datenmenge, die der Empfänger akzeptieren kann (als Empfangsfenster bezeichnet). Der niedrigere der beiden Werte wird zur maximalen Datenmenge, die der Absender senden darf, bevor er eine Bestätigung vom Empfänger erhält.

Eine der häufigsten Möglichkeiten zur Optimierung der Geschwindigkeit einer Verbindung besteht darin, die Geschwindigkeit der Verbindung zu erhöhen (dh die Bandbreite zu erhöhen). Jede Verbindung kann jedoch überlastet werden, wenn ein Gerät versucht, zu viele Daten zu senden. Eine Übersättigung einer Verbindung wird als Überlastung bezeichnet und kann zu langsamer Kommunikation und sogar zu Datenverlust führen.

Schnelle Neuübertragung

Schnelle Neuübertragung ist eine Erweiterung von TCP, die die Wartezeit eines Absenders vor der erneuten Übertragung eines verlorenen Segments verkürzt. Ein TCP-Absender verwendet normalerweise einen einfachen Timer, um verlorene Segmente zu erkennen. Wenn innerhalb einer bestimmten Zeit (basierend auf der geschätzten Umlaufzeit) keine Bestätigung für ein bestimmtes Segment empfangen wird, geht der Absender davon aus, dass das Segment im Netzwerk verloren gegangen ist, und überträgt es erneut.

Die doppelte Bestätigung ist die Grundlage für den Mechanismus der schnellen erneuten Übertragung. Nach dem Empfang eines Pakets wird eine Bestätigung für das zuletzt empfangene Datenbyte nacheinander gesendet. Bei einem Paket in der Reihenfolge ist dies tatsächlich die Sequenznummer des letzten Pakets plus die Nutzlastlänge des aktuellen Pakets. Wenn das nächste Paket in der Sequenz verloren geht, aber ein drittes Paket in der Sequenz empfangen wird, kann der Empfänger nur das letzte Datenbyte der Reihe nach bestätigen, das denselben Wert wie die Bestätigung des ersten Pakets hat. Das zweite Paket geht verloren und das dritte Paket ist außer Betrieb, sodass das letzte Datenbyte in der Reihenfolge das gleiche wie zuvor bleibt. Es gibt daher eine doppelte Bestätigung. Der Absender sendet weiterhin Pakete und ein viertes und ein fünftes Paket werden vom Empfänger empfangen. Auch hier fehlt das zweite Paket in der Sequenz, sodass sich das letzte Datenbyte in der Reihenfolge nicht geändert hat. Für diese beiden Pakete werden doppelte Bestätigungen gesendet.

Wenn ein Absender drei doppelte Bestätigungen empfängt, kann es ziemlich sicher sein, dass das Segment, das die Daten enthält, die auf das letzte in der Bestätigung angegebene Steuerbyte folgten, verloren gegangen ist. Ein Absender mit schneller Neuübertragung sendet dieses Paket dann sofort erneut, ohne darauf zu warten, dass es abläuft. Nach dem Empfang des erneut übertragenen Segments kann der Empfänger den Empfang des zuletzt empfangenen Datenbytes bestätigen. Im obigen Beispiel würde dies den Empfang bis zum Ende der Nutzlast des fünften Pakets bestätigen. Es ist nicht erforderlich, Zwischenpakete zu bestätigen, da TCP standardmäßig kumulative Bestätigungen verwendet.

Verbindung beenden

Die Beendigungsphase einer Verbindung erfolgt in vier Schritten, wobei jedes Ende der Verbindung unabhängig beendet wird. Das Beenden einer Verbindung erfordert daher ein Paar von FIN- und ACK-Segmenten für jedes Ende.

TCP-Ports

TCP verwendet wie UDP die Portnummer , um Anwendungen zu identifizieren. Jedes Ende ( Client / Server ) der TCP-Verbindung ist einer 16-Bit-Portnummer (von 1 bis 65535) zugeordnet, die der sendenden oder empfangenden Anwendung zugewiesen ist. Diese Ports sind in drei Kategorien unterteilt:

  • Die bekannten Ports werden von der IANA ( Internet Assigned Numbers Authority ) im Bereich von 0 bis 1023 zugewiesen und häufig von Systemprozessen verwendet oder haben privilegierte Rechte. Bekannte Anwendungen, die als Server fungieren und auf Verbindungen warten, verwenden normalerweise diese Arten von Ports. Beispiele: FTP (21), SSH (22), Telnet (23), SMTP (25), HTTP (80), POP3 (110).
  • Registrierte Ports werden normalerweise von Benutzeranwendungen als kurzlebige Quellports verwendet, um eine Verbindung zu einem Server herzustellen. Sie können jedoch auch Dienste identifizieren, die nicht von IANA registriert wurden.
  • Die dynamischen / privaten Ports können auch von Benutzeranwendungen verwendet werden, jedoch seltener. Außerhalb einer bestimmten TCP-Verbindung sind sie nicht sinnvoll.

TCP-Entwicklung

Das US-Verteidigungsministerium (DoD) hat ursprünglich das TCP / IP-Benchmark-Modell entwickelt, da es ein Netzwerk benötigt, das jeder Situation standhält.

TCP ist ein ziemlich komplexes und sich weiterentwickelndes Protokoll. Obwohl im Laufe der Jahre erhebliche Verbesserungen vorgenommen wurden, hat sich die grundlegende Funktionsweise seit dem 1981 veröffentlichten RFC 793 kaum verändert . Der RFC  1122 ( Host-Anforderungen für Internet-Hosts ) hat eine Reihe von Voraussetzungen für die Implementierung des TCP-Protokolls klargestellt. Der RFC  2581 ( TCP Congestion Control ), einer der wichtigsten in den letzten Jahren, beschreibt neue Algorithmen, die von TCP verwendet werden, um eine Überlastung zu vermeiden. Im Jahr 2001 wurde RFC 3168 geschrieben, um einen expliziten Überlastungsbenachrichtigungsmechanismus (ECN) einzuführen , und ergänzt die Liste wichtiger RFCs, die die ursprüngliche Spezifikation ergänzen.

Verwendung von TCP

Zu Beginn des XXI ten  Jahrhunderts wird TCP für etwa 90% des gesamten Verkehrs verwendet Internet . Die am häufigsten verwendeten Anwendungen, die TCP verwenden, sind HTTP / HTTPS ( World Wide Web ), SMTP / POP3 / IMAP (E-Mail) und FTP (Dateiübertragung). Youtube und Netflix verwenden TCP auch für ihre Streaming- Streams .

Alternativen zu TCP

Viele Echtzeitanwendungen benötigen die komplexen Mechanismen eines zuverlässigen TCP-Transports nicht und leiden möglicherweise sogar darunter: Multimedia-Streaming-Anwendungen (Audio, Video, Multiplayer-Spiele) in Echtzeit, Dateiaustausch usw. Bei solchen Anwendungen ist es oft besser, mit Verlusten, Fehlern oder Überlastungen umzugehen, als sie zu vermeiden.

Für diese besonderen Anforderungen wurden andere Transportprotokolle erstellt und bereitgestellt.

  • UDP ( User Datagram Protocol ) wird häufig verwendet, wenn Echtzeit der Zuverlässigkeit vorgezogen wird. Wie TCP bietet dieses Protokoll Anwendungsmultiplexing über das Konzept von Ports, arbeitet jedoch im nicht verbundenen Modus.
  • SCTP ( Stream Control Transmission Protocol ), ein Protokoll, das ähnliche Dienste wie TCP (Zuverlässigkeit, Neuordnung von Sequenzen und Überlastungskontrolle) bereitstellt und gleichzeitig die Möglichkeit der Kommunikation mit mehreren Zielen wie bei UDP bietet.
  • MPTCP ( Multipath TCP ) ist eine Überlagerung von TCP, die verschiedene TCP-Verbindungen (über verschiedene Netzwerkschnittstellen: GSM, Wifi usw.) innerhalb derselben Metaverbindung ( RFC 6824 ) zusammenführt. Dieser Vorgang ermöglicht es, alle verfügbaren Pfade parallel zu verwenden und somit die Leistung und Zuverlässigkeit einer Verbindung erheblich zu verbessern.

Verweise

  1. (in) "  Transmission Control Protocol  " Antrag auf Kommentare n o  793,September 1981.
  2. (in) Jon Postel, "  NCP / TCP Übergangsplan  " Antrag auf Kommentare n o  801,November 1981.
  3. (in) "  Der Zusatz von Explicit Congestion Notification (ECN) zu IP  " Request for Comments n o  3168,September 2001.
  4. (in) "  Robust Explicit Congestion Notification (ECN) Signaling mit Nuntien  " Antrag auf Kommentare n o  3540Juni 2003.
  5. "  DARPA / ARPA - Agentur für Verteidigungs- / fortgeschrittene Forschungsprojekte  " , livinginternet.com (abgerufen am 19. Januar 2011 )
  6. (in) "  Richtlinien für die Internet - Hosts - Communication Layers  " Antrag auf Kommentare n o  1122Oktober 1989.
  7. (in) "  TCP Überlastkontrolle  " Antrag auf Kommentare n o  2581,April 1999.
  8. "  Verkehrsmessungen auf Paketebene vom Sprint IP-Backbone  " (Zugriff 5. Juni 2020 )
  9. "  Netzwerkmerkmale des Video-Streaming-Verkehrs  " (abgerufen am 5. Juni 2020 )

Siehe auch

Zum Thema passende Artikel

Externe Links