3.3. Définitions de morceaux SCTP (SCTP Chunk Definitions)
Cette section définit le format des différents types de morceaux SCTP.
3.3.1. Données de charge utile (Payload Data, DATA) (0)
Le format suivant DOIT (MUST) être utilisé pour le morceau DATA:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0 | Reserved|U|B|E| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TSN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream Identifier S | Stream Sequence Number n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Protocol Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ User Data (seq n of Stream S) /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Réservé (Reserved): 5 bits
Doit être défini sur tous les '0' et ignoré par le récepteur.
Bit U: 1 bit
Le bit non ordonné (Unordered). S'il est défini sur '1', cela indique qu'il s'agit d'un morceau DATA non ordonné, et qu'aucun numéro de séquence de flux n'est attribué à ce morceau DATA. Par conséquent, le récepteur DOIT (MUST) ignorer le champ numéro de séquence de flux.
Après le réassemblage (si nécessaire), les morceaux DATA non ordonnés DOIVENT (MUST) être envoyés à la couche supérieure par le récepteur sans aucune tentative de réorganisation.
Si un message utilisateur non ordonné est fragmenté, chaque fragment du message DOIT (MUST) avoir son bit U défini sur '1'.
Bit B: 1 bit
Le bit de fragment de début (Beginning fragment bit). S'il est défini, il indique le premier fragment d'un message utilisateur.
Bit E: 1 bit
Le bit de fragment de fin (Ending fragment bit). S'il est défini, il indique le dernier fragment d'un message utilisateur.
Un message utilisateur non fragmenté doit avoir les bits B et E définis sur '1'. Définir les bits B et E sur '0' indique un fragment intermédiaire d'un message utilisateur multi-fragments, comme résumé dans le tableau suivant:
B E Description
============================================================
| 1 0 | Premier morceau d'un message utilisateur fragmenté |
+----------------------------------------------------------+
| 0 0 | Morceau intermédiaire d'un message utilisateur fragmenté |
+----------------------------------------------------------+
| 0 1 | Dernier morceau d'un message utilisateur fragmenté |
+----------------------------------------------------------+
| 1 1 | Message non fragmenté |
============================================================
| Tableau 1: Indicateurs de description de fragment |
============================================================
Lorsqu'un message utilisateur est fragmenté en plusieurs morceaux, les TSN sont utilisés par le récepteur pour réassembler le message. Cela signifie que les TSN pour chaque fragment d'un message utilisateur fragmenté DOIVENT (MUST) être strictement séquentiels.
Longueur (Length): 16 bits (entier non signé)
Ce champ indique la longueur du morceau DATA en octets depuis le début du champ de type jusqu'à la fin du champ de données utilisateur, à l'exclusion de tout rembourrage. Un morceau DATA avec un octet de données utilisateur aura la longueur définie sur 17 (indiquant 17 octets).
Un morceau DATA avec un champ de données utilisateur de longueur L aura le champ Longueur défini sur (16 + L) (indiquant 16+L octets) où L DOIT (MUST) être supérieur à 0.
TSN: 32 bits (entier non signé)
Cette valeur représente le TSN pour ce morceau DATA. La plage valide de TSN est de 0 à 4294967295 (2**32 - 1). Le TSN revient à 0 après avoir atteint 4294967295.
Identificateur de flux S (Stream Identifier S): 16 bits (entier non signé)
Identifie le flux auquel appartiennent les données utilisateur suivantes.
Numéro de séquence de flux n (Stream Sequence Number n): 16 bits (entier non signé)
Cette valeur représente le numéro de séquence de flux des données utilisateur suivantes dans le flux S. La plage valide est de 0 à 65535.
Lorsqu'un message utilisateur est fragmenté par SCTP pour le transport, le même numéro de séquence de flux DOIT (MUST) être transporté dans chacun des fragments du message.
Identificateur de protocole de charge utile (Payload Protocol Identifier): 32 bits (entier non signé)
Cette valeur représente un identificateur de protocole spécifié par l'application (ou la couche supérieure). Cette valeur est transmise à SCTP par sa couche supérieure et envoyée à son pair. Cet identificateur n'est pas utilisé par SCTP mais peut être utilisé par certaines entités réseau, ainsi que par l'application pair, pour identifier le type d'informations transportées dans ce morceau DATA. Ce champ doit être envoyé même dans les morceaux DATA fragmentés (pour s'assurer qu'il est disponible pour les agents au milieu du réseau). Notez que ce champ n'est PAS touché par une implémentation SCTP; par conséquent, son ordre d'octets n'est PAS nécessairement big endian. La couche supérieure est responsable de toute conversion d'ordre d'octets de ce champ.
La valeur 0 indique qu'aucun identificateur d'application n'est spécifié par la couche supérieure pour ces données de charge utile.
Données utilisateur (User Data): longueur variable
Ce sont les données utilisateur de la charge utile. L'implémentation DOIT (MUST) remplir la fin des données jusqu'à une limite de 4 octets avec tous les octets zéro. Tout rembourrage NE DOIT PAS (MUST NOT) être inclus dans le champ Longueur. Un expéditeur NE DOIT jamais (MUST never) ajouter plus de 3 octets de rembourrage.
3.3.2. Initiation (INIT) (1)
Ce morceau est utilisé pour initier une association SCTP entre deux points de terminaison. Le format du morceau INIT 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 1 | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Initiate Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Receiver Window Credit (a_rwnd) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of Outbound Streams | Number of Inbound Streams |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Initial TSN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Optional/Variable-Length Parameters /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Le morceau INIT contient les paramètres suivants. Sauf indication contraire, chaque paramètre ne DOIT (MUST) être inclus qu'une seule fois dans le morceau INIT.
Paramètres fixes État
----------------------------------------------
Initiate Tag Obligatoire
Advertised Receiver Window Credit Obligatoire
Number of Outbound Streams Obligatoire
Number of Inbound Streams Obligatoire
Initial TSN Obligatoire
Paramètres variables État Valeur de type
-------------------------------------------------------------
IPv4 Address (Note 1) Optionnel 5
IPv6 Address (Note 1) Optionnel 6
Cookie Preservative Optionnel 9
Reserved for ECN Capable (Note 2) Optionnel 32768 (0x8000)
Host Name Address (Note 3) Optionnel 11
Supported Address Types (Note 4) Optionnel 12
Note 1: Les morceaux INIT peuvent contenir plusieurs adresses pouvant être IPv4 et/ou IPv6 dans n'importe quelle combinaison.
Note 2: Le champ ECN Capable est réservé pour une utilisation future de la notification de congestion explicite.
Note 3: Un morceau INIT NE DOIT PAS (MUST NOT) contenir plus d'un paramètre d'adresse de nom d'hôte. De plus, l'expéditeur de l'INIT NE DOIT PAS (MUST NOT) combiner d'autres types d'adresses avec l'adresse de nom d'hôte dans l'INIT. Le récepteur de l'INIT DOIT (MUST) ignorer tout autre type d'adresse si le paramètre d'adresse de nom d'hôte est présent dans le morceau INIT reçu.
Note 4: Ce paramètre, lorsqu'il est présent, spécifie tous les types d'adresses que le point de terminaison d'envoi peut prendre en charge. L'absence de ce paramètre indique que le point de terminaison d'envoi peut prendre en charge n'importe quel type d'adresse.
NOTE D'IMPLÉMENTATION: Si un morceau INIT est reçu avec des paramètres connus qui ne sont pas des paramètres optionnels du morceau INIT, alors le récepteur DEVRAIT (SHOULD) traiter le morceau INIT et renvoyer un INIT ACK. Le récepteur du morceau INIT PEUT (MAY) regrouper un morceau ERROR avec le morceau COOKIE ACK plus tard. Cependant, les implémentations restrictives PEUVENT (MAY) renvoyer un morceau ABORT en réponse au morceau INIT.
Le champ Indicateurs de morceau dans INIT est réservé, et tous les bits qu'il contient doivent être définis sur 0 par l'expéditeur et ignorés par le récepteur. La séquence de paramètres dans un INIT peut être traitée dans n'importe quel ordre.
Balise d'initiation (Initiate Tag): 32 bits (entier non signé)
Le récepteur de l'INIT (le côté répondant) enregistre la valeur du paramètre Balise d'initiation. Cette valeur DOIT (MUST) être placée dans le champ Balise de vérification de chaque paquet SCTP que le récepteur de l'INIT transmet dans cette association.
La balise d'initiation est autorisée à avoir n'importe quelle valeur sauf 0. Voir la section 5.3.1 pour plus d'informations sur la sélection de la valeur de la balise.
Si la valeur de la balise d'initiation dans un morceau INIT reçu est trouvée à 0, le récepteur DOIT (MUST) la traiter comme une erreur et fermer l'association en transmettant un ABORT.
Crédit de fenêtre de récepteur annoncé (Advertised Receiver Window Credit, a_rwnd): 32 bits (entier non signé)
Cette valeur représente l'espace tampon dédié, en nombre d'octets, que l'expéditeur de l'INIT a réservé en association avec cette fenêtre. Pendant la durée de vie de l'association, cet espace tampon NE DEVRAIT PAS (SHOULD NOT) être réduit (c'est-à-dire que les tampons dédiés sont retirés de cette association); cependant, un point de terminaison PEUT (MAY) modifier la valeur de a_rwnd qu'il envoie dans les morceaux SACK.
Nombre de flux sortants (Number of Outbound Streams, OS): 16 bits (entier non signé)
Définit le nombre de flux sortants que l'expéditeur de ce morceau INIT souhaite créer dans cette association. La valeur 0 NE DOIT PAS (MUST NOT) être utilisée.
Note: Un récepteur d'un INIT avec la valeur OS définie sur 0 DEVRAIT (SHOULD) abandonner l'association.
Nombre de flux entrants (Number of Inbound Streams, MIS): 16 bits (entier non signé)
Définit le nombre maximum de flux que l'expéditeur de ce morceau INIT permet à l'extrémité pair de créer dans cette association. La valeur 0 NE DOIT PAS (MUST NOT) être utilisée.
Note: Il n'y a pas de négociation du nombre réel de flux, mais à la place, les deux points de terminaison utiliseront le min(requested, offered). Voir la section 5.1.1 pour plus de détails.
Note: Un récepteur d'un INIT avec la valeur MIS de 0 DEVRAIT (SHOULD) abandonner l'association.
TSN initial (Initial TSN, I-TSN): 32 bits (entier non signé)
Définit le TSN initial que l'expéditeur utilisera. La plage valide est de 0 à 4294967295. Ce champ PEUT (MAY) être défini sur la valeur du champ Balise d'initiation.
3.3.2.1. Paramètres optionnels/de longueur variable dans INIT
Les paramètres suivants suivent le format Type-Longueur-Valeur tel que défini dans la section 3.2.1. Tous les champs Type-Longueur-Valeur DOIVENT (MUST) venir après les champs de longueur fixe définis dans la section précédente.
Paramètre d'adresse IPv4 (5)
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 5 | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Adresse IPv4: 32 bits (entier non signé)
Contient une adresse IPv4 du point de terminaison d'envoi. Elle est encodée en binaire.
Paramètre d'adresse IPv6 (6)
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 6 | Length = 20 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| IPv6 Address |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Adresse IPv6: 128 bits (entier non signé)
Contient une adresse IPv6 [RFC2460] du point de terminaison d'envoi. Elle est encodée en binaire.
Note: Un expéditeur NE DOIT PAS (MUST NOT) utiliser une adresse IPv6 mappée IPv4 [RFC4291], mais devrait plutôt utiliser un paramètre d'adresse IPv4 pour une adresse IPv4.
Combinée avec le numéro de port source dans l'en-tête commun SCTP, la valeur transmise dans un paramètre d'adresse IPv4 ou IPv6 indique une adresse de transport que l'expéditeur de l'INIT prendra en charge pour l'association en cours d'initiation. C'est-à-dire que pendant la durée de vie de cette association, cette adresse IP peut apparaître dans le champ d'adresse source d'un datagramme IP envoyé par l'expéditeur de l'INIT, et peut être utilisée comme adresse de destination d'un datagramme IP envoyé par le récepteur de l'INIT.
Plus d'un paramètre d'adresse IP peut être inclus dans un morceau INIT lorsque l'expéditeur INIT est multi-hébergé. De plus, un point de terminaison multi-hébergé peut avoir accès à différents types de réseau; ainsi, plus d'un type d'adresse peut être présent dans un morceau INIT, c'est-à-dire que les adresses IPv4 et IPv6 sont autorisées dans le même morceau INIT.
Si l'INIT contient au moins un paramètre d'adresse IP, alors l'adresse source du datagramme IP contenant le morceau INIT et toute(s) adresse(s) supplémentaire(s) fournie(s) dans l'INIT peuvent être utilisées comme destinations par le point de terminaison recevant l'INIT. Si l'INIT ne contient aucun paramètre d'adresse IP, le point de terminaison recevant l'INIT DOIT (MUST) utiliser l'adresse source associée au datagramme IP reçu comme sa seule adresse de destination pour l'association.
Notez que ne pas utiliser de paramètres d'adresse IP dans l'INIT et l'INIT ACK est une alternative pour rendre une association plus susceptible de fonctionner à travers une boîte NAT.
Cookie préservateur (Cookie Preservative) (9)
L'expéditeur de l'INIT doit utiliser ce paramètre pour suggérer au récepteur de l'INIT une durée de vie plus longue du Cookie d'état.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 9 | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Suggested Cookie Life-Span Increment (msec.) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Incrément de durée de vie du cookie suggéré (Suggested Cookie Life-Span Increment): 32 bits (entier non signé)
Ce paramètre indique au récepteur de combien d'incrément en millisecondes l'expéditeur souhaite que le récepteur ajoute à sa durée de vie de cookie par défaut.
Ce paramètre optionnel doit être ajouté au morceau INIT par l'expéditeur lorsqu'il retente d'établir une association avec un pair pour lequel sa tentative précédente d'établissement de l'association a échoué en raison d'une erreur d'opération de cookie périmé. Le récepteur PEUT (MAY) choisir d'ignorer l'augmentation suggérée de la durée de vie du cookie pour ses propres raisons de sécurité.
Note: Ce document contient les sections 3.3.1 et 3.3.2. Les définitions de morceaux restantes (3.3.3 et au-delà) seront poursuivies dans les documents suivants.