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:
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?
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?