Zum Hauptinhalt springen

3. SCTP-Paketformat (SCTP Packet Format)

Ein SCTP-Paket besteht aus einem gemeinsamen Header und Chunks. Ein Chunk enthält entweder Steuerinformationen oder Benutzerdaten.

Das SCTP-Paketformat ist unten dargestellt:

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Common Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk #1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk #n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Mehrere Chunks können bis zur MTU-Größe in einem SCTP-Paket gebündelt werden, mit Ausnahme der INIT-, INIT ACK- und SHUTDOWN COMPLETE-Chunks. Diese Chunks DÜRFEN NICHT (MUST NOT) mit anderen Chunks in einem Paket gebündelt werden. Weitere Details zur Chunk-Bündelung finden Sie in Abschnitt 6.10.

Wenn eine Benutzerdatennachricht nicht in ein SCTP-Paket passt, kann sie mit dem in Abschnitt 6.9 definierten Verfahren in mehrere Chunks fragmentiert werden.

Alle Ganzzahlfelder in einem SCTP-Paket MÜSSEN (MUST) in Netzwerk-Byte-Reihenfolge übertragen werden, sofern nicht anders angegeben.

3.1. SCTP-Gemeinsame Header-Feldbeschreibungen (SCTP Common Header Field Descriptions)

SCTP-Gemeinsames Header-Format

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port Number | Destination Port Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Verification Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Quellportnummer (Source Port Number): 16 Bits (vorzeichenlose Ganzzahl)

Dies ist die Portnummer des SCTP-Absenders. Sie kann vom Empfänger in Kombination mit der Quell-IP-Adresse, dem SCTP-Zielport und möglicherweise der Ziel-IP-Adresse verwendet werden, um die Assoziation zu identifizieren, zu der dieses Paket gehört. Die Portnummer 0 DARF NICHT (MUST NOT) verwendet werden.

Zielportnummer (Destination Port Number): 16 Bits (vorzeichenlose Ganzzahl)

Dies ist die SCTP-Portnummer, an die dieses Paket adressiert ist. Der empfangende Host wird diese Portnummer verwenden, um das SCTP-Paket an den korrekten empfangenden Endpunkt/Anwendung zu demultiplexen. Die Portnummer 0 DARF NICHT (MUST NOT) verwendet werden.

Verifizierungs-Tag (Verification Tag): 32 Bits (vorzeichenlose Ganzzahl)

Der Empfänger dieses Pakets verwendet das Verifizierungs-Tag, um den Absender dieses SCTP-Pakets zu validieren. Bei der Übertragung MUSS (MUST) der Wert dieses Verifizierungs-Tags auf den Wert des Initiate Tags gesetzt werden, der während der Assoziationsinitialisierung vom Peer-Endpunkt empfangen wurde, mit folgenden Ausnahmen:

  • Ein Paket, das einen INIT-Chunk enthält, MUSS (MUST) ein Null-Verifizierungs-Tag haben.

  • Ein Paket, das einen SHUTDOWN COMPLETE-Chunk mit gesetztem T-Bit enthält, MUSS (MUST) das Verifizierungs-Tag aus dem Paket mit dem SHUTDOWN ACK-Chunk kopieren.

  • Ein Paket, das einen ABORT-Chunk enthält, kann (may) das Verifizierungs-Tag aus dem Paket kopieren, das den ABORT verursacht hat. Einzelheiten siehe Abschnitte 8.4 und 8.5.

Ein INIT-Chunk MUSS (MUST) der einzige Chunk im SCTP-Paket sein, das ihn trägt.

Prüfsumme (Checksum): 32 Bits (vorzeichenlose Ganzzahl)

Dieses Feld enthält die Prüfsumme dieses SCTP-Pakets. Ihre Berechnung wird in Abschnitt 6.8 diskutiert. SCTP verwendet den in Anhang B beschriebenen CRC32c-Algorithmus zur Berechnung der Prüfsumme.

3.2. Chunk-Feldbeschreibungen (Chunk Field Descriptions)

Die folgende Abbildung zeigt das Feldformat für die Chunks, die im SCTP-Paket übertragen werden sollen. Jeder Chunk ist mit einem Chunk-Typ-Feld (Chunk Type), einem chunk-spezifischen Flag-Feld, einem Chunk-Längen-Feld (Chunk Length) und einem Wert-Feld (Value) formatiert.

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Type | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Chunk Value /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk-Typ (Chunk Type): 8 Bits (vorzeichenlose Ganzzahl)

Dieses Feld identifiziert den Typ der im Chunk-Wert-Feld (Chunk Value) enthaltenen Informationen. Es nimmt einen Wert von 0 bis 254 an. Der Wert 255 ist für die zukünftige Verwendung als Erweiterungsfeld reserviert.

Die Werte der Chunk-Typen sind wie folgt definiert:

ID-Wert    Chunk-Typ
----- ----------
0 - Nutzlastdaten (Payload Data, DATA)
1 - Initiierung (Initiation, INIT)
2 - Initiierungsbestätigung (Initiation Acknowledgement, INIT ACK)
3 - Selektive Bestätigung (Selective Acknowledgement, SACK)
4 - Heartbeat-Anfrage (Heartbeat Request, HEARTBEAT)
5 - Heartbeat-Bestätigung (Heartbeat Acknowledgement, HEARTBEAT ACK)
6 - Abbruch (Abort, ABORT)
7 - Herunterfahren (Shutdown, SHUTDOWN)
8 - Herunterfahren-Bestätigung (Shutdown Acknowledgement, SHUTDOWN ACK)
9 - Betriebsfehler (Operation Error, ERROR)
10 - Status-Cookie (State Cookie, COOKIE ECHO)
11 - Cookie-Bestätigung (Cookie Acknowledgement, COOKIE ACK)
12 - Reserviert für Explicit Congestion Notification Echo (Reserved for ECNE)
13 - Reserviert für Congestion Window Reduced (Reserved for CWR)
14 - Herunterfahren abgeschlossen (Shutdown Complete, SHUTDOWN COMPLETE)
15 bis 62 - verfügbar
63 - reserviert für IETF-definierte Chunk-Erweiterungen
64 bis 126 - verfügbar
127 - reserviert für IETF-definierte Chunk-Erweiterungen
128 bis 190- verfügbar
191 - reserviert für IETF-definierte Chunk-Erweiterungen
192 bis 254- verfügbar
255 - reserviert für IETF-definierte Chunk-Erweiterungen

Chunk-Typen sind so kodiert, dass die höchstwertigen 2 Bits die Aktion angeben, die ergriffen werden muss, wenn der verarbeitende Endpunkt den Chunk-Typ nicht erkennt.

00 - Die Verarbeitung dieses SCTP-Pakets stoppen und es verwerfen,
keine weiteren Chunks darin verarbeiten.

01 - Die Verarbeitung dieses SCTP-Pakets stoppen und es verwerfen,
keine weiteren Chunks darin verarbeiten und den nicht erkannten
Chunk in einem 'Unrecognized Chunk Type' melden.

10 - Diesen Chunk überspringen und die Verarbeitung fortsetzen.

11 - Diesen Chunk überspringen und die Verarbeitung fortsetzen, aber in
einem ERROR-Chunk unter Verwendung der Fehlerursache 'Unrecognized Chunk Type' melden.

Hinweis: Die ECNE- und CWR-Chunk-Typen sind für die zukünftige Verwendung von Explicit Congestion Notification (ECN) reserviert; siehe Anhang A.

Chunk-Flags (Chunk Flags): 8 Bits

Die Verwendung dieser Bits hängt vom Chunk-Typ ab, wie er durch das Chunk-Typ-Feld angegeben wird. Sofern nicht anders angegeben, werden sie bei der Übertragung auf 0 gesetzt und beim Empfang ignoriert.

Chunk-Länge (Chunk Length): 16 Bits (vorzeichenlose Ganzzahl)

Dieser Wert stellt die Größe des Chunks in Bytes dar, einschließlich der Felder Chunk-Typ, Chunk-Flags, Chunk-Länge und Chunk-Wert. Wenn das Chunk-Wert-Feld also eine Länge von Null hat, wird das Längenfeld auf 4 gesetzt. Das Chunk-Längen-Feld zählt keine Chunk-Auffüllung.

Chunks (einschließlich Typ-, Längen- und Wertfelder) werden vom Absender mit allen Null-Bytes aufgefüllt, um ein Vielfaches von 4 Bytes lang zu sein. Diese Auffüllung DARF NICHT (MUST NOT) mehr als 3 Bytes insgesamt betragen. Der Chunk-Längenwert enthält nicht die abschließende Auffüllung des Chunks. Er enthält jedoch die Auffüllung aller Parameter mit variabler Länge außer dem letzten Parameter im Chunk. Der Empfänger MUSS (MUST) die Auffüllung ignorieren.

Hinweis: Eine robuste Implementierung sollte den Chunk akzeptieren, unabhängig davon, ob die abschließende Auffüllung in der Chunk-Länge enthalten ist oder nicht.

Chunk-Wert (Chunk Value): variable Länge

Das Chunk-Wert-Feld enthält die tatsächlichen Informationen, die im Chunk übertragen werden sollen. Die Verwendung und das Format dieses Feldes hängen vom Chunk-Typ ab.

Die Gesamtlänge eines Chunks (einschließlich Typ-, Längen- und Wertfelder) MUSS (MUST) ein Vielfaches von 4 Bytes sein. Wenn die Länge des Chunks kein Vielfaches von 4 Bytes ist, MUSS (MUST) der Absender den Chunk mit allen Null-Bytes auffüllen, und diese Auffüllung ist nicht im Chunk-Längen-Feld enthalten. Der Absender DARF NICHT (MUST NOT) mit mehr als 3 Bytes auffüllen. Der Empfänger MUSS (MUST) die Auffüllungs-Bytes ignorieren.

SCTP-definierte Chunks werden in Abschnitt 3.3 detailliert beschrieben. Die Richtlinien für IETF-definierte Chunk-Erweiterungen finden sich in Abschnitt 14.1 dieses Dokuments.

3.2.1. Optionales/variables Längenparameterformat (Optional/Variable-Length Parameter Format)

Chunk-Werte von SCTP-Steuerungs-Chunks bestehen aus einem chunk-typ-spezifischen Header von erforderlichen Feldern, gefolgt von null oder mehr Parametern. Die optionalen und variabel langen Parameter, die in einem Chunk enthalten sind, werden in einem Typ-Länge-Wert-Format definiert, wie unten gezeigt.

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Parameter Type | Parameter Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Parameter Value /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk-Parametertyp (Chunk Parameter Type): 16 Bits (vorzeichenlose Ganzzahl)

Das Typfeld ist eine 16-Bit-Kennung des Parametertyps. Es nimmt einen Wert von 0 bis 65534 an.

Der Wert 65535 ist für IETF-definierte Erweiterungen reserviert. Werte außer denen, die in spezifischen SCTP-Chunk-Beschreibungen definiert sind, sind für die Verwendung durch die IETF reserviert.

Chunk-Parameterlänge (Chunk Parameter Length): 16 Bits (vorzeichenlose Ganzzahl)

Das Parameterlängen-Feld enthält die Größe des Parameters in Bytes, einschließlich der Felder Parametertyp, Parameterlänge und Parameterwert. Somit hätte ein Parameter mit einem Parameterwert-Feld der Länge Null ein Längenfeld von 4. Die Parameterlänge enthält keine Auffüllungs-Bytes.

Chunk-Parameterwert (Chunk Parameter Value): variable Länge

Das Parameterwert-Feld enthält die tatsächlichen Informationen, die im Parameter übertragen werden sollen.

Die Gesamtlänge eines Parameters (einschließlich Typ-, Parameterlängen- und Wertfelder) MUSS (MUST) ein Vielfaches von 4 Bytes sein. Wenn die Länge des Parameters kein Vielfaches von 4 Bytes ist, füllt der Absender den Parameter am Ende (d.h. nach dem Parameterwert-Feld) mit allen Null-Bytes auf. Die Länge der Auffüllung ist nicht im Parameterlängen-Feld enthalten. Ein Absender DARF NICHT (MUST NOT) mit mehr als 3 Bytes auffüllen. Der Empfänger MUSS (MUST) die Auffüllungs-Bytes ignorieren.

Die Parametertypen sind so kodiert, dass die höchstwertigen 2 Bits die Aktion angeben, die ergriffen werden muss, wenn der verarbeitende Endpunkt den Parametertyp nicht erkennt.

00 - Die Verarbeitung dieses Parameters stoppen; keine weiteren
Parameter innerhalb dieses Chunks verarbeiten.

01 - Die Verarbeitung dieses Parameters stoppen, keine weiteren
Parameter innerhalb dieses Chunks verarbeiten und den nicht
erkannten Parameter in einem 'Unrecognized Parameter' melden,
wie in Abschnitt 3.2.2 beschrieben.

10 - Diesen Parameter überspringen und die Verarbeitung fortsetzen.

11 - Diesen Parameter überspringen und die Verarbeitung fortsetzen,
aber den nicht erkannten Parameter in einem 'Unrecognized Parameter'
melden, wie in Abschnitt 3.2.2 beschrieben.

Bitte beachten Sie, dass in allen vier Fällen ein INIT ACK- oder COOKIE ECHO-Chunk gesendet wird. Im Fall 00 oder 01 wird die Verarbeitung der Parameter nach dem unbekannten Parameter abgebrochen, aber bereits durchgeführte Verarbeitungen werden nicht rückgängig gemacht.

Die tatsächlichen SCTP-Parameter sind in den spezifischen SCTP-Chunk-Abschnitten definiert. Die Regeln für IETF-definierte Parametererweiterungen sind in Abschnitt 14.2 definiert. Beachten Sie, dass ein Parametertyp über alle Chunks hinweg eindeutig sein MUSS (MUST). Beispielsweise wird der Parametertyp '5' verwendet, um eine IPv4-Adresse darzustellen (siehe Abschnitt 3.3.2.1). Der Wert '5' ist dann über alle Chunks hinweg reserviert, um eine IPv4-Adresse darzustellen, und DARF NICHT (MUST NOT) mit einer anderen Bedeutung in einem anderen Chunk wiederverwendet werden.

3.2.2. Meldung nicht erkannter Parameter (Reporting of Unrecognized Parameters)

Wenn der Empfänger eines INIT-Chunks nicht erkannte Parameter erkennt und diese gemäß Abschnitt 3.2.1 melden muss, MUSS (MUST) er die 'Unrecognized Parameter'-Parameter in den INIT ACK-Chunk aufnehmen, der als Antwort auf den INIT-Chunk gesendet wird. Beachten Sie, dass wenn der Empfänger des INIT-Chunks KEINE Assoziation aufbauen wird (z.B. aufgrund fehlender Ressourcen), ein 'Unrecognized Parameter' NICHT in einem ABORT enthalten wäre, der an den Absender des INIT gesendet wird.

Wenn der Empfänger eines INIT ACK-Chunks nicht erkannte Parameter erkennt und diese gemäß Abschnitt 3.2.1 melden muss, SOLLTE (SHOULD) er den ERROR-Chunk, der die Fehlerursache 'Unrecognized Parameters' enthält, mit dem COOKIE ECHO-Chunk bündeln, der als Antwort auf den INIT ACK-Chunk gesendet wird. Wenn der Empfänger des INIT ACK den COOKIE ECHO-Chunk nicht mit dem ERROR-Chunk bündeln kann, KANN (MAY) der ERROR-Chunk separat gesendet werden, aber nicht bevor der COOKIE ACK empfangen wurde.

Hinweis: Wann immer ein COOKIE ECHO in einem Paket gesendet wird, MUSS (MUST) es der erste Chunk sein.

3.3. SCTP-Chunk-Definitionen (SCTP Chunk Definitions)

Dieser Abschnitt definiert das Format der verschiedenen SCTP-Chunk-Typen.

Hinweis: Da Abschnitt 3.3 zahlreiche Unterabschnitte (3.3.1 bis 3.3.13) enthält, die verschiedene Chunk-Typen (DATA, INIT, INIT ACK, SACK usw.) detailliert beschreiben, werden diese Inhalte in nachfolgenden Dokumenten fortgesetzt.