[JAVA] TCP: Grundprinzipien und Anwendungsarchitektur

Dieser Artikel beschreibt die Grundprinzipien von ** TCP **, Anwendungen, ** Architektur ** usw. und erklärt, wie ** TCP ** zum Erstellen von Hochleistungsservern verwendet wird. ..

TCP-Funktion

TCP ist ein verbindungsorientiertes Protokoll, das eine zuverlässige Vollduplex-Kommunikation mit Benutzerprozessen ermöglicht. Auf diese Weise können Sie zuverlässige und geordnete Datenpakete sicherstellen und die Verkehrssteuerung unterstützen. Hier ist der Grund, warum TCP das oben beschriebene Verhalten implementieren sollte, beginnend mit den folgenden Aspekten:

  1. Warum die IP-Netzwerkschicht die Zuverlässigkeit von Datenpaketen nicht gewährleisten kann
  2. So sichern Sie ein erreichbares und ordentliches Datenpaket per TCP 3, wie TCP die Verkehrssteuerung unterstützt 4, TCP-Status und Anwendung

OSI-Netzwerkschicht

Um zu verstehen, warum die IP-Netzwerkschicht die Zuverlässigkeit von Datenpaketen nicht gewährleistet, betrachten wir zunächst die OSI-Netzwerkschicht. In den folgenden Schichten befindet sich TCP in der Transportschicht, um die Zuverlässigkeit und Kontinuität des Protokolls sicherzustellen. Da die spezifischen gesendeten / empfangenen Pakete durch die Verbindungsschicht und die darunter liegende physikalische Schicht bestimmt werden, basiert die Arbeit von TCP auch auf der Optimierung und Verbesserung darunter.

image.png

Die Kommunikation zwischen Client und Server erfolgt über das Anwendungsprotokoll. Die Kommunikation auf der Transportschicht verwendet TCP, TCP verwendet die IP der unteren Schicht und IP kommuniziert über eine Art Datenverbindungsschicht.

image.png

Es ist bekannt, dass die Daten im Netzwerk möglicherweise über mehrere Router-Verbindungen übertragen werden. Das zugrunde liegende Ethernet-Protokoll definiert, wie elektronische Signale Datenpakete bilden, wodurch das Problem der Punkt-zu-Punkt-Kommunikation in lokalen Netzwerken (LANs), jedoch in mehreren LANs, gelöst wird. Es kann das Problem der gegenseitigen Kommunikation nicht lösen.

Das auf der Netzwerkebene verwendete IP-Protokoll definiert seine eigenen Adressregeln, die hauptsächlich Adressierungs- und Routingprobleme behandeln, um die beste Route zum Senden von Informationen gemäß der IP-Adresse des anderen Teilnehmers zu finden. Ich werde es lösen. Das LAN ist über einen Router verbunden und leitet Pakete an, die basierend auf dem IP-Protokoll an eine bestimmte Routing-Schnittstelle weitergeleitet werden sollen. Das IP-Protokoll gewährleistet jedoch nicht das Eintreffen und die Vollständigkeit von Paketen, und einige Pakete werden verworfen, um die Effizienz der Datenübertragung sicherzustellen, insbesondere wenn das Netzwerk überlastet ist. Ich werde.

Dies erfolgt in TCP, um die Integrität, Ordnung und Zuverlässigkeit von Datenpaketen sicherzustellen.

Tief in TCP graben

Konfiguration von TCP-Paketen

Viele Netzwerke haben eine maximale Übertragungseinheit (MTU), die die Grenze für Datenrahmen auf der Verbindungsschicht darstellt. Beispielsweise beträgt die MTU im Ethernet 1.500 Byte. IP-Datagramme werden über Ethernet gesendet. Wenn seine Länge größer als der MTU-Wert ist, muss der Shard gesendet werden, damit die Länge jedes Shards kleiner als die MTU ist.

Das Datenpaket enthält neben seinem eigenen TCP-Header auch Header-Informationen, einschließlich IP-Header-Informationen und Ethernet-Header-Informationen. IP-Pakete benötigen mindestens 20 Byte, um Ethernet-Datenpakete zu laden. Daher beträgt die maximale Last von IP-Datenpaketen 1480 Byte.

image.png

Wie groß ist ein TCP-Paket?

Sie benötigen den Wert von MSS, um dies zu bestimmen. MSS ist ein Konzept in TCP (im Optionsfeld des Headers). MSS ist der Maximalwert eines Datensegments, den ein TCP-Datenpaket jedes Mal senden kann. Wenn das TCP-Paket länger als das MSS ist, muss es segmentweise gesendet werden. Wenn MSS nicht konfiguriert ist, beträgt der Standardwert 536 Byte. Das heißt, ein TCP-Paket hat ungefähr 500 Bytes.

Zuverlässigkeit gewährleisten

Wie oben erwähnt, gewährleistet der zugrunde liegende Router die Zuverlässigkeit oder Reihenfolge der Pakete beim Weiterleiten nicht.

Um die Paketintegrität sicherzustellen, packt TCP zunächst größere Pakete als MSS basierend auf MSS. Das Standard-MSS ist 563 Byte, was kleiner als der MUT für Pakete ist, da er auf der Netzwerkebene aufgeteilt wird.

Als nächstes werden SEQ und ACK hinzugefügt und ein Timeout-Neuübertragungsmechanismus wird angewendet, um die Paketzuverlässigkeit sicherzustellen.

SEQ

Um die Reihenfolge der Pakete sicherzustellen, weist TCP jedem Paket eine Sequenznummer (SEQ) zu. Dadurch kann der Empfänger die Pakete nacheinander wiederherstellen. Wenn ein Paket verloren geht, können Sie auch wissen, welches Paket verloren gegangen ist. Im Allgemeinen ist die SEQ des ersten Pakets eine Zufallszahl und kann bei 1 beginnen.

ACK

Wie stellen Sie nach der Zuweisung der SEQ die Ankunft des Pakets sicher?

Dies wird basierend auf ACK bestimmt. Jedes Mal, wenn ein Paket empfangen wird, muss der Empfänger eine Bestätigung zurückgeben, damit der Absender bestätigen kann, dass es gesendet wurde. Außerdem muss der Empfänger jedes Paket validieren. Wenn während der Validierung ein Fehler gefunden wird, wird die ACK nicht gesendet und löst das erneute Senden des Timeouts des Absenders aus.

ACK enthält die folgenden Informationen:

--SEQ, um das nächste Paket zu empfangen

Ich verwende Wireshark, um Oschina-Pakete zu erfassen und die Daten auf einen Drei-Wege-Handshake zu überprüfen.

Native IP: 192.168.1.103 oschinaIp: 116.211.174.177 Three-way handshake process: 1.me->osChina:syn=1 seq=x ack=0 2.osChina->me:syn=1 seq=y ack=x+1 3.me->osChina:seq=x+1 ack=y+1

1、me->osChina:syn=1 seq=0 ack=0

image.png

2、 osChina->me:syn=1 seq=0 ack=0+1

image.png

3、 me->osChina:seq=0+1 ack=0+1

image.png

Vergleichen wir die Prozesse von drei Parteien.

image.png

** Zeitüberschreitung erneut senden **

Wir wissen, dass das Netzwerk sehr instabil ist. Selbst wenn Sie einem Datenpaket SEQ oder ACK hinzufügen, um die Reihenfolge sicherzustellen, kann nicht garantiert werden, dass Probleme wie Paketverlust und Zeitüberschreitung nicht auftreten. Was passiert, wenn die vom Absender gesendeten Daten oder die vom Empfänger zurückgegebenen ACK im Netzwerk verloren gehen oder eine Zeitüberschreitung auftreten?

RTO, Timeout für erneute Übertragung. Eine Auswertungsmethode ist erforderlich, um festzustellen, ob für ein Paket eine Zeitüberschreitung aufgetreten ist. RTT misst die Umlaufzeit einer bestimmten Verbindung. Wenn sich der Netzwerkverkehr ändert, ändert sich die Zeit entsprechend. TCP muss diese Änderungen verfolgen und die RTO dynamisch anpassen.

Wenn der Absender innerhalb einer bestimmten Zeit keine Bestätigung für das Paket erhält, wird festgestellt, dass das Paket im Netzwerk verloren gegangen ist und das Paket automatisch erneut übertragen wird. Dieser Mechanismus wird als Zeitüberschreitung bei erneuter Übertragung bezeichnet.

Wenn der Absender innerhalb dieses Zeitraums die ACK-Nachricht aufgrund des Verlusts der Nachricht vom Empfänger nicht empfängt, sendet der Absender das Paket erneut an den Empfänger. Wenn der Absender nach dem Timeout-Timer eine ACK-Nachricht für dieses Paket empfängt, der Absender dieses Paket jedoch aufgrund eines Timeouts bereits erneut gesendet hat, verarbeitet der Absender die ACK zu diesem Zeitpunkt nicht und verwirft sie einfach. Nach dem Empfang dieses Pakets gibt der Empfänger die ACK-Nachricht erneut zurück.

Verkehrskontrolle

Aus dem oben Gesagten können wir ersehen, dass TCP die Zuverlässigkeit von Daten gewährleisten kann, aber wir müssen auch die Effizienz berücksichtigen. Es gibt drei Dinge zu beachten:

  1. Unterstützung für das Senden von Paketen in großen Mengen
  2. Unterstützt die Überlastungskontrolle gemäß den Netzwerkbedingungen
  3. Funktion, um den Zustand des Empfängers zu erfassen und die Belastung des Empfängers zu verringern

Basierend auf den oben genannten drei Anforderungen ergreifen wir die folgenden Maßnahmen.

Schiebefenster

Es ist zu ineffizient, TCP-Pakete einzeln zu senden und zu überprüfen. Selbst wenn die Zuverlässigkeit gewährleistet ist, kann die Effizienz nicht durch Senden und Bestätigen jedes Pakets sichergestellt werden. In einem solchen Fall benötigen Sie eine Methode zum gleichzeitigen Senden und Überprüfen. Dies ist das Schiebefenster.

Schiebefenster senden:

Im Sendefenster müssen die Daten vor diesem Fenster von links nach rechts die vom Empfänger gesendeten und bestätigten Daten sein, und die Daten, die in das Sendefenster eingegeben werden, sind die Daten, die der Absender senden und senden kann. Die Daten nach dem Fenster sind die Daten, die nicht gesendet werden können.

Für den Fall eines Timeouts oder eines Verlusts wurden zwei Lösungen vorgeschlagen.

1, Zurück-N. Alle Pakete mit einer SEQ nach der SEQ des verlorenen Pakets werden erneut übertragen. 2. Wählen Sie ARQ, um nur verlorene Pakete zu senden und ohne Duplizierung zu senden (hohe Effizienz und Verhinderung des Sendens doppelter Pakete.

Das Schiebefenster kann den Absender auch über den Verarbeitungsstatus des Empfängers informieren. Angenommen, der Cache des TCP-Empfängers ist voll und kann keine weiteren Daten verarbeiten, aber der Absender weiß es nicht. In diesem Fall kann der Absender dem Absender die Größe des aktuellen Schiebefensters mitteilen und nicht mehr. Sendet keine Daten. In diesem Fall sendet der Absender keine weiteren Daten, vorausgesetzt, er informiert den Absender bei jedem Senden eines Pakets über die Größe des aktuellen Schiebefensters.

  1. Außerdem sendet der Empfänger unmittelbar nach dem Empfang der Daten eine Bestätigung, deklariert dem Absender jedoch gleichzeitig die Größe des Fensters als 0.
  2. Außerdem wird ACK nicht sofort gesendet, wenn ein Paket eintrifft, bis genügend freier Speicherplatz im Cache vorhanden ist. Dadurch wird verhindert, dass der Absender das Fenster verschiebt. Es gibt aber auch Probleme. Die Verzögerung beim Senden der ACK durch den Empfänger darf die Zeitüberschreitung nicht überschreiten. Wenn es zu lang ist, kann der Absender fälschlicherweise annehmen, dass die Daten verloren gegangen sind, und sie erneut senden.

Überlastungskontrolle

Ich weiß, dass die Netzwerksituation instabil ist. In guten Fällen können Sie weitere Pakete senden. Im schlimmsten Fall, wenn sich die Paketübertragungsrate nicht ändert, erhöht sich nicht nur die Netzwerklast, sondern es gibt auch zu viele Pakete, es treten Verluste auf, Timeout-Neuübertragungen nehmen zu und die Kommunikationseffizienz nimmt definitiv ab.

Auf dieser Grundlage halten beide Parteien der TCP-Kommunikation einen Wert, der als Überlastungsfenster (cwnd, Überlastungsfenster) bezeichnet wird und von der Überlastungsrate im Netzwerk abhängt, und der Wert des Übertragungsfensters auf der Sendeseite ist die Größe des Überlastungsfensters. Es ist ein Wert gleich. Wenn im Netzwerk keine Überlastung vorliegt, können Sie den Wert des Überlastungsfensters erhöhen, damit der Absender mehr Daten an das Netzwerk senden kann. Reduzieren Sie andernfalls den Wert des Überlastungsfensters, um die Überlastungsrate des Netzwerks nicht zu erhöhen.

TCP verfügt derzeit über vier Hauptalgorithmen zur Überlastungskontrolle:

1, langsamer Start 2, Überlastung vermeiden 3, schnelle erneute Übertragung 4, schnelle Erholung

Ich werde die Implementierung eines bestimmten Algorithmus nicht vorstellen. Eine grob implementierte Funktion besteht darin, die richtige Übertragungsrate aus den aktuellen Netzwerkbedingungen zu ermitteln, damit das Netzwerk nicht überlastet wird. Zum Beispiel bedeutet langsamer Start, dass die Übertragungsgeschwindigkeit zuerst langsam ist und die Rate basierend auf dem auftretenden Paketverlust angepasst wird. Wenn kein Paketverlust auftritt, erhöhen Sie die Übertragungsgeschwindigkeit. Wenn ein Paketverlust auftritt, verringert sich die Übertragungsgeschwindigkeit.

TCP-Status

Wie jeder TCP-Benutzer weiß, tritt ein 3-Wege-Handshake auf, wenn TCP eine Verbindung herstellt, und ein 4-Wege-Handshake, wenn die Verbindung unterbrochen wird. Wie ist der Staat?

image.png

Es lohnt sich, sich an die obige Abbildung zu erinnern. Lassen Sie uns anhand der folgenden Abbildung den spezifischen Anwendungsstatus anzeigen.

image.png

Wenn die Verbindung erfolgreich hergestellt wurde, wird der Status FESTGELEGT. Wenn der Status auf der empfangenden Seite SYN_RECV lautet, bedeutet dies, dass Sie auf die zweite Handshake-Nachricht geantwortet haben und auf die erneute Bestätigung auf der sendenden Seite warten. Wenn Ihr Netzwerk einer großen Anzahl von SYN-Angriffen ausgesetzt ist, gibt es viele SYN_RECV-Status. In diesem Fall kann die Identifizierung dieser IP-Adressen und die Verwendung der Firewall-Filterung eine Reihe gefälschter Konnektivitätsprobleme lösen.

Verlorene Verbindung-TIME_WAIT

Im Netzwerk ist eine Partei aktiv geschlossen, jedoch nicht in einem Vier-Wege-Handschlag. Gibt es noch TCP-eingerichtete Kanäle? Wie lange wird es geschlossen sein? Der TCP-Status lautet zu diesem Zeitpunkt TIME_WAIT. In Wirklichkeit können wir uns vorstellen, dass diese Situation häufig auftritt. Viele geschlossene Verbindungen sind eher aktiv geschlossen als Handshake-Kommunikation. Kann der vorherige TCP-Kanal wieder verbunden werden, wenn er zu diesem Zeitpunkt geschlossen ist? Oder muss ich mich wieder verbinden?

Für beide TCP-Implementierungen müssen Sie einen Wert für MSL auswählen. Der Standardwert ist 2 Minuten oder 30 Sekunden. Der Standardwert für TIME_WAIT ist doppelt so hoch wie für MSL und dauert zwischen 1 und 4 Minuten. MSL ist die längste Zeit, die ein IP-Datenpaket im Netzwerk überlebt.

Zwei Gründe, warum TIME_WAIT existiert: 1. Weil eine zuverlässige TCP-Vollduplex-Verbindung beendet wurde 2. Weil alte doppelte Pakete im Netzwerk verschwinden dürfen

TCP muss die Reproduktion alter doppelter Pakete einer Verbindung verhindern, nachdem die Verbindung geschlossen wurde, und wird für die Ausführungsform derselben Verbindung gehalten. Wenn TIME_WAY lang genug ist, was doppelt so lang ist wie die MSL, reicht es aus, damit es höchstens während der MSL überlebt, bevor Pakete in eine Richtung verworfen werden.

Vom Status TIME_WAIT bis zum Status CLOSED gibt es eine Timeout-Einstellung von 2 * MSL (RFC793 definiert MSL als 2 Minuten und Linux als 30 Sekunden). Wenn dieses Zeitlimit überschritten wird, wird der aktuelle TCP-Kanal als geschlossen definiert.

Recommended Posts

TCP: Grundprinzipien und Anwendungsarchitektur
Grundlegende Bediener und Operationen
Codierungsmethode und Refactoring-Prinzip
Rails-Webserver und Anwendungsserver
JavaScript-Übersicht und grundlegende Syntax
Ruby-Methoden und -Klassen (grundlegend)