Rechnernetze
Home Nach oben

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:

Version

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.

Länge

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.

Gesamtlänge

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.

Lebenszeit

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.

Transport

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.

Kopfprüfsumme

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.

Senderadresse

Dieses Feld gibt die Adresse des Absenders an. Das Feld

Empfängeradresse

gibt die Adresse des Empfängers an. Die mit der Adressierung zusammenhängenden Fragen werden im nächsten Abschnitt behandelt.

Optionen

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.

Füllbits

Dieses Feld wird mit 0-Bits aufgefüllt, um die Gesamtlänge des Kopfes auf ein Vielfaches von 32 Bits zu bringen.

Daten

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.