Warum wird das Erstellen einer neuen TCP-Verbindung als teuer angesehen?

8

Ich verstehe nicht, warum das Erstellen neuer TCP-Verbindungen als teure Aufgabe angesehen wird. Grundsätzlich bezieht sich das Einrichten einer neuen Verbindung auf das Ausführen des 3-Wege-Handshakes von TCP. Das heißt also, zwei Pakete zu senden und eines zu empfangen. In Anbetracht der Tatsache, dass Tausende von (Daten-) Paketen folgen werden, kann der Handshake nicht der teure Teil sein. Kann es?


quelle
Möglicherweise aufgrund der CPU- und Speicherauslastung von Verbindungen?
joeqwerty
@joeqwerty Ich verstehe, dass eine neue TCP-Verbindung normalerweise auch das Erstellen eines neuen Prozesses / Threads auf dem Server bedeutet, aber das liegt nicht an TCP, sondern an der Anwendung.
Wenn Tausende von Datenpaketen folgen, sind die Handshaks nicht der teure Teil. Aber warum nicht für jeden Datenblock eine neue TCP-Verbindung verwenden? Weil das Erstellen einer neuen TCP-Verbindung teuer ist. Aus diesem Grund stellen Sie eine Verbindung her und verwenden sie dann für Tausende von Datenblöcken.
David Schwartz
1
Beachten Sie auch, dass die Erstellung einer neuen Verbindung möglicherweise nicht nur auf den TCP-Handshake beschränkt ist. Zum Beispiel fügt SSL eine Menge Verhandlungen über Authentifizierungs- und Verschlüsselungsdetails hinzu.
Zoredache

Antworten:

10

Ich glaube im Allgemeinen, dass das Öffnen einer TCP-Verbindung im Vergleich zu der Möglichkeit, bereits offene Verbindungen wiederzuverwenden, indem sie offen gehalten wird, als teuer angesehen wird. Sie haben Recht, das Öffnen einer Verbindung dauert nur 3 Pakete / Umdrehungen, aber diese Zeit - 3 x Ihre RTT - liegt weit über den Kosten für die Wiederverwendung einer bereits offenen Verbindung, die weit näher bei 0 liegt. Die Disparität wächst noch schneller, wenn Sie öffnen und schließen häufig Verbindungen.

Sie haben zwar Recht, aber im Vergleich zu der Anzahl der Umdrehungen, die Sie sehen werden, wenn die Anwendung "es tut", können diese 3 Pakete ziemlich klein erscheinen, aber auch dies hängt davon ab, wie Sie die Optionen UND vergleichen möchten Wie verhält sich Ihre Anwendung / wie oft möchten Sie eine Verbindung herstellen?

Bearbeiten Wenn es sich jedoch um UDP oder TCP handelt, ist Cheekaleek hier zu 100% korrekt - der Overhead von ist auf lange Sicht im Vergleich zu den verbindungslosen Operationen von UDP enorm

Univ426
quelle
1
Ein gutes Beispiel, das ich in einer Paketverfolgung gesehen habe: Eine wiederverwendete MySQL-Verbindung kann Abfragen in 2-5 ms umdrehen. Eine Reihe von ElasticSearch-Abfragen dreht Abfragen in 17 bis 25 ms um. Die meiste Zeit befand sich der Verbindungsaufbau (einschließlich der ersten DNS-Suche).
sysadmin1138
2

Es ist sicherlich mehr Aufwand als das Senden eines UDP-Pakets und es ist egal, was danach passiert.

TCP enthält außerdem mehr Headerdaten und behält den Verbindungsstatus bei, der Ressourcen verbraucht.

Ja, im Vergleich zu UDP ist TCP teurer, aber teuer ist ein relativer Begriff.

"TCP-Verbindungen sind die beste Freundin eines Mädchens ???"

HostBits
quelle
4
"TCP connections are a girl's best friend???" Nein, sind sie nicht. Ich habe ein Mädchen Tausende davon zu ihrem Geburtstag bekommen und alles, was sie getan hat, war aufzuhören, meine E-Mails zurückzugeben. :(
HopelessN00b
2

Es geht nicht nur darum, Pakete zu senden und zu empfangen. Bei jedem Schritt muss zusätzlicher Speicher zugewiesen und mindestens die Netzwerkstatus-Tabellen aktualisiert werden, bis die Sitzung eingerichtet ist. Ganz zu schweigen von zusätzlichen Sicherheitsüberprüfungen (Routen-Parodie-Schutz usw.).

Wenn nur einige Beispielnummern verwendet werden (da es sich nicht um ein bestimmtes Betriebssystem handelt), wenn ein Paket für eine eingerichtete Sitzung CPU-Kosten von 1 Einheit hat, können die Kosten für eine neue Sitzung das 10-fache oder 100-fache der Kosten betragen Operationen durchgeführt. Die meisten Hardware-Firewalls, mit denen ich gearbeitet habe, können eine Größenordnung weniger neue Verbindungen pro Sekunde verarbeiten als etablierte Sitzungen.

Es ist oft keine so große Sache, zumal ein SYN-SYN / ACK-ACK in Millisekunden auftritt, aber für große Systeme mit vielen Kunden können neue Sitzungen zu einem erheblichen Overhead werden.

Bahamat
quelle
2

Die Menge oder Art des Verkehrs ist viel weniger wichtig als der Code, der mit der tatsächlichen Zuweisung von Speicher und der damit verbundenen Verfolgung von Statusinformationen verbunden ist. Wenn Sie einen sehr groben Eindruck davon bekommen möchten, was dies bedeutet, sehen Sie sich die Menge an Code im Linux-Kernel an, die mit TCP verknüpft ist, im Vergleich zu der, die mit UDP oder ICMP verknüpft ist. Ein unglaublich grober Vergleich zeigt, dass TCP etwa das Zehnfache der in UDP gefundenen Codezeilen benötigt.

In IP-Netzwerken ist der Umfang der erforderlichen Statuswartung eine der wichtigsten Determinanten für die Skalierbarkeit. Für TCP-Endpunkte wird dies nicht nur in SYN / ACK ausgedrückt, sondern auch in der laufenden Wartung von Schiebefenstern, Sequenznummern, Pufferverwaltung und QoS-Aktionen usw. Überprüfen Sie die Komplexität des FSM für TCP und berücksichtigen Sie das inhärente Fehlen derselben in UDP ...

rnxrx
quelle