Next: Optionen
Up: Das Internet Protokoll IP
Previous: Der Aufbau von IP-Datagrammen
Subsections
Die Felder Identification, Flags und Fragment Offset ermöglichen
es, ein Datagramm, das größer ist als die MTU des nächsten Links
zu fragmentieren und beim Zielrechner wieder zusammenzubauen.
Dabei sind folgende Schritte nötig:
- Als erstes muß das Flags-Feld untersucht werden. Dort gibt es
ein ''Don't Fragment'' Bit, wenn das gesetzt ist, kann nichts
getan werden, das Datagramm wird verworfen.
- Wenn das ''Dont Fragment''-Flag nicht gesetzt ist,
kann der Datenbereich
in kleinere Stücke aufgeteilt werden, so daß die Größe der resultierenden
IP-Datagramme kleiner ist als die MTU des nächsten Hops.
- Jedes Fragment bekommt einen IP Header, der dem Haeder des
ursprünglichen Datagramms ähnlich ist: Jedes Fragment bekommt
die gleichen Werte für Absender, Zielrechner, Protokoll und Identification.
Die folgenden Felder müssen neu gesetzt werden:
- Länge des Datagramms. Dies ist die Länge des neuen Fragments.
- Im Flags-Feld gibt es ein ''More''-Bit. Dieses muß auf bei allen
Fragmenten gesetzt werden, außer beim letzten.
- Das Fragment Offset-Feld gibt die Position der Daten dieses
Fragments relativ zum Beginn des originalen Datagramms an
(gerechnet in Octets). Die Startposition ist 0.
Das Identification Feld enthält eine 16-bit Zahl, die ein
IP-Datagramm eindeutig identifiziert. Fragmente eines Datagramms
erhalten die selbe Nummer.
Dieses Feld enthält 3 Bits, deren Bedeutung in Tabelle 7
aufgeschlüsselt ist.
Tabelle 7:
Das Flags-Feld
Bit 0 |
Bit 1 |
Bit 2 |
0 (Reserviert) |
0 = Fragmentierung erlaubt |
0 = Letztes Fragment |
|
1 = Fragmentierung verboten |
1 = Mehr Fragmente folgen |
Bit 0 ist reserviert und muß 0 sein. Wenn der Sender nicht will,
daß sein Datagramm fragmentiert wird, dann setzt er Bit 1 auf 1.
Wenn dann allerdings dieses Datagramm nicht ohne Fragmentierung
zugestellt werden kann, dann muß es verworfen werden und der Sender
erhält eine Fehlerbenachrichtigung.
Bit 2 ist 0, wenn dieses Datagramm das letzte einer Reihe von
Fragmenten ist oder das einzige eines nicht fragmentierten
Datagramms. Es ist 1, wenn weitere Fragmente eines Datagramms folgen.
Mit Fragment Block bezeichnet man eine Einheit von
8 Octets. Das Feld für Fragment Offset enthält die
Größe des Offsets gemessen in solchen Blocks. Das Fragment Offset-
Feld ist 13 Bit lang, womit dann wieder die maximale Datagrammlänge
von 65535 Octets codiert werden kann.
Ein Beispiel:
Ein Datagramm mit ID 348, das 3000 Bytes Daten enthält,
wird von einem Router in drei gleich große Fragmente zerlegt.
Jedes Fragment bekommt seinen eigenen Header und 1000 Byte an Daten
(125 Fragment Blocks). Die Felder für Identification, Flags und Fragment
Offset werden für diesen Fall in Tabelle 8 aufgelistet.
Tabelle 8:
ID, Flags und Offset eines fragmentierten Datagramms
Fragment |
ID |
Flags |
Offset |
1 |
348 |
001 |
|
2 |
348 |
001 |
125 |
3 |
348 |
000 |
250 |
Ein fragmentiertes Datagramm wird immer beim Empfänger zusammenmontiert.
Ein Problem dabei ist, daß ein Host bei Empfang eines Fragments nicht weiß,
wie groß das ursprüngliche Datagramm war, und er somit auch nicht
weiß, wieviel
Speicher er für die Rekonstruktion benötigt. Bei der Speicheraustattung
heutiger Rechner sollte dieses Problem jedoch überschaubar sein.
Problematischer ist da schon folgendes Szenario:
- Ein Datagramm wird verschickt
- Der sendende Prozess stürtzt ab
- Das Datagramm wird fragmentiert
- Eines der Fragmente geht auf dem Transportweg verloren
Damit der Zielhost nicht bis in alle Ewigkeit auf ein
Fragment wartet, das ihn niemals erreichen wird, muß ein sog.
Reassembly Timeout gesetzt sein. Dieser Timeout beträgt üblicherweise
zwischen 60 und 120 Sekunden, nach denen ein Zielrechner aufgibt.
Next: Optionen
Up: Das Internet Protokoll IP
Previous: Der Aufbau von IP-Datagrammen
Bernd Leinfelder
1/6/1998