TCP PUSH und Segmente


1

Ich lese den Abschnitt über TCP PUSH im TCP / IP-Handbuch und habe eine Frage zu diesem Absatz:

Es ist wichtig zu wissen, dass die Push-Funktion nur die sofortige Übermittlung von Daten erzwingt. Es ändert nichts an der Tatsache, dass TCP keine Grenzen zwischen Datenelementen bietet. Es kann den Anschein haben , als könnte eine Anwendung einen Datensatz mit Daten senden und ihn dann an den Empfänger „senden“. Dann senden Sie die zweite Aufzeichnung und "drücken" Sie diese und so weiter. Die Anwendung kann jedoch nicht davon ausgehen, dass sich jedes Datenelement in einem einzelnen Segment befindet, da sie das PSH-Bit für jedes Datenelement setzt, das sie an TCP ausgibt. Es ist möglich, dass der erste "Push" Daten enthält, die zuvor an TCP gesendet wurden und noch nicht übertragen wurden, und es ist auch möglich, dass zwei Datensätze, die auf diese Weise "gepusht" wurden, ohnehin im selben Segment landen.

Meine Frage ist im letzten Satz kursiv, wie können Daten früher an TCP übergeben werden, wenn das PSH-Flag gesetzt ist, aber nicht übertragen werden? Wird das PSH-Flag nicht sofort gesetzt, um die Puffer sofort zu leeren?


Es wird nicht "früher an TCP übergeben, wenn das Push-Flag gesetzt ist ", sondern nur "früher an TCP übergeben" angegeben. Wenn Sie beispielsweise einen Knoten auf Ihrem TCP-Socket setzen, werden die Daten beim nächsten gesendeten Paket mit einem PSH gelöscht. Es gibt nichts, was Sie daran hindern könnte, einige Daten zu senden, dann eine Knotenverzögerung festzulegen und dann weitere Daten zu senden, die dann mit dem PSH-Flag gesendet werden und die vorherigen Daten aus dem Puffer herausschieben.
Alastair Maw

Antworten:


2

Es ist wichtig zu verstehen, dass TCP ein Streaming-Protokoll ist und die Aufteilung in Segmente nur ein Implementierungsdetail darstellt. Dies liegt nur daran, dass einige Protokolle niedrigerer Ebene paketbasiert sind.

Das Setzen des PSH-Flags ist nur ein Hinweis für das empfangende Ende, dass es seinen Puffer an die Anwendung senden soll. Aufgrund der asynchronen Natur des TCP / IP-Stacks wurden bei der Benachrichtigung der Anwendung über ausstehende Daten möglicherweise bereits mehrere andere, neuere Pakete empfangen, und alles zusammen wird an die Anwendung gesendet. TCP ist ein Stream.

Beachten Sie außerdem, dass es keine Garantie dafür gibt, dass die Trennung in TCP-Segmente auch im Netzwerk erhalten bleibt. Es ist wahr, dass es normalerweise erhalten bleibt, aber es gibt Proxies, Deep-Inspection-Firewalls usw., die tatsächlich mehrere kleine Segmente in ein größeres kleben können usw.


1

Es gibt Situationen, in denen TCP keine neuen Daten senden und erst auf ACKs warten darf.

Im Allgemeinen zwingt das PUSH-Flag den Empfänger dazu, den Pufferinhalt an die Anwendung zu übermitteln. Es erzwingt nicht, dass der TCP des Absenders etwas sendet.


Sobald der TCP-Stapel des Absenders das Push-Bit sieht, sollte er tatsächlich alle nicht gesendeten Daten senden.
user26825

@ user26825 Nein, es gibt Situationen, in denen TCP nicht einmal neue Daten senden und erst auf ACKs warten darf.
artistoex

Ich sehe, wie das Schiebefenster voll ist und so wartet es auf die Rückmeldungen, bevor es erneut sendet. Ich denke, Sie sollten Ihre Antwort jedoch umformulieren, da sie verwechselt werden kann mit "Ein sendender TCP darf Daten vom sendenden Benutzer sammeln und diese Daten nach Belieben in Segmenten senden, bis die Push-Funktion signalisiert wird, und dann muss er senden alle nicht gesendeten Daten. " von RFC 793.
user26825
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.