3. Format de paquet SCTP (SCTP Packet Format)
Un paquet SCTP est composé d'un en-tête commun et de morceaux (chunks). Un morceau contient soit des informations de contrôle, soit des données utilisateur.
Le format de paquet SCTP est illustré ci-dessous:
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Plusieurs morceaux peuvent être regroupés dans un paquet SCTP jusqu'à la taille MTU, à l'exception des morceaux INIT, INIT ACK et SHUTDOWN COMPLETE. Ces morceaux ne DOIVENT PAS (MUST NOT) être regroupés avec tout autre morceau dans un paquet. Voir la section 6.10 pour plus de détails sur le regroupement de morceaux.
Si un message de données utilisateur ne rentre pas dans un paquet SCTP, il peut être fragmenté en plusieurs morceaux en utilisant la procédure définie dans la section 6.9.
Tous les champs entiers d'un paquet SCTP DOIVENT (MUST) être transmis dans l'ordre des octets réseau, sauf indication contraire.
3.1. Descriptions des champs d'en-tête commun SCTP (SCTP Common Header Field Descriptions)
Format d'en-tête commun SCTP
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Numéro de port source (Source Port Number): 16 bits (entier non signé)
C'est le numéro de port de l'expéditeur SCTP. Il peut être utilisé par le récepteur en combinaison avec l'adresse IP source, le port de destination SCTP et éventuellement l'adresse IP de destination pour identifier l'association à laquelle ce paquet appartient. Le numéro de port 0 ne DOIT PAS (MUST NOT) être utilisé.
Numéro de port de destination (Destination Port Number): 16 bits (entier non signé)
C'est le numéro de port SCTP auquel ce paquet est destiné. L'hôte récepteur utilisera ce numéro de port pour démultiplexer le paquet SCTP vers le point de terminaison/application de réception correct. Le numéro de port 0 ne DOIT PAS (MUST NOT) être utilisé.
Balise de vérification (Verification Tag): 32 bits (entier non signé)
Le récepteur de ce paquet utilise la balise de vérification pour valider l'expéditeur de ce paquet SCTP. Lors de la transmission, la valeur de cette balise de vérification DOIT (MUST) être définie sur la valeur de la balise d'initiation (Initiate Tag) reçue du point de terminaison pair pendant l'initialisation de l'association, avec les exceptions suivantes:
-
Un paquet contenant un morceau INIT DOIT (MUST) avoir une balise de vérification nulle.
-
Un paquet contenant un morceau SHUTDOWN COMPLETE avec le bit T défini DOIT (MUST) avoir la balise de vérification copiée du paquet contenant le morceau SHUTDOWN ACK.
-
Un paquet contenant un morceau ABORT peut (may) avoir la balise de vérification copiée du paquet qui a causé l'envoi de l'ABORT. Pour plus de détails, voir les sections 8.4 et 8.5.
Un morceau INIT DOIT (MUST) être le seul morceau dans le paquet SCTP qui le transporte.
Somme de contrôle (Checksum): 32 bits (entier non signé)
Ce champ contient la somme de contrôle de ce paquet SCTP. Son calcul est discuté dans la section 6.8. SCTP utilise l'algorithme CRC32c tel que décrit dans l'annexe B pour calculer la somme de contrôle.
3.2. Descriptions des champs de morceau (Chunk Field Descriptions)
La figure ci-dessous illustre le format de champ pour les morceaux à transmettre dans le paquet SCTP. Chaque morceau est formaté avec un champ Type de morceau (Chunk Type), un champ Indicateurs (Flags) spécifique au morceau, un champ Longueur de morceau (Chunk Length) et un champ Valeur (Value).
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 /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type de morceau (Chunk Type): 8 bits (entier non signé)
Ce champ identifie le type d'information contenue dans le champ Valeur de morceau (Chunk Value). Il prend une valeur de 0 à 254. La valeur 255 est réservée pour une utilisation future en tant que champ d'extension.
Les valeurs des types de morceaux sont définies comme suit:
Valeur ID Type de morceau
----- ----------
0 - Données de charge utile (Payload Data, DATA)
1 - Initiation (Initiation, INIT)
2 - Accusé de réception d'initiation (Initiation Acknowledgement, INIT ACK)
3 - Accusé de réception sélectif (Selective Acknowledgement, SACK)
4 - Demande de battement de cœur (Heartbeat Request, HEARTBEAT)
5 - Accusé de réception de battement de cœur (Heartbeat Acknowledgement, HEARTBEAT ACK)
6 - Abandon (Abort, ABORT)
7 - Arrêt (Shutdown, SHUTDOWN)
8 - Accusé de réception d'arrêt (Shutdown Acknowledgement, SHUTDOWN ACK)
9 - Erreur d'opération (Operation Error, ERROR)
10 - Cookie d'état (State Cookie, COOKIE ECHO)
11 - Accusé de réception de cookie (Cookie Acknowledgement, COOKIE ACK)
12 - Réservé pour l'écho de notification de congestion explicite (Reserved for ECNE)
13 - Réservé pour la réduction de la fenêtre de congestion (Reserved for CWR)
14 - Arrêt complet (Shutdown Complete, SHUTDOWN COMPLETE)
15 à 62 - disponible
63 - réservé pour les extensions de morceaux définies par l'IETF
64 à 126 - disponible
127 - réservé pour les extensions de morceaux définies par l'IETF
128 à 190 - disponible
191 - réservé pour les extensions de morceaux définies par l'IETF
192 à 254 - disponible
255 - réservé pour les extensions de morceaux définies par l'IETF
Les types de morceaux sont codés de telle sorte que les 2 bits de poids fort spécifient l'action qui doit être prise si le point de terminaison de traitement ne reconnaît pas le type de morceau.
00 - Arrêter le traitement de ce paquet SCTP et le rejeter, ne pas
traiter d'autres morceaux qu'il contient.
01 - Arrêter le traitement de ce paquet SCTP et le rejeter, ne pas
traiter d'autres morceaux qu'il contient, et signaler le morceau
non reconnu dans un 'Type de morceau non reconnu'.
10 - Ignorer ce morceau et continuer le traitement.
11 - Ignorer ce morceau et continuer le traitement, mais signaler dans
un morceau ERROR en utilisant la cause d'erreur 'Type de morceau non reconnu'.
Note: Les types de morceaux ECNE et CWR sont réservés pour une utilisation future de la notification de congestion explicite (ECN); voir l'annexe A.
Indicateurs de morceau (Chunk Flags): 8 bits
L'utilisation de ces bits dépend du type de morceau tel que donné par le champ Type de morceau. Sauf indication contraire, ils sont définis sur 0 lors de la transmission et sont ignorés à la réception.
Longueur de morceau (Chunk Length): 16 bits (entier non signé)
Cette valeur représente la taille du morceau en octets, y compris les champs Type de morceau, Indicateurs de morceau, Longueur de morceau et Valeur de morceau. Par conséquent, si le champ Valeur de morceau a une longueur nulle, le champ Longueur sera défini sur 4. Le champ Longueur de morceau ne compte aucun rembourrage de morceau.
Les morceaux (y compris les champs Type, Longueur et Valeur) sont complétés par l'expéditeur avec tous les octets nuls pour être un multiple de 4 octets de long. Ce rembourrage ne DOIT PAS (MUST NOT) dépasser 3 octets au total. La valeur de Longueur de morceau n'inclut pas le rembourrage de terminaison du morceau. Cependant, elle inclut le rembourrage de tout paramètre de longueur variable sauf le dernier paramètre du morceau. Le récepteur DOIT (MUST) ignorer le rembourrage.
Note: Une implémentation robuste devrait accepter le morceau, que le rembourrage final ait été inclus ou non dans la Longueur de morceau.
Valeur de morceau (Chunk Value): longueur variable
Le champ Valeur de morceau contient les informations réelles à transférer dans le morceau. L'utilisation et le format de ce champ dépendent du type de morceau.
La longueur totale d'un morceau (y compris les champs Type, Longueur et Valeur) DOIT (MUST) être un multiple de 4 octets. Si la longueur du morceau n'est pas un multiple de 4 octets, l'expéditeur DOIT (MUST) compléter le morceau avec tous les octets nuls, et ce rembourrage n'est pas inclus dans le champ Longueur de morceau. L'expéditeur ne DOIT PAS (MUST NOT) compléter avec plus de 3 octets. Le récepteur DOIT (MUST) ignorer les octets de rembourrage.
Les morceaux définis par SCTP sont décrits en détail dans la section 3.3. Les directives pour les extensions de morceaux définies par l'IETF peuvent être trouvées dans la section 14.1 de ce document.
3.2.1. Format de paramètre optionnel/de longueur variable (Optional/Variable-Length Parameter Format)
Les valeurs de morceaux des morceaux de contrôle SCTP consistent en un en-tête spécifique au type de morceau de champs obligatoires, suivi de zéro ou plusieurs paramètres. Les paramètres optionnels et de longueur variable contenus dans un morceau sont définis dans un format Type-Longueur-Valeur comme illustré ci-dessous.
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 /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type de paramètre de morceau (Chunk Parameter Type): 16 bits (entier non signé)
Le champ Type est un identifiant de 16 bits du type de paramètre. Il prend une valeur de 0 à 65534.
La valeur 65535 est réservée pour les extensions définies par l'IETF. Les valeurs autres que celles définies dans les descriptions de morceaux SCTP spécifiques sont réservées pour l'utilisation par l'IETF.
Longueur de paramètre de morceau (Chunk Parameter Length): 16 bits (entier non signé)
Le champ Longueur de paramètre contient la taille du paramètre en octets, y compris les champs Type de paramètre, Longueur de paramètre et Valeur de paramètre. Ainsi, un paramètre avec un champ Valeur de paramètre de longueur nulle aurait un champ Longueur de 4. La Longueur de paramètre n'inclut pas les octets de rembourrage.
Valeur de paramètre de morceau (Chunk Parameter Value): longueur variable
Le champ Valeur de paramètre contient les informations réelles à transférer dans le paramètre.
La longueur totale d'un paramètre (y compris les champs Type, Longueur de paramètre et Valeur) DOIT (MUST) être un multiple de 4 octets. Si la longueur du paramètre n'est pas un multiple de 4 octets, l'expéditeur complète le paramètre à la fin (c'est-à-dire après le champ Valeur de paramètre) avec tous les octets nuls. La longueur du rembourrage n'est pas incluse dans le champ Longueur de paramètre. Un expéditeur ne DOIT PAS (MUST NOT) compléter avec plus de 3 octets. Le récepteur DOIT (MUST) ignorer les octets de rembourrage.
Les types de paramètres sont codés de telle sorte que les 2 bits de poids fort spécifient l'action qui doit être prise si le point de terminaison de traitement ne reconnaît pas le type de paramètre.
00 - Arrêter le traitement de ce paramètre; ne pas traiter d'autres
paramètres dans ce morceau.
01 - Arrêter le traitement de ce paramètre, ne pas traiter d'autres
paramètres dans ce morceau, et signaler le paramètre non reconnu
dans un 'Paramètre non reconnu', comme décrit dans la section 3.2.2.
10 - Ignorer ce paramètre et continuer le traitement.
11 - Ignorer ce paramètre et continuer le traitement mais signaler le
paramètre non reconnu dans un 'Paramètre non reconnu', comme
décrit dans la section 3.2.2.
Veuillez noter que dans les quatre cas, un morceau INIT ACK ou COOKIE ECHO est envoyé. Dans le cas 00 ou 01, le traitement des paramètres après le paramètre inconnu est annulé, mais aucun traitement déjà effectué n'est annulé.
Les paramètres SCTP réels sont définis dans les sections de morceaux SCTP spécifiques. Les règles pour les extensions de paramètres définies par l'IETF sont définies dans la section 14.2. Notez qu'un type de paramètre DOIT (MUST) être unique sur tous les morceaux. Par exemple, le type de paramètre '5' est utilisé pour représenter une adresse IPv4 (voir la section 3.3.2.1). La valeur '5' est alors réservée sur tous les morceaux pour représenter une adresse IPv4 et ne DOIT PAS (MUST NOT) être réutilisée avec une signification différente dans tout autre morceau.
3.2.2. Signalement des paramètres non reconnus (Reporting of Unrecognized Parameters)
Si le récepteur d'un morceau INIT détecte des paramètres non reconnus et doit les signaler selon la section 3.2.1, il DOIT (MUST) placer le(s) paramètre(s) 'Paramètre non reconnu' dans le morceau INIT ACK envoyé en réponse au morceau INIT. Notez que si le récepteur du morceau INIT ne va PAS établir d'association (par exemple, en raison d'un manque de ressources), un 'Paramètre non reconnu' ne serait PAS inclus avec tout ABORT envoyé à l'expéditeur de l'INIT.
Si le récepteur d'un morceau INIT ACK détecte des paramètres non reconnus et doit les signaler selon la section 3.2.1, il DEVRAIT (SHOULD) regrouper le morceau ERROR contenant la cause d'erreur 'Paramètres non reconnus' avec le morceau COOKIE ECHO envoyé en réponse au morceau INIT ACK. Si le récepteur de l'INIT ACK ne peut pas regrouper le morceau COOKIE ECHO avec le morceau ERROR, le morceau ERROR PEUT (MAY) être envoyé séparément mais pas avant que le COOKIE ACK ait été reçu.
Note: Chaque fois qu'un COOKIE ECHO est envoyé dans un paquet, il DOIT (MUST) être le premier morceau.
3.3. Définitions de morceaux SCTP (SCTP Chunk Definitions)
Cette section définit le format des différents types de morceaux SCTP.
Note: Comme la section 3.3 contient de nombreuses sous-sections (3.3.1 à 3.3.13) détaillant divers types de morceaux (DATA, INIT, INIT ACK, SACK, etc.), ces contenus seront poursuivis dans les documents suivants.