Frage

Wann wird ein TCP-Paket auf der Anwendungsschicht fragmentiert werden? Wenn ein TCP-Paket wird von einer Anwendung gesendet, erhält der Empfänger auf der Anwendungsschicht immer das Paket in zwei oder mehr Paketen? Wenn ja, welche Bedingungen dazu führen, das Paket aufgeteilt werden. Es scheint wie ein Paket nicht fragmentiert sein wird, bis er die Ethernet erreicht (auf der Vermittlungsschicht) Grenze von 1500 Byte. Aber, dass die Fragmentierung auf der Anwendungsschicht an den Empfänger transparent sein, da die Netzwerkschicht die Fragmente wieder zusammenzusetzen, bevor das Paket bis zu der nächsten Schicht zu senden, nicht wahr?

War es hilfreich?

Lösung

Es wird aufgespalten werden, wenn es ein Netzwerkgerät mit einem niedrigen MTU trifft dann den Paket Größe. Die meisten Ethernet-Geräte sind in 1500, aber es kann oft kleiner, 1492 sein, wenn das Ethernet über PPPoE (DSL) wird wegen der zusätzlichen Routing-Informationen, sogar noch niedriger, wenn eine zweite Schicht wie Windows Internet Connection Sharing hinzugefügt wird. Und per Modem ist in der Regel 576!

Im Allgemeinen jedoch sollte man nicht vergessen, dass TCP ist kein Paket-Protokoll . Es verwendet, um Pakete auf der untersten Ebene über IP zu übertragen, aber so weit wie die Schnittstelle für jeden TCP-Stack betrifft, so ist es ein Stream-Protokoll und hat keine Anforderung, die Sie mit einem 1 zu schaffen: den physikalischen Pakete 1-Beziehung gesendet oder empfangen (zum Beispiel der meisten Stacks werden die Nachrichten halten, bis eine bestimmte Zeitspanne abgelaufen ist, oder es gibt genügend Nachrichten, die die Größe des IP-Pakets für die gegebene MTU zu maximieren)

Als Beispiel, wenn Sie zwei „Pakete“ gesendet (zweimal rufen Sie Ihre Sendefunktion), kann das empfangende Programm erhält nur 1 „Paket“ (der Empfang TCP-Stack könnte sie zusammen kombinieren). Wenn Sie ein Nachrichtentyp-Protokoll über TCP implimenting, sollten Sie einen Header am Anfang jeder Nachricht enthalten (oder ein anderes Kopf- / Fußzeilen mechansim), so dass die Empfangsseite des TCP-Stream wieder in einzelne Nachrichten aufgeteilt kann, entweder wenn eine Nachricht in zwei Teilen empfangen wird, oder wenn mehrere Nachrichten werden als ein Stück erhalten.

Andere Tipps

Fragmentation sollte auf eine TCP-Anwendung transparent sein. Beachten Sie, dass TCP ein Stream-Protokoll ist: Sie einen Strom von Daten erhalten, keine Pakete! Wenn Sie Ihre Anwendung erstellen basiert auf der Idee der kompletten Datenpakete dann werden Sie Probleme haben, wenn Sie eine Abstraktionsschicht hinzufügen ganze Pakete aus dem Strom zu montieren und dann die Pakete passieren bis zu der Anwendung.

Die Frage macht eine Annahme, die nicht wahr ist - TCP nicht liefern Pakete an seinen Endpunkten, sondern er sendet einen Strom von Bytes (Oktetts). Wenn eine Anwendung zwei Strings in TCP schreibt, kann es als eine Zeichenfolge am anderen Ende geliefert werden; Ebenso kann als zwei (oder mehr) Saiten am anderen Ende geliefert werden.

eine Zeichenfolge

RFC 793 , Abschnitt 1.5:

  

"Das TCP ist in der Lage eine Übertragung   kontinuierlicher Strom von Oktetts in jedem   Richtung zwischen seinen Nutzern durch   Verpackung eine bestimmte Anzahl von Bytes in   Segmente für die Übertragung durch die   Internet-System. "

Die Schlüsselwörter sind kontinuierlicher Strom von Bytes (Bytes).

RFC 793 , Abschnitt 2.8:

  

"Es gibt keine notwendige Beziehung   zwischen Druckfunktionen und Segment   Grenzen. Die Daten in einem bestimmten   Segment kann das Ergebnis eines einzigen sein   SEND Aufruf, ganz oder teilweise nicht oder von   mehrere SEND Anrufe. "

Der gesamte Abschnitt 2.8 ist relevant.

Auf der Anwendungsschicht gibt es eine Reihe von Gründen, warum die ganzen 1500 Byte ein Lese können nicht angezeigt. Verschiedene Faktoren im internen Betriebssystem und TCP-Stack können die Anwendung verursachen einige Bytes in einem Leseaufruf zu bekommen, und einige in den nächsten. Ja, der TCP-Stack, um das Paket wieder zusammenzubauen, bevor es zu senden, aber das bedeutet nicht, die App alles auf einen Schlag bekommen wird (es wahrscheinlich, es in einem Lese erhalten ist, aber es ist nicht garantiert bekommen es in einem Lese).

TCP versucht, in Ordnung Lieferung von Bytes zu gewährleisten, mit Fehlerprüfung, automatischer Wieder sendet, etc. hinter dem Rücken geschieht. Betrachten Sie es als ein Rohr an der App-Schicht und nicht verzetteln, wie der Stapel tatsächlich sendet sie über das Netzwerk.

Wenn ein Paket die maximale MTU eines Netzwerkgeräts wird es in aufgebrochen werden, mehrere Pakete. (Hinweis: Die meisten Geräte sind auf 1500 Bytes festgelegt, aber das ist nicht notwendig.)

Die Rekonstruktion des Pakets soll auf die Anwendungen vollständig transparent sein.

Verschiedene Netzwerksegmente können unterschiedliche Werte für die MTU haben. In diesem Fall Fragmentierung auftreten. Weitere Informationen finden Sie TCP Maximale Segmentgröße

Die (de) Fragmentierung geschieht in der TCP-Schicht. In der Anwendungsschicht gibt es keine Pakete mehr. TCP stellt einen zusammenhängenden Datenstrom an die Anwendung.

Eine der „Anwendungsschicht“ ein TCP-Paket (na ja, Segment wirklich; TCP auf einer eigenen Ebene nicht weiß, von Paketen) nie fragmentiert ist, da es nicht existiert. Die Anwendungsschicht ist, wo Sie die Daten als Byte-Strom zu sehen, geliefert zuverlässig und in Ordnung.

Wenn man darüber anders denken, sind Sie wahrscheinlich etwas in die falsche Art und Weise nähern. Dies ist jedoch nicht zu sagen, dass es nicht eine Schicht darüber sein könnte, sagen, eine Folge von Nachrichten über diese zuverlässig geliefert, in Ordnung Bytestrom.

Diese Seite ist eine gute Quelle für Informationen über einige der Fragen, die andere gebracht, nämlich die Notwendigkeit, Datenkapselung auf einem Anwendungsprotokoll, das von Anwendungsprotokollbasis Nicht ganz maßgeblicher im Sinne Sie beschreiben aber es hat Beispiele und ist auf einige ziemlich große Namen in Netzwerkprogrammierung bezogen.

Richtig - die informativste Weg, dies zu sehen, wird unter Verwendung von Wireshark , ein wertvolles Werkzeug. Nehmen Sie die Zeit, um herauszufinden, - hat mich mehrmals gespeichert, und gibt einen guten Reality-Check

Wenn ein 3000-Byte-Paket ein Ethernet-Netzwerk mit einer Standard-MTU-Größe von 1500 (für Ethernet) eintritt, wird es in zwei Pakete von jeweils 1500 Bytes in der Länge zerlegt werden. Das ist das einzige Mal, dass ich mir vorstellen kann.

Wireshark ist Ihre beste Wette dies für die Überprüfung. Ich habe es für eine Weile und bin total beeindruckt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top