Der Aufbau eines Datagramms
Der Datagrammkopf im Internet-Protokoll muss sehr viel mehr Information
enthalten als ein Block im X.25/PLP, da u.a. die vollständige Empfänger- und
Senderadresse mitgeschickt werden muss. Die Header-Information im IP soll jetzt im einzelnen
besprochen werden. Ein Datagrammkopf hat im Prinzip das folgende aussehen:
Dieses Feld gibt die Versionsnummer des Protokolls an, nach der das
Datagramm aufgebaut ist. Zur Zeit wird die Version 4 betrieben. Bei zukünftigen Versionen
kann durch Ändern dieses Feldes jedes neue Protokoll gleichzeitig mit alten Versionen
betrieben werden; Implementierungen des IP-Protokolls, die Datagramme mit einer gegebenen
Versionsnummer nicht bearbeiten können, verwerfen diese Datagramme.
Dieses Feld gibt die Länge des Datagrammkopfes in Vielfachen von 32
Bits an. Die meisten Datagrammköpfe sind 20 Oktett lang, also 5*32 Bits, so dass
in
diesem Feld meistens eine 5 steht. Die meisten Datagrammblöcke haben im ersten Byte eine
45(16) stehen.
Diensttyp |
= |
Priorität |
D |
T |
R |
00 |
Dieses Feld unterteilt sich in vier Unterfelder. Das erste der Länge 3
Bit gibt an, welche Priorität dieses Datagramm hat; eine bedeutet die geringste, eine die
höchste Priorität. Falls ein Knoten die Wahl zwischen verschiedenen zu sendenden
Datagrammen hat, so sollte es jenes mit der höchsten Priorität auswählen.
Die nächsten drei Felder fordern eine möglichst geringe Verzögerung
(D=Delay), einen möglichst hohen Durchsatz (T=Throughput) bzw. eine möglichst hohe
Zuverlässigkeit (R=Reliability). Falls im Knoten eine alternative Wegewahl möglich ist,
so kann die Wegewahl gegebenenfalls aufgrund dieser Felder entscheiden, welchen Weg sie
auswählen sollte.
Gegenwärtige Implementierungen des IP-Protokolls ignorieren diese
Felder.
Dieses Feld gibt die Länge des gesamten Datagramms einschließlich des
Kopfes und der Daten in Oktetten (zu 8 Bits) an.
Identifikation |
M |
D |
Fragmentabstand |
Diese Felder kontrollieren die Fragmentierung und Reassemblierung von
Datagrammen. Das Feld Identifikation enthält eine eindeutige Nummer des
Senders. Sie wird in der Regel erzeugt, indem der Sender mit einer beliebigen Zahl in
diesem Feld beginnt und für jedes neue Datagramm diese Zahl um 1 mod 216
erhöht. Der Empfänger ersieht aus diesem Feld und der Adresse des Senders, zu welchem
Datagramm ein Fragment gehört.
Das Feld Fragmentabstand gibt in Vielfachen von 8
Oktetten an, an welcher Stelle des Datagramms das zugehörige Fragment einzufügen ist. Da
das Feld nur die Länge des Fragments angibt, kann aus diesem Feld nicht geschlossen
werden, wie viele Fragmente zu einem Datagramm gehören.
Das Feld M (More Fragments)
hat den Wert 0, falls dieses Fragment das letzte Fragment ist, also jenes mit dem
größten Fragmentabstand. Aus dem Fragmentabstand und der Länge dieses
Fragments kann der Empfänger dann die Gesamtlänge des Datagramms ermitteln.
Hat das Feld D (Do Not Fragment) den
Wert 1, so darf ein Knoten dieses Datagramm nicht fragmentieren, z.B. weil der Empfänger
nicht imstande ist, ein fragmentiertes Datagramm wieder zusammensetzen. Kann der Knoten
Datagramme nicht weiterreichen, weil sie zu lang sind, so muss das Datagramm vernichtet
werden.
Ist nach einer bestimmten Zeit (z.B. 30 Sekunden) nach dem ersten
Fragment das letzte Fragment nicht beim Empfänger eingetroffen, so werden sämtliche
Fragmente dieses Datagramms vernichtet und das Datagramm nicht weiter beachtet. Ein
höheres Protokoll muss im Bedarfsfall das Datagramm noch einmal senden.
Dieses Feld gibt an, wie lange ein Datagramm maximal im Netz bleiben
darf. Die dort eingetragene Zahl soll die maximale Lebensdauer des Datagramms in Sekunden
angeben; allerdings soll jeder Knoten diesen Wert um mindestens 1 erniedrigen, so
dass diese Zahl praktisch mit der Anzahl der Knoten übereinstimmt, die ein Datagramm passiert.
Der Hauptgrund für diese Vorkehrung ist, dass Datagramme garantiert
nach einer endlichen Zeit zerstört werden (wenn die restliche Lebenszeit null wurde).
Ansonsten könnten falsch gelenkte Datagramme, die z.B. immer im Kreis laufen, das Netz
überlasten und blockieren. Die meisten Implementierungen setzen diesen Wert auf 15 bis 30
(z.B. die UNIX-Versionen 4.2BSD und 4.3BSD). Sollte der Wert versehentlich zu klein
gewählt werden, so kann eine Verbindungen über eine bestimmte Mindestanzahl von Knoten
hinaus nie zustande kommen.
Dieses Feld gibt die Nummer des (höheren) Protokolls an, welches
dieses Paket erstellt hat, bzw. dem es auch wieder zuzuleiten ist. Diese Nummern werden
vom Network Information Center des Internets (nic.ddn.mil),
einer zentralen Interneteinrichtung, festgelegt. Es gibt zur Zeit etwa 50 solcher
Protokolle, die in den RFCs (Request For Comment)
bzw. als Internet-Protokoll veröffentlicht wurden; diese können über den Rechner
(nic.ddn.mil) angefordert werden.
Dieses Feld enthält eine Prüfsumme, nämlich die
Einerkomplement-Summe der Worte (=2 Oktette) im Header, modulo 216 (außer dem
Feld Kopfprüfsumme). Das Einerkomplement dieser Prüfsumme wird in
dieses Feld geschrieben, so dass bei erneutem Bilden dieser Zahl (einschließlich dem Feld
Kopfprüfsumme) das Ergebnis 0 sein muss.
Diese Prüfsumme muss an jedem Knoten neu gebildet werden, da jeder
Knoten das Feld verändert. Daher ist dieses recht aufwendig und sollte so effizient wie
möglich durchgeführt werden. Da nur der Kopf eines Datagramms überprüft wird, erspart
dieses Rechenzeit; höhere Protokolle müssen bei Bedarf bessere Prüfverfahren anwenden.
Der Nachteil ist natürlich, daß fehlerhafte Daten erst vom Empfänger erkannt werden
können, anstatt sie bereits unterwegs zu vernichten. Da Fehler jedoch in modernen Netzen
relativ selten auftreten, ist dieses kein ernsthaftes Problem.
Dieses Feld gibt die Adresse des Absenders an. Das Feld
gibt die Adresse des Empfängers an. Die mit der Adressierung
zusammenhängenden Fragen werden im nächsten Abschnitt behandelt.
Hier können Optionen zum Network Management oder zum Testen bei neuen
Implementierungen eingefügt werden. Das erste Bit gibt an, ob die Optionen beim
Fragmentieren in alle Fragmente kopiert werden müssen, bzw. ob nur das erste Fragment
eine Kopie erhält. Die nächsten beiden Bits definieren eine Optionenklasse (Kontrolle
oder Testen/Messen). Die letzten fünf Bits wählen dann zwischen verschiedenen möglichen
Optionen aus; z.B. können bestimmte Wege ausgewählt werden, oder die gewählte Route
soll aufgezeichnet werden.
Dieses Feld wird mit 0-Bits aufgefüllt, um die Gesamtlänge des Kopfes
auf ein Vielfaches von 32 Bits zu bringen.
Nach dem Datagrammkopf folgt unmittelbar der Datenteil, bestehend aus
so vielen Daten, wie in den Feldern Länge und Gesamtlänge festgelegt wurde. Offenbar ist
die
Datenlänge = Gesamtlänge- 4.Länge.
|