it-swarm.com.de

Tut TCP SYN/ACK für jedes Paket oder nur bei der ersten Verbindung senden?

Ich habe einen TCP Server, der auf einen eingehenden Client wartet und diesen dann jede Sekunde ein Datenpaket sendet. Ich habe mich gefragt, ob das SYN/ACK-Paket nur bei der ersten Verbindung gesendet wird. Es sieht also so aus:

<client connect>
SYN
ACK
DATA
DATA
DATA
<client disconnect>

Oder wird es mit jedem Paket so gesendet?

<client connect>
SYN
ACK
DATA

SYN
ACK
DATA

SYN
ACK
DATA
<client disconnect>

Gibt es im ersten Fall auch Vorteile von UDP gegenüber TCP, wenn Sie die Verbindung über einen längeren Zeitraum offen halten?

38
Daniel T.

Es ist ein bisschen wie:

+-------------------------------------------------------+
|     client           network            server        |
+-----------------+                +--------------------|
|    (connect)    | ---- SYN ----> |                    |
|                 | <-- SYN,ACK -- |     (accepted)     |
|   (connected)   | ---- ACK ----> |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

when client sends...
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|     (send)      | ---- data ---> |                    |
|                 | <---- ACK ---- |  (data received)   |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

when server sends...
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|                 | <--- data ---- |       (send)       |
| (data received) | ---- ACK ----> |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

...and so on, til the connection is shut down or reset

SYN startet eine Verbindung; Sie werden es normalerweise nur sehen, wenn die Verbindung hergestellt wird. Für alle Daten, die über TCP gesendet werden, ist jedoch ein ACK erforderlich. Jedes gesendete Byte muss berücksichtigt werden, oder es wird erneut übertragen (oder die Verbindung zurückgesetzt (geschlossen), in schweren Fällen).

Tatsächliche Verbindungen sind jedoch aus zwei Gründen normalerweise nicht genau wie im Diagramm oben:

  • ACKs können aufgebaut werden, so dass ein ACK alle bis zu diesem Zeitpunkt empfangenen Daten bestätigen kann. Das bedeutet, dass Sie zwei oder mehr Sends mit einem ACK bestätigen können.
  • Ein ACK ist einfach ein Flag und ein Feld in einem TCP - Header. Für das Senden einer Datei ist mindestens die Bandbreite eines Headers sowie das, was die unteren Ebenen betreffen, erforderlich. Aber Datensegmente enthalten bereits alles ... Wenn Sie also Daten senden, können Sie gleichzeitig eine ACK kostenlos senden.

Die meisten TCP/IP-Stacks versuchen, die Anzahl nackter ACKs zu reduzieren, ohne unnötig eine erneute Übertragung oder ein Zurücksetzen der Verbindung zu riskieren. So ist ein Gespräch wie dieses durchaus möglich:

\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|                 | <--- data ---- |       (send)       |
| (data received) |                |                    |
|     (send)      | -- data,ACK -> |                    |
|                 |                |  (data received)   |
|                 | <- data,ACK -- |       (send)       |
| (data received) |                |                    |
|  (wait a bit)   | <--- data ---- |       (send)       |
| (data received) |                |                    |
|     (send)      | -- data,ACK -> |                    |
|                 |                |  (data received)   |
|     (send)      | ---- data ---> |   (wait a bit)     |
|                 |                |  (data received)   |
|                 | <- data,ACK -- |       (send)       |
| (data received) |                |                    |
|  (wait a bit)   |   (dead air)   |                    |
|                 | ---- ACK ----> |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

Bei UDP gibt es kein integriertes Konzept von SYN und ACK - UDP ist von Natur aus "unzuverlässig" und nicht verbindungsorientiert, so dass die Konzepte nicht so viel gelten. Ihre Bestätigung ist normalerweise nur die Antwort des Servers. Einige Protokolle auf Anwendungsebene, die auf UDP basieren, verfügen jedoch über eine protokollspezifische Methode, um die gesendeten und empfangenen Daten zu bestätigen.

71
cHao

SYN steht nur am Anfang. 

ACK gilt für nachfolgende Segmente in beide Richtungen. [Bearbeiten] Die ACK definiert auch eine Fenstergröße. Wenn die Fenstergröße beispielsweise 100 beträgt, kann der Absender 100 Segmente senden, bevor er eine Bestätigung erwartet. Z. B. Wenn der Sender 100 Segmente sendet, das Segment 50 jedoch verloren geht, erhält der Empfänger 1-49 & 51-100. Der Empfänger wechselt dann für 50 ACK (das nächste erwartete Segment) und legt die Fenstergröße auf 1 fest. Der Sender sendet ein Segment mit der Folgenummer 50 erneut. Der Receiver bestätigt dann für 101 und setzt die Fenstergröße auf eine höhere Nummer hoch. [Bearbeiten]

Beide sind eigentlich Felder im TCP - Header und können mit Daten gesendet werden, obwohl SYN und der erste ACK normalerweise datenlos sind.

Daher ist keines der von Ihnen beschriebenen Szenarien richtig. Das erste ist tatsächlich näher an der Realität, aber alle Datenpakete nach dem SYN müssen eine ACK und auch ein Bestätigungsnummernfeld enthalten, das die Nummer des nächsten erwarteten Pakets identifiziert. 

Das Ende einer Sitzung beinhaltet auch Handshakes mit FIN-gekennzeichneten Paketen und zugehörigen ACKs.

Die ausgetauschten Sequenznummern werden verwendet, um verlorene Pakete zu identifizieren, einen Wiederholungsmechanismus zu aktivieren und den gesamten Paketstrom in der richtigen Reihenfolge wieder zusammenzusetzen.

Gibt es im ersten Fall auch Vorteile von UDP gegenüber TCP, wenn Sie die Verbindung über einen längeren Zeitraum offen halten?

Mit UDP können Sie die Verbindung nicht einfach über einen längeren Zeitraum offen halten. Es besteht keine Verbindung.

Diese Sequenz von SYN/ACK/FIN-Flags stellt eine Verbindung her.

Bei UDP gibt es keine SYNs oder ACKs, so dass die Kommunikation in eine Richtung erfolgt, die Lieferung nicht garantiert ist und die Bestellung nicht erhalten bleibt. Es hat jedoch weniger Overhead und ist daher nützlich, wenn Geschwindigkeit wichtiger ist als Zuverlässigkeit, wie zum Beispiel beim Streaming von Medien. 

Dies ist zwar etwas vereinfacht, aber es ist das Beste, was ich im Moment tun kann.

Dazu gibt es noch viel mehr im wikipedia-Eintrag auf TCP und natürlich in den RFCs.

10
Don Roby

Stellen Sie sich folgendes vor: Der ursprüngliche TCP -Standard RFC 793 erlaubte jedoch das Senden von Daten mit dem ersten SYN-Paket. Dies ist jedoch heute nicht der Fall. Was Sie erhalten, ist ein separates SYN-Paket während der Initiierung des Dreiwege-Handshakes vom Anforderer der Verbindung. Angenommen, A fordert an, sich mit B zu verbinden, daher sendet A ein Paket mit einem gesetzten SYN-Bit. B antwortet mit einem ACK, um den Empfang zu bestätigen, und sendet A die ACK + SYN-Pakete. Danach können Daten übertragen werden. 

Dordal hat eine sehr gute Erklärung in dieser Angelegenheit. Klicken Sie hier auf diesen Link.

0
StacknormalFlow