Fragmentierung - wann in der Implementierung relevant

Bender86

Lieutenant
Registriert
Jan. 2007
Beiträge
718
Hallo zusammen,

ich habe mal eine generelle Frage, was die Fragmentierung von (UDP) Paketen betrifft, und was man beim Implementieren einer Anwendung dabei beachten muss (unabhängig von der verwendeten Sprache).

Ich will das ganze kurz an einem Beispiel besprechen: angenommen ich schreibe eine Java-Anwendung, die von meinem Laptop ein Paket (z.B. eine Musik-Datei) an meinen PC schicken soll. Beide Rechner befinden sich im heimischen W-LAN, der Protokollstapel sollte also aus 802.11+IP+UDP bestehen. Die Datei ist nun z.B. 1.000.000 Bytes groß und soll verschickt werden.

Nun frage ich mich:

  • Wo tritt dort überall Fragmentierung auf?
  • An welcher Stelle geschieht das für die Java-Anwendung transparent (automatisch) und wie weit muss ich händisch fragmentieren und wieder zusammen bauen?

Ich glaube das die Antwort wie folgt ist, da ich mir aber nicht sicher bin ob mein Gedankengang stimmt möchte ich es hier mal besprechen:

(Fangen wir mal auf der höchsten Schicht an) Die 1.000.000 Bytes müssen auf jeden Fall schonmal für UDP fragmentiert werden, weil ein UDP Datagram maximal ~65k groß sein darf. Ich vermute das hier der Programmierer selber die Fragmentierung vornehmen muss und dann am Beispiel von Java 65k Häppchen an den Socket übergeben müsste. Hier ist dann noch die Frage offen: wie baut man die Pakete auf der anderen Seite wieder zusammen? Ist es hier am Programmierer auf Anwendungsebene, die Häppchen mit Sequenznummern zu versehen, damit er auf der Empfängerseite die Pakete wieder in der richtigen Reihenfolge zusammen bauen kann (ist ja UDP und potentiell unzuverlässig)?

Auf der nächsten Schicht wäre IP, das auch ein 16 bit Längenfeld hat und somit auch ~65k große Pakete verwenden kann. Hier müsste also theoretisch keine Fragmentierung notwendig sein oder?

Schließlich kommt die 802.11 Schicht mit einer MTU von ~2k. Hier müssten also die 65k Häppchen nochmal in 2k Pakete zerlegt werden oder? Von wem wird das nun geregelt? Ich vermute mal, dass das vom Betriebssystem übernommen wird. Ist das richtig?

Also meine Schlussfolgerung wäre nun: effektiv werden die Pakete in 2k Häppchen zerlegt, der Programmierer muss aber nur die MTU von UDP (~65k) beachten und die Fragmentierung der niedrigeren Protokollschichten wird vom Betriebssystem übernommen. Stimmt das so oder hab ich mir das falsch überlegt und muss man als Programmierer selber mit der kleinsten MTU (hier nun 2k) arbeiten und die Pakete in diese aufteilen?
 
UDP kommt entweder ganz oder gar nicht an (aus Nutzerprogrammsicht). Allerdings tut es halt weh, wenn wegen paar 100 Byte 64 kB weggeworfen werden, deshalb sollte der Anwendungsentwickler eine Path MTU Discovery durchführen.

Aber warum verwendest du nicht TCP? Da ist die Größe unbeschränkt.
 
Hancock schrieb:
Aber warum verwendest du nicht TCP? Da ist die Größe unbeschränkt.

Zum einen gibt es ja genügend Einsatzgebiete von UDP und zum anderen will ich einfach mein Verständnis der Fragmentierung hinterfragen und ausbauen. :)

Hancock schrieb:
UDP kommt entweder ganz oder gar nicht an (aus Nutzerprogrammsicht). Allerdings tut es halt weh, wenn wegen paar 100 Byte 64 kB weggeworfen werden, deshalb sollte der Anwendungsentwickler eine Path MTU Discovery durchführen.

Also ich deute die Antwort mal so: bis zur maximalen Datagram-Größe von UDP muss ich selber theoretisch keine Fragmentierung beachten. Praktisch wählt man kleinere Größen um z.B. kleinere Retransmissions zu haben.

Aber so ganz erklärt mir das noch nicht, was unterhalb von UDP geschieht. Also am Beispiel von 802.11 ist die MTU ja bei etwa 2k. Also müssen auf der 802.11 Schicht die Pakete ja fragmentiert werden. Aber wer macht das? Die 802.11 Implementierung des Betriebssystems (vermute ich jetzt mal)?
 
Zurück
Oben