Wie implementiert / garantiert TCP die Datenübertragung in der richtigen Reihenfolge?

9

Ich habe mich gefragt, wie genau TCP die Auslieferung in der richtigen Reihenfolge implementiert.

lässt sagen, das ist eine Liste von Ereignissen

  1. paket1 gesendet, ack empfangen.
  2. paket2 gesendet, ack nicht empfangen.
  3. paket3 gesendet.
  4. paket4 gesendet.
  5. ack4 erhalten.
  6. ack3 erhalten.
  7. ack2 erhalten.

Können Sie mir beschreiben, was genau passiert?

    
Stack Coder 30.03.2012, 03:07
quelle

2 Antworten

8

Die kurze Antwort ist, dass jedes Paket Offset-Informationen (getarnt als Sequenznummer) enthält, die angeben, wo im Stream seine Nutzlast liegt.

Nehmen wir an, das folgende Ereignis ist aufgetreten: Paket 1 wird empfangen, Paket 2 wird nicht empfangen und Paket 3 und 4 werden empfangen. An diesem Punkt weiß der empfangende TCP-Stapel, wo er den Inhalt der Pakete 3 und 4 in den Puffer kopieren soll, und er weiß, dass er noch keine vorherigen Daten empfangen hat, so dass Paket-1-Daten zum Lesen verfügbar sind, aber nicht gemacht werden Paket 3 oder 4 Daten verfügbar, bis Paket 2 empfangen wird.

Der TCP-Stack sendet im Allgemeinen nicht auf Bestätigungen für ein einzelnes Paket, bevor er das nächste sendet, sondern er empfängt keine Bestätigung für ein bestimmtes Paket (und ACKs können und werden in einem einzigen Paket zur Effizienz gebündelt) , wird es erneut übertragen, bis ein ACK empfangen wird.

Die genaue Reihenfolge der Ereignisse hängt von den Netzwerkbedingungen, der TCP-Stack-Implementierung, der gewählten TCP-Richtlinie, Socket-Optionen und anderen Faktoren ab.

    
George Skoptsov 30.03.2012, 03:13
quelle
4

TCP-Pakete haben Sequenznummern (Byte-Offsets seit dem Start, aus dem Speicher) und die ACK-Nachrichten bestätigen, dass ein bestimmter Offset empfangen wurde:

Sie könnten also mit einer Situation wie:

enden %Vor%

Mit anderen Worten, der Sender kann weiterhin unabhängig von Bestätigungen bis zu dem Punkt senden, an dem seine Puffer voll sind (er muss unbestätigte Pakete für den Fall behalten, dass er sie erneut übertragen muss).

Diese "Trennung" zwischen Senden und Bestätigungen kann den Datenfluss erheblich beschleunigen.

Auf der Empfängerseite können die Pakete außerhalb der Reihenfolge ankommen, und sie werden aufbewahrt, bis etwas in der Reihenfolge an die höheren Ebenen geliefert werden kann.

Wenn zum Beispiel data 3 vor data 2 angekommen ist, würde das empfangende Ende daran festhalten, bis data 2 angekommen ist, dann werden beide zur Lieferung nach oben gesendet.

    
paxdiablo 30.03.2012 03:15
quelle

Tags und Links