ELO 330: Programacion de Sistemas
Proyecto Grupal
SCTP: Stream Control Transmicion Protocol

Que es SCTP?

El protocolo SCTP (Stream Control Tranmission Protocol), es un nuevo protocolo para el control de la transmisión que funciona a la altura de capa de aplicación. Fue definido por el grupo SIGTRAN de IETF en el año 2000, quedando registro de esto en la RFC2960. Este protocolo es posee algunas características similares a sus pares UDP y TCP, pero además reúne otras características y otras funcionalidades prácticas como el multi-homing y el multi-streaming, mejorar en seguridad entre otras cosas que lo hacen un protocolo más confiable y probablemente un protocolo que a futuro desplace a UDP y TCP. El protocolo SCTP es orientado al mensaje a diferencia de TCP que es orientado a la conexión.

Porque usar SCTP

Los dos protocolos más populares de transmisión utilizados en la actualidad son el TCP y UDP, el protocolo TCP es confiable y garantiza el envío y la recepción ordenada de los segmentos manejando de una buena forma la congestión de la red, UDP es un protocolo no orientado a la conexión u orientado a la transmisión por lo que no garantiza el envío y la recepción ordenada ni la congestión de la red, sino que solo transmite los mensajes sin importar si estos llegan o no.
El protocolo SCTP es capaz de funcionar de ambas formas dependiendo si se usa en el tipo de conexión one-to-one donde se emula una conexión TCP o one-to-many donde se trabaja en un estilo más parecido a UDP. Además de esto, el protocolo SCTP agrega un sin número de funcionalidades, que se detallan más adelante, que hacen que este protocolo sea más confiable, más seguro y más flexible que sus pares independiente del modo en que se use. Estas funcionalidades son las siguientes:

 

-          Soporte de multihoming

-          Soporte de multistreaming

-          Provee servicio de mensaje no ordenados y confiables (Ordering)

-          Los limites de los mensajes son preservados (Message Boundary)

-          Servicio de confiabilidad parcial (Partial Reliable)

-          Mejoras en seguridad (Security)

 

 

Estructura del paquete SCTP

El paquete SCTP consiste de una cabecera común seguida de una pila de bloques llamados chunks. A su vez, cada chunk posee su propia estructura la cual consiste en varios campos de información. A continuación se muestra un paquete SCTP completo, además de una breve descripción de cada campo que aquí aparece. La estructura de un paquete SCTP es la siguiente:

 

 

La cabezera común o SCTP Common Header está compuesta por los siguientes campos:

-          Source Port: Indica el puerto fuente de la asociación.

-          Destination Port: Indica el puerto destino de la asociación.

-          Verification Tag: Valor aleatorio escogido por el cliente y el servidor de forma independiente uno de otro. Su utilidad es discriminar entre una asociación y otra, como también otros temas de seguridad

-          Checksum CRC: Chequeo de datos CRC. Este chequeo se realiza al paquete completo  (SCTP Common Header y los chunks).

 

 Ademas, cada chunk posee los siguientes campos:

-          Chunk Type: Indica el tipo de chunk que se va a enviar. Los tipos de chunks según su type se muestran más adelante.

-          Chunk Flags: Indica el flag que posee cada chunk. Este valor depende del chunk type debido a que cada tipo posee sus propios flags. En caso por ejemplo de un chunk de Data, sus flags indican si es que es el primer segmento del mensaje, el ultimo o si es que los datos deben ser enviados en orden.

-          Chunk Length: Largo del Chunk completo en bytes.

-          Chunk Data: Data que se enviara por el chunk.

 

Algunos Chunk types:

-          DATA (0x00)

-          INITIATION [INIT] (0x01)

-          INITIATION-ACKNOWLEDGMENT [INIT-ACK] (0x02)

-          SELECTIVE-ACKNOWLEDGMENT [SACK] (0x03)

-          HEARTBEAT (0x04)

-          HEARTBEAT-ACKNOWLEDGMENT [HEARTBEAT-ACK] (0x05)

-          ABORT (0x06)

-          SHUTDOWN (0x07)

-          SHUTDOWN-ACKNOWLEGMENT [SHUTDOWN-ACK] (0x08)

-          OPERATIONAL-ERROR [ERROR] (0x09)

-          COOKIE-ECHO (0x0A)

-          COOKIE-ACKNOWLEDGMENT [COOKIE-ACK] (0x0B)

-          EXPLICIT CONGESTION NOTIFICATION ECHO [ECNE] (0x0C)

-          CONGESTION WINDOW REDUCE [CWR] (0x0D)

-          SHUTDOWN-COMPLETE (0x0E)

 

HandShake

El handshake es de 4 pasos en este protocolo, los que corresponden al  init (cliente a servidor), init-ack (servidor a cliente), cookie echo (cliente a servidor) y finalmente cookie-ack (servidor a cliente).
Lo importante de esto es que cuando el servidor envía el init-ack, dentro de este mensaje va una cookie con toda la información de seguridad, para que cuando un cliente envié el cookie- echo en ella venga devuelta la misma cookie con la información entregada por el servidor, y así se identifique correctamente al cliente como el que mando la solicitud de conexión.
Otra ventaja en cuanto a seguridad de este handshake, es que cuando el servidor envía el init-ack, no se queda en espera de respuesta por parte del cliente, por lo que no existe un tiempo de espera ni tampoco se le reservan recursos antes de tiempo.

Otra particularidad es que desde el envió del cookie-echo por parte del cliente,  se pueden enviar datos dentro de este mensaje, si es que el tamaño de la información enviada (tamaño del chunk) cabe en el espacio “sobrante”.

 

Opciones de Orden

TCP básico contiene una sola forma de transmisión. La cual es ordenada y descarta todos los paquetes que no lleguen en orden. Este sistema en si no es muy práctico ya que una pérdida de 1 paquete puede desencadenar la perdida de muchos más.

Problemas de orden TCP

SCTP propone alternativas. La cual puede trabajar de forma no ordenada usando canales o mejor dicho MultiStream. Aunque cada canal mantiene conceptos de sistema ordenado, y generando los mismos tipos de perdidas, el sistema total de los canales no es ordenado.

Ejemplo, suponemos la transferencia de 4 paquetes, y se transfieren en 4 canales diferentes. La pérdida de uno de estos paquetes no daña la transferencia de los otros y el orden de llegada de los paquetes puede variar. Pero la pérdida de un paquete puede causar la perdida de los paquetes posteriores destinados a su mismo canal.

 

MultiStreaming

El multistreaming se refiere a que, cuando existe una conexión entre cliente y servidor, esta, se puede subdividir en un número arbitrario de streams, en el que cada uno actúa como un canal independiente de transmisión de datos. Esto es particularmente útil en ciertos casos, como por ejemplo, si se desea cargar una pagina web, en la que se envía por un stream el texto, por el otro una imagen, por otro, un video, al perderse el mensaje que contiene el texto,  de todas formas se cargara el resto de la pagina (el video y la imagen).
Además que si se pierde un mensaje independiente del stream, los demás seguirán con el envió normal de sus mensajes.

 

Flujo de informacion en stream

Multi Homing

Multihoming, es que un cliente o servidor pueden tener acceso a la red por mas de un punto de salida, es decir, por ejemplo, si un cliente se puede conectar a un servidor mediante wifi o cable, SCTP puede gestionar la conexión por medio de ambos caminos, creara dos conexiones por la cual el cliente le puede enviar mensajes al servidor, pero elegirá siempre la conexión mas rápida para el envió de esta  información.
A estos distintos “caminos” para el envió de mensajes, se le denomina asociaciones, las que están compuestas por 2 IP y 2 puertos. Puede haber una infinidad de asociaciones entre hosts, dependerá solo de cuantas salidas tienen hacia la red.
En caso de que la conexión primaria fallara (conexión mas rápida), se enviaran los datos por la siguiente asociación mas veloz.
Otra particularidad, si se pierde un mensaje, este será retransmitido por otra vía, ya que el protocolo asume esta perdida como un problema de la conexión, como por ejemplo, congestión de ella.

 

Caso de error de envio

 

Confiabilidad Parcial:

Es posible que los datos tengan relevancia en ciertos instantes de tiempo. SCTP entrega de herramientas para manejar la importancia de un chunk. Un chunk puede ser descartado porque se acabo su tiempo de vida, no es tan importante para ser retransmitido una cierta cantidad de veces o simplemente no son tan importantes como para saturar un buffer

Time Base Reliability: Cierta información puede tener relevancia en corto periodo de tiempo. Gracias a esta herramienta implementada en sctp los paquetes que no sean recibidos en cierto tiempo serán descartados. Un ejemplo de uso seria como el caso de un juego online. Donde el juego online constantemente está enviando su posición al server. Existe la posibilidad que uno los paquetes que contenía la posición se atrasen, y por lo tanto su información no sea relevante y sea descartado.

Buffer Based Reliability: También se pueden descartar paquetes si están saturando un buffer. Algunos paquete pueden incluir información de poca relevancia y pueden ser descartados en un buffer si está muy saturado.

Number of retransmisions: Cuando no se está enviando información esencial, se puede optar por un cierto número de retransmisiones en caso de pérdidas.

Tiempo de vida

Limites de los mensajes:

Uno de los conceptos más importantes de SCTP es el encapsulamiento de la información. Gracias a encapsular la información el receptor se le hace mas fácil la interpretación del mensaje. Ejemplo tomando el caso de TCP, el receptor recibe una cadena de bits. Es de responsabilidad del receptor la comprensión de la data. Esto hace muy poco viable la transmisión no ordenada de TCP, ya que si el flujo de información está constituido por una variedad de estructuras no será posible extraer de forma correcta los datos.

En cambio SCTP trabaja con el concepto de mensaje y encapsulación de la información. Esto significa que cada dato enviado contiene información para su extracción. Se entrega información básica como el largo de un chunk y en cuantos paquetes fueron necesarios para su transporte. También la estructura del chunk.

Informcion limitada a mensajes

SCTP también contiene herramientas básicas de transporte. Es capaz de transportar más de 1 chunk por paquete, en el caso de necesitar transportar varios chunk de poco tamaño. También es capaz de dividir un chunk en varios paquetes, normalmente usado para transportar chunk de tamaño más grande que la capacidad máxima de transporte de un paquete.

Casos de uso

HeartBeat

Heartbeat, este protocolo consta de 2 formas para detectar fallas o restauración de ellas. La primera es el tiempo de demora en que se confirma la llegada de un mensaje, es decir un SACK, que viene a ser un ACK de mensaje en SCTP, y la segunda es el mensaje llamado heartbeat. Ambos actúan sobre dos contadores, que al no ser recibido ningún acuse de recibo de mensaje (SACK) o de heartbeat, estos contadores aumentan en 1.
Al llegar a un valor definido por el que implemento el código, estos valores dictaminaran las dos posibles fallas, que serán la de destino inalcanzable o punto inalcanzable. Si se declara un destino inalcanzable, SCTP seguirá con el envió de heartbeats a ese punto, en caso de que siga sin responder, y se alcanza el valor máximo del segundo contador, la asociación a ese punto queda deshabilitada y se cierra la conexión por esa vía.
La importancia del heartbeat, es que siempre trata de volver a la conexión más rápida, en caso que en algún momento esta fallara. El protocolo intentara una serie de veces que ese canal primario responda para restablecer la conexión.

Otra diferencias.

Tabla

 

Códigos

One_to_Many

One_to_One