2.11. En-têtes SCTP

Ce sera un brève introduction aux en-têtes SCTP. SCTP possède beaucoup de types de paquets différents, et j'essaierai de suivre au plus près la RFC en les décrivant, avec une vue générale des en-têtes applicables à tous les paquets SCTP.

2.11.1. Format d'en-têtes génériques SCTP

C'est une vue générale de la façon dont est disposé un paquet SCTP. À la base, nous avons un premier en-tête commun avec une information décrivant l'ensemble du paquet, les ports source et destination, etc. Voir plus bas au sujet des en-têtes communs.

Après l'en-tête commun un nombre variable de blocs est envoyé, jusqu'au maximum possible du MTU (NdT. Maximum Transmission Unit). Toutes les blocs peuvent être groupés sauf INIT, INIT ACK et SHUTDOWN COMPLETE, lesquels ne doivent pas être groupés.

2.11.2. En-tête communs et génériques SCTP

Chaque paquet SCTP contient l'en-tête commun comme vu précédemment. L'en-tête contient 4 champs différents et il est placé pour chaque paquet SCTP.

Port source - bit 0-15. Ce champ renseigne sur le port source du paquet, celui qui sera envoyé.

Port destination - bit 16-31. Port destination du paquet. C'est la même chose que pour les ports destination de TCP et UDP.

Repère de vérification - bit 32-63. Le repère de vérification est utilisé pour vérifier que le paquet provient du bon expéditeur. Il est toujours placé à la même valeur identique à la valeur reçue par les autres correspondants (repère d'initialisation) pendant la phase d'initialisation d'association, avec quelques exceptions :

  • Un paquet SCTP contenant un bloc INIT doit avoir le repère de vérification placé à 0.

  • Un bloc SHUTDOWN COMPLETE avec le bit-T placé doit avoir le repère de vérification copié depuis le repère de vérification du bloc SHUTDOWN-ACK.

  • Les paquets contenant le bloc ABORT doivent voir un repère de vérification identique au repère de vérification du paquet responsable du ABORT.

Somme de contrôle - bit 64-95. Une somme de contrôle calculée pour l'ensemble du paquet SCTP basée sur l'algorithme Adler-32. Voir la RFC 2960 - Stream Control Transmission Protocol, index B pour plus d'information au sujet de cet algorithme.

Tous les blocs SCTP ont une disposition spéciale qui fait qu'ils sont tous collés, comme on peut le voir ci-dessus. Ce n'est pas un en-tête réel, mais plutôt une formalisation de ce à quoi il ressemble.

Type - bit 0-7. Ce champ spécifie le bloc type du paquet, par exemple, est-ce un bloc INIT ou SHUTDOWN ? Chaque bloc type possède un numéro spécifique, comme est indiqué dans le tableau ci-dessous. Voici une liste complète des blocs type :

Tableau 2.1. Types SCTP

Numéro de bloc Nom de bloc
0 Données utiles (DATA)
1 Initialisation (INIT)
2 Accusé-réception d'initialisation (INIT ACK)
3 Accusé-réception sélectif (SACK)
4 Requête de détection de collision (HEARTBEAT)
5 Accusé-réception sur requête de détection de collision (HEARTBEAT ACK)
6 Abandon (ABORT)
7 Fermeture (SHUTDOWN)
8 Accusé-réception de fermeture (SHUTDOWN ACK)
9 Erreur d'opération (ERROR)
10 Témoin d'état (COOKIE ECHO)
11 Accusé-réception de témoin (COOKIE ACK)
12 Réservé pour écho de notification de congestion explicite (ECNE)
13 Réservé pour fenêtre de congestion réduite (CWR)
14 Arrêt complet (SHUTDOWN COMPLETE)
15-62 Réservé pour l'IETF
63 IETF-Blocs d'extension définis
64-126 Réservé pour l'IETF
127 IETF - Blocs d'extension définis
128-190 Réservé pour l'IETF
191 IETF - Blocs d'extension définis
192-254 Réservé pour l'IETF
255 IETF - Blocs d'extension définis

Bloc fanions - bit 8-15. Le bloc fanion n'est en général pas utilisé mais il est placé pour une utilisation future. Il existe des blocs fanions spécifiques ou bits d'information qui peuvent être nécessaires pour d'autres correspondants. Selon les spécifications, les fanions sont utilisés seulement dans les paquets DATA, ABORT et SHUTDOWN COMPLETE pour l'instant. Ceci peut changer dans l'avenir.

[Important] Important

Souvent lorsque vous lisez une RFC, vous êtes confrontés à certains vieux problèmes de provenance. La RFC 2960 - Stream Control Transmission Protocol en est un exemple, dans lequel elle spécifie que le bloc fanions devrait toujours être placée à 0 et ignoré à moins qu'il ne soit utilisé pour quelque chose. Ceci est écrit partout. Si vous faîtes du pare-feu ou du routage, prenez garde à ça, car les spécifications de champs peuvent changer dans le futur et causer des problèmes à votre pare-feu sans raison légitime. Ceci survenait avant avec l'implémentation de ECN dans les en-têtes IP par exemple. Voir la section Section 2.3, « En-Têtes IP » de ce chapitre.

Bloc longueur - bit 16-31. C'est le bloc longueur calculé en octets. Il contient tous les en-têtes, y compris le bloc type, le bloc fanions, et le bloc valeur. S'il n'y a pas de bloc valeur, le bloc longueur sera placé à 4 (octets).

Bloc valeur - bit 32-n. Spécifique pour chaque bloc et peut contenir plusieurs fanions et données appartenant au bloc type. Parfois il peut être vide, auquel cas le bloc longueur sera placé à 4.

2.11.3. Bloc SCTP ABORT

Le bloc ABORT est utilisé pour abandonner une association comme décrit dans la section Section 2.10.3, « Arrêt et abandon » de ce chapitre. ABORT apparaît lors d'une erreur irrécupérable dans l'association comme des en-têtes ou des données erronés.

Type - bit 0-7. Toujours placé à 6 pour ce bloc type.

Réservé - bit 8-14. Réservé pour de futurs blocs fanions mais non utilisés pour l'instant. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information sur les blocs fanions.

Bit-T - bit 15. Si ce bit est placé à 0, l'expéditeur avait un TCB associé avec ce paquet qui a été détruit. Si l'expéditeur n'avait pas de TCB le bit-T devrait être placé à 1.

Longueur - bit 16-31. Place la longueur du bloc en octets en incluant les causes d'erreur.

2.11.4. Bloc SCTP COOKIE ACK

Le bloc COOKIE ACK est utilisé pendant l'initialisation de la connexion et jamais en dehors de cette phase dans la connexion. Il doit précéder tous les blocs DATA et SACK mais peut être envoyé dans le même paquet comme premier de tous les paquets.

Type - bit 0-7. Toujours placé à 11 pour ce type.

Blocs fanions - bit 8-15. Non utilisés. Devraient toujours être placés à 0 selon la RFC 2960 - Stream Control Transmission Protocol. Vous devriez toujours vérifier ces comportements spécifiques établis par les RFC car elles peuvent changer dans le futur, et même poser des problèmes à vos pare-feux. La chose est arrivée avec IP et ECN. Voir la section Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Longueur - bit 16-31.Devrait toujours être à 4 (octets) pour ce bloc.

2.11.5. Bloc SCTP COOKIE ECHO

Le bloc COOKIE ECHO est utilisé pendant l'initialisation de la connexion SCTP (par la partie qui répond au témoin envoyé par la partie en réponse dans le champ témoin du paquet INIT ACK.) Ils peuvent être envoyés ensemble avec les blocs DATA dans le même paquet, mais doivent précéder les blocs DATA dans tous les cas.

Type - bit 0-7. Le bloc type est toujours placée à 10.

Bloc fanions - bit 8-15. Ce champ n'est pas utilisé aujourd'hui. La RFC spécifie que les fanions devraient toujours êtres placés à 0, mais ceci peut poser des problèmes comme vous pouvez le voir dans le section Section 2.11.2, « En-tête communs et génériques SCTP » ci-dessus, spécialement l'explication des blocs fanions.

Longueur - bit 16-31. Spécifie la longueur du bloc, incluant le type, le bloc fanions, les champs longueur et témoin en octets.

Témoin - bit 32n. Ce champ contient le témoin envoyé dans le bloc INIT ACK prédédent. Il doit être identique au témoin envoyé par la partie correspondante pour pouvoir ouvrir la connexion. La RFC 2960 - Stream Control Transmission Protocol spécifie que le témoin devrait être aussi petit que possible pour assurer l'interopérabilité, ce qui est assez vague.

2.11.6. Bloc SCTP DATA

Les blocs DATA sont utilisés pour envoyer des données dans le flux et possèdent des en-têtes plutôt complexes par certains côtés, mais pas vraiment pires que les en-têtes TCP en général. Chaque bloc DATA peut faire partie d'un flux différent, car chaque connexion SCTP peut traiter plusieurs flux différents.

Type - bit 0-7. Le champ type devrait toujours être placé à 0 pour les blocs DATA.

Réservé - bit 8-12. Pas utilisé aujourd'hui. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bit-U - bit 13. Le bit U est utilisé pour indiquer s'il y a un bloc DATA désordonné. Si c'est le cas, le numéro d'inter-classement du flux de données doit être ignoré par le destinataire et les données envoyées au niveau de la couche la plus haute sans délai ni essai de réordonnancement des blocs DATA.

Bit-B - bit 14. Le bit B est utilisé pour indiquer le début d'un bloc DATA fragmenté. Si ce bit est placé et le bit E (final) n'est pas placé, ceci indique que c'est le premier fragment d'un bloc qui a été fragmenté en plusieurs blocs DATA.

Bit E - bit 15. Le bit E indique la fin d'un bloc DATA fragmenté. Si ce fanion est envoyé sur un bloc, il signale au destinataire SCTP qu'il peut démarrer le réassemblage des fragments et les passer sur la couche la plus haute. Si le paquet possède les bits B et E placés à 0, il signale que le bloc est semi-fragmenté. Si les deux bits B et E sont placés à 1 ceci indique que le paquet est défragmenté et ne nécessite pas de réassemblage.

Longueur - bit 16-31. La longueur du bloc DATA complet calculé en octets, incluant le champ bloc type jusqu'à la fin du bloc.

TSN - bit 32-63. Le TSN (Transmission Sequence Number - numéro d'ordre d'inter-classement de transmission) est envoyé dans le bloc DATA, et l'hôte destinataire utilise TSN pour accuser-réception que le bloc est arrivé correctement en renvoyant un bloc ACK. C'est une donnée générale pour l'association SCTP complète.

Identifiant de flux - bit 64-79. L'identifiant de flux est envoyé avec le bloc DATA pour identifier avec quel flux le bloc DATA est associé. Ceci est utilisé depuis que SCTP peut transporter plusieurs flux dans une association unique.

Numéro d'ordre d'inter-classement de flux - bit 80-95. C'est le numéro d'ordre d'inter-classement du bloc du flux spécifique identifié par l'identifiant de flux. Le numéro d'ordre d'inter-classement est spécifique pour chaque identifiant de flux. Si un bloc a été fragmenté, le numéro d'ordre d'inter-classement doit être le même pour tous les fragments du bloc d'origine.

Identifiant de protocole données utiles - bit 96-127. Cette valeur est renseignée dans les couches les plus hautes, ou les applications utilisant le protocole SCTP pour identifier le contenu de chaque bloc DATA. Le champ doit toujours être envoyé. Si la valeur est placée à 0, c'est qu'elle n'était pas placée dans les plus hautes couches.

Donnée utilisateur - bit 128n. Donnée que transporte le bloc. Elle peut être variable en longueur, finissant par un octet identique. Ce sont les données à l'intérieur du flux comme spécifié par le numéro d'ordre d'inter-classement N dans le flux S.

2.11.7. Bloc SCTP ERROR

Le bloc ERROR est envoyé pour informer le correspondant d'un problème dans le flux. Chaque bloc ERROR, peut contenir une ou plusieurs causes d'erreurs, lesquelles sont détaillées dans la RFC 2960 - Stream Control Transmission Protocol. Je n'irai pas plus dans le détail que les blocs ERROR de base, car ça nécessite trop d'information. Le bloc ERROR n'est pas fatal en lui-même, mais il détaille une erreur qui est survenue. Il peut cependant être utilisé avec un bloc ABORT pour informer le correspondant de l'erreur avant de couper la connexion.

Type - bit 0-7. Cette valeur est toujours placée à 9 pour les blocs ERROR.

Bloc fanions - bit 8-15. Non utilisé actuellement. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Longueur - bit 16-31. Spécifie la longueur du bloc en octets, incluant toutes les causes d'erreurs.

Causes d'erreur - bit 32-n. Chaque bloc ERROR peut contenir une ou plusieurs causes d'erreur, lesquelles avertissent le correspondant d'un problème dans la connexion. Chaque cause d'erreur est d'un format spécifique, comme décrit dans la RFC 2960 - Stream Control Transmission Protocol. Nous n'irons pas plus loin ici, sauf pour indiquer qu'ils contiennent tous un code de cause, une longueur de cause et un champ d'information spécifique. Les causes d'erreur suivantes sont possibles :

Tableau 2.2. Causes d'erreur

Valeur cause Code bloc
1 Identifiant de flux de données invalide
2 Paramètre de données obligatoires absent
3 Erreur de témoin
4 Hors service
5 Adresse non résolvable
6 Bloc Type inconnu
7 Paramètre de données obligatoires invalide
8 Paramètres non reconnus
9 Absence de données utilisateur
10 Témoin reçu pendant une fermeture

2.11.8. Bloc SCTP HEARTBEAT

Le bloc HEARTBEAT est envoyé par un des correspondants pour vérifier si une adresse finale SCTP est active. Envoyé aux différentes adresses négociées durant la phase d'initialisation de l'association pour vérifier qu'elles sont toujours actives.

Type - bit 0-7. Le type est toujours placé à 0 pour les blocs HEARTBEAT.

Bloc fanions - bit 8-15. Non utilisé aujourd'hui. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Longueur - bit 16-31. Longueur du bloc complet, incluant l'information Heartbeat TLV.

Information Heartbeat TLV - bit 32-n. C'est un paramètre de longueur variable comme défini dans la RFC 2960 - Stream Control Transmission Protocol. C'est un paramètre de données obligatoires pour les blocs HEARTBEAT qui contient trois champs, info type = 1, info longueur et un paramètre d'information Heartbeat spécifique-expéditeur. Le dernier champ devrait être un champ d'information spécifique expéditeur, par exemple, le temps passé depuis l'envoi du Heartbeat jusqu'à l'adresse IP de destination. Ensuite il est retourné un bloc HEARTBEAT ACK.

2.11.9. Bloc SCTP HEARTBEAT ACK

Le HEARTBEAT ACK est utilisé pour accuser réception qu'un HEARTBEAT a été reçu et que la connexion fonctionne correctement. Le bloc est toujours envoyé à la même adresse IP à l'origine de la requête.

Type - bit 0-7. Toujours placé à 5 pour les blocs HEARTBEAT ACK.

Bloc fanions - bit 8-15. Non utilisé aujourd'hui. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bloc longueur - bit 16-31. La longueur du bloc HEARTBEAT ACK, incluant l'information Heartbeat TLV, calculé en octets.

Information Heartbeat TLV - bit 32-n. Ce champ doit contenir le paramètre Heartbeat Information envoyé au bloc HEARTBEAT d'origine.

2.11.10. Bloc SCTP INIT

Le bloc INIT est utilisé pour initialiser une nouvelle association avec un hôte destinataire, c'est le premier bloc à être envoyé par l'hôte qui initialise la connexion. Le bloc INIT contient plusieurs données obligatoires fixant les paramètres de longueur, et certains paramètres optionnels de longueur variable. Les paramètres de données obligatoires de longueur sont déjà dans les en-têtes ci-dessus, et correspondent au témoin d'émission, avertissement du crédit de fenêtre, nombre de flux sortants, nombre de flux entrants et TSN initial. Après ceci vient un couple de paramètres optionnels, lesquels seront présentés dans le paragraphe des paramètres optionnels ci-dessous.

Type - bit 0-7. Le champ type est toujours placé à 1 pour les blocs INIT.

Bloc fanions - bit 8-15. Non utilisé aujourd'hui. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bloc longueur - bit 16-31. Le bloc longueur est la longueur du paquet complet, incluant tout dans les en-têtes, ainsi que les paramètres optionnels.

Témoin d'émission - bit 32-63. Le témoin d'émission est placé dans le bloc INIT et doit être utilisé par le destinataire pour accuser réception de tous les paquets, dans le témoin de vérification de l'association établie. Le témoin d'émission peut prendre toutes les valeurs sauf 0. Si la valeur est à 0, le destinataire doit réagir en émettant un ABORT.

Avertissement de crédit d'ouverture de fenêtre (a_rwnd) - bit 64-95. C'est le tampon minimum de réception que l'expéditeur d'un bloc INIT allouera pour cette association, en octets. Ceci peut alors être utilisé par le destinataire d'un a_rwnd pour savoir combien de données il peut envoyer sans être en SACK. Cette fenêtre ne devrait pas être diminuée, mais elle peut l'être en envoyant un nouveau a_rwnd dans un bloc SACK.

Nombre de flux sortants - bit 96-111. Spécifie le nombre maximum de flux sortants que l'hôte expéditeur désire envoyer au destinataire. La valeur ne doit pas être 0, et si c'est le cas, le destinataire devra faire un ABORT sur l'association immédiatement. Il n'y a pas de négociation sur le nombre minimum de flux sortants, il est simplement placé au niveau le plus bas que le correspondant a placé dans l'en-tête.

Nombre de flux entrants - bit 112-127. Spécifie le nombre maximum de connexions entrantes que l'expéditeur permet pour créer l'association. Il ne doit pas être placé à 0, ou le destinataire devra faire un ABORT sur la connexion. Il n'y a pas de négociation sur le nombre minimum de flux entrants, il est simplement placé au niveau le plus bas que le correspondant a placé dans l'en-tête.

TSN Initial - bit 128-159. Cette valeur place le TSN (Transmit Sequence Number) que l'expéditeur utilisera lors de l'envoi des données. Le champ peut être mis à la même valeur que le repère d'initialisation.

Au sommet des données obligatoires de longueur d'en-têtes, il existe certains paramètres de longueur variables, et au moins un des paramètres IPv4 et IPv6 ou nom d'hôte doit être placé. Un seul nom d'hôte doit être indiqué, et si le nom d'hôte est placé, aucun paramètre IPv4 ou IPv6 ne doit être placé. Des paramètres multiples IPv4 ou IPv6 peuvent être placés dans le même bloc INIT. Ces paramètres sont utilisés pour déterminer quelle adresse sera utilisée pour se connecter au destinataire dans l'association. Ci-dessous la liste complète des paramètres variables dans le bloc INIT :

Tableau 2.3. Paramètres variables INIT

Nom du paramètre Statuts Valeur type
Adresse IPv4 Optionnelle 5
Adresse IPv6 Optionnelle 6
Protection témoin Optionnelle 9
Adresse de nom d'hôte Optionnelle 11
Types d'adresses supportées Optionnelle 12
Réservé pour possibilité ECN Optionnelle 32768

Ci-dessous nous décrivons les trois paramètres les plus communs utilisés dans le bloc INIT.

Le paramètre IPv4 est utilisé pour envoyer une adresse IPv4 au bloc INIT. L'adresse IPv4 peut être utilisée pour envoyer des données dans l'association. Des adresses IPv4 et IPv6 multiples peuvent spécifiées dans une association SCTP unique.

Paramètre Type - bit 0-15. Toujours placé à 5 pour les paramètres d'adresses IPv4.

Longueur - bit 16-31. Toujours placé à 8 pour les paramètres d'adresses IPv4.

Adresse IPv4 - bit 32-63. Adresse IPv4 d'envoi de fin.

Ce paramètre est utilisé pour envoyer les adresses IPv6 dans le bloc INIT. Ces adresses peuvent servir à contacter le destinataire de cette association.

Type - bit 0-15. Toujours placé à 6 pour les paramètres IPv6.

Longueur - bit 16-31. Toujours placé à 20 pour les paramètres IPv6.

Adresse IPv6 - bit 32-159. Adresse IPv6 de l'expéditeur qui peut être utilisée pour la connexion par le destinataire.

Le paramètre Nom d'hôte est utilisé pour envoyer un Nom d'hôte unique comme adresse. Le destinataire doit alors vérifier le Nom d'hôte et utiliser certaines, ou toutes, les adresses qu'il reçoit de cet expéditeur. Si un paramètre Nom d'hôte est envoyé, aucun autre paramètre IPv4 ou IPv6 ou un autre Nom d'hôte ne doit être envoyé.

Type - bit 0-15. Toujours placé à 11 pour les paramètres Nom d'hôte.

Longueur - bit 16-31. Longueur du paramètre complet, y compris les champs type, longueur et Nom d'hôte. Le champ Nom d'hôte est de longueur variable. Elle est comptée en octets.

Nom d'hôte - bit 32-n. Paramètre de longueur variable contenant un Nom d'hôte. Ce Nom d'hôte est résolu par le destinataire qui reçoit les adresses qui pourront être utilisées pour contacter l'expéditeur.

2.11.11. Bloc SCTP INIT ACK

Le bloc INIT ACK est envoyé en réponse à un bloc INIT et contient à la base les mêmes en-têtes, mais avec les valeurs du destinataire du bloc INIT d'origine. De plus, il possède deux variables longueur supplémentaires, les paramètres état cookie et le paramètre non-reconnu.

Type - bit 0-7. Cet en-tête est toujours placé à 2 pour les blocs INIT ACK.

Bloc fanions - bit 8-15. Non utilisé aujourd'hui. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bloc longueur - bit 16-31. Le bloc longueur représente la longueur de l'ensemble du paquet, y compris tout ce que contiennent les en-têtes, et les paramètres optionnels.

Repère d'émission - bit 32-63. Le destinataire du repère d'émission du bloc INIT ACK doit sauvegarder cette valeur et la copier dans le champ repère de vérification de chaque paquet qu'il envoie à l'expéditeur du bloc INIT ACK. Le repère d'émission ne doit pas être placé à 0, et si c'est le cas, le destinataire du bloc INIT ACK doit fermer la connexion par un ABORT.

Publication de réception de crédit de fenêtre (a_rwnd) - bit 64-95. Les tampons dédiés que l'expéditeur de ce bloc a placé pour le trafic, compté en octets. Les tampons dédiés ne devraient pas être inférieurs ou supérieurs à ces valeurs.

Nombre de flux sortants - bit 96-111. Combien de flux sortants l'expéditeur désire créer. Ne doit pas être à 0, sinon le destinataire du INIT ACK doit faire un ABORT sur l'association. Il n'y a pas de négociation sur le nombre minimum de flux sortants, c'est simplement placé au niveau le plus bas que chaque hôte a mis dans l'en-tête.

Nombre de flux entrants - bit 112-127. Combien de flux entrants l'expéditeur final consent à accepter. Ne doit pas être à 0, sinon le destinataire du INIT ACK devra faire un ABORT sur l'association. Il n'y a pas de négociation sur le nombre minimum des flux entrants, simplement placé au niveau le plus bas que chaque hôte a mis dans l'en-tête.

TSN Initial - bit 128-159. Numéro de séquence de transmission initial qui sera utilisé par la partie expéditrice de l'association au démarrage.

Après cela, le bloc INIT ACK continue avec des paramètres optionnels de longueur variable. Ces paramètres sont exactement les mêmes que pour le bloc INIT, à l'exception de l'ajout des paramètres état cookie et paramètre inconnu, et la suppression du paramètre Type d'Adresses Supportées. Cette liste ressemble à ceci :

Tableau 2.4. Variables des paramètres INIT ACK

Nom de paramètre Status Type de valeur
Adresse IPv4 Optionnel 5
Adresse IPv6 Optionnel 6
État Cookie Obligatoire 7
Paramètre inconnu Optionnel 8
Conservateur de cookie Optionnel 9
Nom adresse de l'hôte Optionnel 11
Reservé pour ECN Optionnel 32768

L'état cookie est utilisé dans l'INIT ACK pour envoyer un cookie au destinataire, et jusqu'à ce que ce destinataire ait répondu par un bloc COOKIE ECHO, l'association n'est pas garantie. Ceci pour prévenir une attaque SYN dans le protocole TCP.

Type - bit 0-15. Toujours placé à 7 pour tous les paramètres état cookie.

Longueur - bit 16-31. La taille du paramètre complet, y compris le type, la longueur et le champ état cookie en octets.

État Cookie - bit 31-n. Ce paramètre contient un cookie de longueur variable. Pour une description voir la RFC 2960 - Stream Control Transmission Protocol.

2.11.12. Bloc SCTP SACK

Le bloc SACK est utilisé pour indiquer à l'expéditeur de blocs DATA quels blocs ont été reçus et à quel endroit il y a eu un trou dans le flux, basé sur les TSN reçus. Le bloc SACK accuse réception qu'il a reçu les données jusqu'à un certain point (paramètre TSN Ack cumulé), et ajoute ensuite des blocs Gap Ack pour toutes les données qu'il a reçues après le point TSN Ack cumulé. Un bloc SACK ne doit pas être envoyé plus d'une fois pour chaque bloc DATA qui est reçu.

Type - bit 0-7. Cet en-tête est toujours placé à 3 pour les blocs SACK.

Bloc fanions - bit 8-15. Non utilisé aujourd'hui. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bloc longueur - bit 16-31. Le bloc longueur est la longueur du bloc complet, y compris tous les en-têtes et tous les paramètres.

TSN Ack cumulé - bit 32-63. C'est le paramètre TSN Ack cumulé qui est utilisé pour accuser réception des données. Le destinataire du bloc DATA utilisera ce champ pour indiquer à l'expéditeur qu'il a reçu toutes les données jusqu'à cette étape de l'association. Ensuite, toutes les données qui n'ont pas été spécifiquement accusées réception par les blocs Gap Ack seront, en gros, considérées comme perdues.

Avertissement de réception de crédit de fenêtre (a_rwnd) - bit 64-95. Le champ a_rwnd est le même que le a_rwnd des blocs INIT et INIT ACK, mais peut être utilisé pour augmenter ou diminuer la valeur a_rwnd. Voir la RFC 2960 - Stream Control Transmission Protocol à ce sujet.

Nombre de blocs Gap Ack - bit 96-111. Le nombre de Gap Ack listés dans ce bloc. Chaque Gap Ack prend plus de 32 bits dans le bloc.

Nombre de TSN dupliqués - bit 112-127. Le nombre de blocs DATA qui ont été dupliqués. Chaque TSN dupliqué est listé après les Gap Ack dans le bloc, et chaque TSN prend 32 bits.

Gap Ack Block #1 Start - bit 128-143. Premier Gap Ack Block dans le bloc SACK. S'il n'y a pas de trous dans les numéros TSN des blocs DATA reçus, il n'y aura pas de Gap Ack Block du tout. Cependant, si les blocs DATA sont reçus en désordre ou si certains blocs DATA sont perdus pendant le transfert vers le destinataire, il y aura des trous. Ces trous seront rapportés par les Gap Ack Block. Le point de démarrage du Gap Ack Block est calculé par l'ajout du paramètre Gap Ack Block Start à la valeur TSN cumulée.

Gap Ack Block #1 End - bit 144-159. Cette valeur rapporte la fin du premier Gap Ack Block du flux de données. Tous les blocs DATA avec le TSN entre le Gap Ack Block Start et le Gap Ack Block End ont été reçues. La valeur du Gap Ack Block End est ajoutée au TSN cumulé, comme le paramètre Start, pour obtenir le dernier TSN.

Gap Ack Block #N Start - bits variables. Pour chaque Gap Ack Block compté dans le paramètre nombre de Gap Ack Blocks, un Gap Ack Block est ajouté, jusqu'au N block final. C'est-à-dire, si le nombre de Gap Ack Blocks = 2, il y aura deux Gap Ack Blocks dans le bloc SACK. Il contient le même type de valeur que le Gap Ack Block #1 Start.

Gap Ack Block #N End - bits variables. Identique au Gap Ack Block #N Start mais pour la fin du Gap.

TSN #1 dupliqué - bits variables. Ce champ rapporte un TSN dupliqué, ce qui indique que nous avons déja reçu un bloc spécifique, mais que nous recevons de nouveau le même TSN plusieurs fois. Ceci étant dû soit à un problème de routeur (qui retransmet des données déja envoyées) soit un cas de retransmission de l'expéditeur, ou encore d'autres possibilités. Chaque cas de TSN dupliqué devrait être rapporté. Par exemple, si 2 TSN dupliqués ont été reçus après le premier accusé-réception, chacun de ces TSN dupliqués devrait être envoyé dans le message SACK suivant. Si un TSN dupliqué apparaît encore après le second ACK envoyé, les nouveaux TSN dupliqués seront ajoutés dans le message ACK suivant, et ainsi de suite.

TSN #X dupliqué - bits variables. C'est le dernier paramètre TSN dupliqué, qui contient le même type d'information que le premier paramètre.

2.11.13. Bloc SCTP SHUTDOWN

Le bloc SHUTDOWN apparaît quand un des points terminaux d'une connexion désire fermer l'association en cours. La partie qui envoie doit vider tous ses tampons avant d'expédier le bloc SHUTDOWN, et ne doit pas envoyer d'autres blocs DATA ensuite. Le destinataire doit également vider ses tampons d'envoi et ensuite expédier le bloc SHUTDOWN ACK correspondant.

Type - bit 0-7. Cet en-tête est toujours placé à 7 pour les blocs SHUTDOWN.

Bloc fanions - bit 8-15. Non utilisé actuellement. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bloc longueur - bit 16-31. Ce bloc est la longueur du paquet complet, incluant le paramètre TSN Ack cumulé. La longueur du bloc SHUTDOWN devrait toujours être à 8.

TSN Ack cumulé - bit 32-63. C'est le champ TSN Ack cumulé, le même que dans le bloc SACK. Le TSN Ack cumulé accuse réception du dernier TSN reçu dans la séquence de l'expéditeur. Ce paramètre ne doit pas, comme pour la suite du bloc SHUTDOWN, accuser réception des Gap Ack Blocks. L'absence de Gap Ack Block dans le bloc SHUTDOWN qui a été accusé-réception précédemment ne doit pas être interprété comme si le bloc accusé-réception précédent était perdu.

2.11.14. Bloc SCTP SHUTDOWN ACK

Le bloc SHUTDOWN ACK est utilisé pour accuser réception d'un bloc SHUTDOWN reçu. Avant que le bloc SHUTDOWN ACK soit envoyé, toutes les données dans les tampons d'envoi doivent être expédiées, les tampons ne doivent plus accepter aucune donnée provenant de l'application. SCTP ne supporte pas les connexions semi-ouvertes à l'inverse de TCP.

Type - bit 0-7. Cet en-tête est toujours placé à 8 pour les blocs SHUTDOWN ACK.

Bloc fanions - bit 8-15. Non utilisé actuellement. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

Bloc longueur - bit 16-31. C'est la longueur du bloc complet. Cette longueur du bloc SHUTDOWN ACK devrait toujours être placée à 4.

2.11.15. Bloc SCTP SHUTDOWN COMPLETE

Le bloc SHUTDOWN COMPLETE est envoyé, par l'expéditeur du SHUTDOWN, en réponse au bloc SHUTDOWN ACK. Il est expédié pour accuser réception que l'association est totalement fermée.

Type - bit 0-7. Toujours placé à 7 pour les blocs SHUTDOWN COMPLETE.

Réservé - bit 8-14. Non utilisé actuellement. Voir Section 2.11.2, « En-tête communs et génériques SCTP » pour plus d'information.

T-bit - bit 15. Le T-bit n'est pas placé, pour indiquer que l'expéditeur a un TCB (Transmission Control Block) associé avec la connexion et qu'il est détruit. Si le T-bit était placé, il n'y aurait pas de TCB à détruire.

Longueur - bit 16-31. Toujours placé à 4 pour les blocs SHUTDOWN COMPLETE, car le bloc ne doit jamais être plus long, aussi longtemps que les standards l'admettent.