5. LoWPAN Adaptation Layer and Frame Format (LoWPAN-Anpassungsschicht und Rahmenformat)
Die in diesem Abschnitt definierten Kapselungsformate (Encapsulation Formats, im Folgenden als „LoWPAN-Kapselung" bezeichnet) sind die Nutzlast in IEEE 802.15.4-MAC-Protokolldateneinheiten (Protocol Data Unit, PDU). Die LoWPAN-Nutzlast (z. B. ein IPv6-Paket) folgt unmittelbar auf diesen Kapselungs-Header.
Alle über IEEE 802.15.4 übertragenen LoWPAN-gekapselten Datagramme (Datagrams) werden mit einem Kapselungs-Header-Stapel (Encapsulation Header Stack) als Präfix versehen. Jeder Header im Header-Stapel enthält einen Header-Typ (Header Type), gefolgt von null oder mehr Header-Feldern. Im IPv6-Header enthält der Stapel in folgender Reihenfolge: Adressierung (Addressing), Hop-by-Hop-Optionen (Hop-by-Hop Options), Routing (Routing), Fragmentierung (Fragmentation), Zieloptionen (Destination Options) und schließlich die Nutzlast [RFC2460]; im LoWPAN-Header ist eine ähnliche Header-Sequenz: Mesh-Netzwerk (L2)-Adressierung, Hop-by-Hop-Optionen (einschließlich L2-Broadcast/Multicast), Fragmentierung und schließlich die Nutzlast.
Typische Header-Stapel-Beispiele:
LoWPAN-gekapseltes IPv6-Datagramm:
+---------------+-------------+---------+
| IPv6 Dispatch | IPv6 Header | Payload |
+---------------+-------------+---------+
Fall mit Mesh-Adressierung und Fragmentierung:
+-------+-------+-------+-------+---------+---------+---------+
| M Typ | M Hdr | F Typ | F Hdr | HC1 Dsp | HC1 Hdr | Payload |
+-------+-------+-------+-------+---------+---------+---------+
Wenn mehrere LoWPAN-Header im selben Paket verwendet werden, MÜSSEN (MUST) sie in folgender Reihenfolge erscheinen: Mesh-Adressierungs-Header, Broadcast-Header, Fragmentierungs-Header.
5.1. Dispatch Type and Header (Dispatch-Typ und Header)
Der Dispatch-Typ wird durch die ersten zwei Bits „01" definiert, wobei ein 6-Bit-Selektor den darauf folgenden Header-Typ identifiziert.
Dispatch-Wert-Bitmuster:
00 xxxxxx- NALP: Kein LoWPAN-Rahmen01 000001- IPv6: Unkomprimierte IPv6-Adresse01 000010- LOWPAN_HC1: HC1-komprimiertes IPv601 010000- LOWPAN_BC0: BC0-Broadcast01 111111- ESC: Zusätzliches Dispatch-Byte10 xxxxxx- MESH: Mesh-Netzwerk-Header11 000xxx- FRAG1: Erster Fragmentierungs-Header11 100xxx- FRAGN: Nachfolgender Fragmentierungs-Header
5.2. Mesh Addressing Type and Header (Mesh-Adressierungstyp und Header)
Der Mesh-Typ wird durch die ersten zwei Bits „10" definiert:
|1 0|V|F|HopsLft| originator address, final address
Felddefinitionen:
- V: 1 Bit, 0 bedeutet Absenderadresse ist 64 Bit, 1 bedeutet 16-Bit-Kurzadresse
- F: 1 Bit, 0 bedeutet endgültige Zieladresse ist 64 Bit, 1 bedeutet 16-Bit-Kurzadresse
- Hops Left: 4 Bit, wird bei jeder Weiterleitung dekrementiert, bei 0 wird das Paket verworfen. 0xF bedeutet, dass ein 8-Bit-Erweiterungsfeld folgt
- Originator Address: Verbindungsschichtadresse des Absenders
- Final Destination Address: Verbindungsschichtadresse des endgültigen Ziels
5.3. Fragmentation Type and Header (Fragmentierungstyp und Header)
Wenn ein Datagramm nicht in einen einzigen 802.15.4-Rahmen passt, SOLL (SHALL) es in Verbindungsschicht-Fragmente aufgeteilt werden. Alle Fragmente außer dem letzten MÜSSEN (MUST) ein Vielfaches von 8 Bytes sein.
Erster Fragmentierungs-Header (FRAG1):
|1 1 0 0 0| datagram_size | datagram_tag |
Nachfolgender Fragmentierungs-Header (FRAGN):
|1 1 1 0 0| datagram_size | datagram_tag |
|datagram_offset|
Felddefinitionen:
- datagram_size: 11 Bit, kodiert die Gesamtgröße des IP-Pakets (vor der Verbindungsschicht-Fragmentierung). Für IPv6 ist der Wert Payload Length + 40
- datagram_tag: 16 Bit, alle Fragmente desselben Datagramms haben denselben Tag; der Sender erhöht diesen Wert für aufeinanderfolgende Datagramme
- datagram_offset: 8 Bit, Fragmentierungsversatz in Einheiten von 8 Bytes, erscheint nur in nachfolgenden Fragmenten
Reassemblierungsregeln:
Der Empfänger identifiziert Fragmente, die zum selben Datagramm gehören, anhand folgender Informationen:
- 802.15.4-Quelladresse des Senders (oder Mesh-Absenderadresse)
- 802.15.4-Adresse des Ziels (oder endgültige Mesh-Zieladresse)
- datagram_size
- datagram_tag
Der Reassemblierungs-Timeout MUSS (MUST) auf maximal 60 Sekunden gesetzt werden. Bei Erkennung eines Disassoziierungsereignisses MÜSSEN (MUST) alle teilweise reassemblierten Fragmente verworfen werden.