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?
Antworten:
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.
quelle
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.
quelle