2.10. Caractéristiques SCTP

Stream Control Transmission Protocol (SCTP) est un protocole relativement nouveau, mais qui se développe beaucoup et vient en complément des protocoles TCP et UDP. Il possède un aussi haut niveau de fiabilité que TCP, mais utilise moins de temps système.

SCTP possède des fonctionnalités très intéressantes. Pour ceux qui veulent en savoir plus, voir la RFC 3286 - An Introduction to the Stream Control Transmission Protocol et la RFC 2960 - Stream Control Transmission Protocol. Le premier document est une introduction à SCTP. Le second est la spécification du protocole, ce qui vous intéressera peut être moins sauf si vous êtes programmeur de ce protocole.

Ce protocole fut à l'origine développé pour la téléphonie sur IP, ou voix sur IP (VoIP), et possède certains attributs intéressants qui en proviennent. Le niveau de l'industrie VoIP requiert une très haute fiabilité, ce qui veut dire une grande faculté de récupération pour gérer les différentes sortes de problèmes. Ci-dessous une liste des fonctionnalités de base de SCTP.

  • Envoi individuel avec propriétés de Multidiffusion . Ceci indique que c'est un protocole "point-to-point" mais avec la possibilité d'utiliser plusieurs adressages pour le même destinataire. En d'autres termes, il peut utiliser différents chemins pour joindre le destinataire. TCP, en comparaison, coupe si le chemin s'interrompt, sauf si le protocole IP corrige cela.

  • Transmission fiable. Il utilise les sommes de contrôle et SACK pour détecter les données corrompues, endommagées, dupliquées ou réordonnées. Il peut ensuite retransmettre les données si nécessaire. C'est à peu près comme TCP, mais SCTP est plus tolérant pour le réordonnancement des données et permet un captage plus rapide.

  • Orienté message. Chaque message peut être mis en trames et donc vous pouvez garder la structure et ordonner le flux de données. TCP est orienté octet et tout ce que vous obtenez est un flux d'octets sans aucun ordre entre les différentes données. Vous avez donc besoin d'une couche d'abstraction dans TCP.

  • Adaptatif au débit. Il est développé pour collaborer et coexister avec TCP au niveau de la bande passante. Il l'augmente ou la réduit en fonction des conditions de charge du réseau comme TCP. Il a aussi le même algorithme pour les démarrages lents quand les paquets sont perdus. ECN est également supporté.

  • Rattachement multiple. Comme mentionné précédemment, SCTP est capable de mettre en place différents noeuds terminaux directement dans le protocole, et donc de ne pas avoir a relayer sur la couche IP pour la récupération.

  • Multi-flux. Permet le multi-flux simultané dans un même flux, d'où le nom Stream Control Transmission Protocol (Protocole de Contrôle de Transmission de Flux). Un flux unique peut, par exemple, être ouvert pour télécharger une simple page web, et ainsi les images et documents html seront chargés dans le même flux simultanément. Ou pourquoi pas un protocole de bases de données qui créera un contrôle de flux séparé et ensuite utilisera plusieurs flux pour recevoir les sorties des différentes requêtes simultanément.

  • Initialisation de connexion. 4 paquets d'initialisation de connexion où les paquets 3 et 4 peuvent être utilisés pour envoyer des données. L'équivalent des témoins de synchronisation (NdT. syncookies) est implémenté par défaut pour éviter les attaques en Déni de Service (NdT.DoS). Résolution des collisions INIT pour éviter plusieurs connexions SCTP simultanées.

Cette liste pourrait être plus longue. La plupart de ces informations est tirée de la RFC 3286 - An Introduction to the Stream Control Transmission Protocol.

[Note] Note

En terme de SCTP nous parlons de blocs d'information (chunks), pas de paquets ni de fenêtres, (NdT. nous parlerons dorénavant de "bloc". Un bloc consistant en un en-tête et un contenu spécifique. Voir la RFC 2960). Une trame SCTP peut contenir plusieurs blocs différents car le protocole est orienté message. Un bloc peut être soit un bloc de contrôle soit un bloc de données. Le bloc de contrôle est utilisée pour contrôler la session, et le bloc de données pour envoyer les données.

2.10.1. Initialisation et association

Chaque connexion est initialisée en créant une association entre les deux hôtes qui désirent entrer en contact. Cette association est initialisée quand un utilisateur en a besoin.

Cette initialisation est réalisée par 4 paquets. Le premier, un bloc INIT, est envoyé, en réponse il reçoit un INIT ACK contenant un témoin (cookie), ensuite la connexion peut démarrer en envoyant les données. Cependant, deux paquets supplémentaires sont envoyés. Le témoin reçoit en réponse un bloc COOKIE ECHO, lequel reçoit enfin un bloc COOKIE ACK.

2.10.2. Envoi de données et contrôle de session

SCTP, à ce niveau, peut envoyer des données. Dans SCTP il existe des blocs de contrôle et des blocs de données, comme vu précédemment. Les blocs de données sont envoyés en utilisant le bloc DATA, auquel il est répondu par un bloc SACK. Ça fonctionne pratiquement de la même façon que TCP SACK. Les blocs SACK sont des blocs de contrôle.

Au dessus de tout ça, il existe d'autres blocs de contrôle. Les blocs HEARTBEAT et HEARTBEAT ACK d'un côté, et les blocs ERROR de l'autre. Les blocs HEARTBEAT sont utilisées pour conserver la connexion active, et les blocs ERROR sont utilisés pour informer des divers problèmes ou erreurs de connexion, comme un id de flux invalide ou des paramètres de données obligatoires absents, etc.

2.10.3. Arrêt et abandon

La connexion est finalement fermée soit par un bloc ABORT soit plus "poliment" par un bloc SHUTDOWN. SCTP ne possède pas d'état semi-fermé comme TCP, un côté ne peut pas continuer à envoyer des données tandis que l'autre a fermé.

Quand un utilisateur/application désire fermer le socket SCTP de façon courtoise, il appelle le protocole SHUTDOWN. SCTP envoie alors toutes les données encore dans ses mémoires tampon, et ensuite envoie un bloc SHUTDOWN. Quand le destinataire reçoit le SHUTDOWN, il stoppera l'acceptation des données provenant de l'application et cessera d'envoyer des données. Une fois obtenu tous les SACK pour les données, il enverra un bloc SHUTDOWN ACK, et une fois que le côté qui ferme la connexion a reçu ce bloc, il répondra par un bloc SHUTDOWN COMPLETE. La session est maintenant complètement fermée.

Une autre façon de fermer une connexion est d'utiliser ABORT. Mais c'est un moyen pas très poli de supprimer une association SCTP. Quand une des deux parties désire arrêter une association SCTP instantanément, elle envoie un bloc ABORT avec toutes les valeurs correctes signées. Toutes les données dans les tampons seront déchargées et l'association terminée. Le destinataire fera de même après vérification du bloc ABORT.