Implementación de protocolo SCTP en JAVA

César Reyes
Estudiante de Ing. Civil Electrónica UTFSM
e-mail: cesar.reyesp@alumnos.usm.cl


Introducción

Este es un proyecto desarrollado para el ramo programación de sistemas (ELO330) el cual esta orientado a investigar más en profundidad un protocolo "Stream Control Transmicion Protocol (SCTP)" estudiado en clases. Existen varias aplicaciones que actualmente usan este protocolo como por ej la telefonía IP, particularmente este proyecto busca implementar un servicio Cliente-Servidor usando este protocolo en JAVA y poder mostrar las herramientas que facilita este lenguaje para el desarrollo de nuevas aplicaciones con este protocolo.
Además se busca poder dejar registro de aplicaciones escalables para el futuro, dado que actualmente no se encuentra una gran cantidad de material demostrativo que facilite el desarrollo de nuevas aplicaciones y la migraciones de varias plataformas a este protocolo.

¿Qué es SCTP?

Stream Control Transmission Protocol (SCTP) es un protocolo de comunicación de capa de transporte que fue definido por el grupo SIGTRAN de IETF en el año 2000. El protocolo está especificado en la RFC 2960, y la RFC 3286. Este protocolo posee algunas características similares a 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. SCTP es orientado a la coneccion (similar a TCP), a una asociación entre los extremos la cual debe establecerse antes de transmitir datos y también orientada a mensajes (similar a los que hace UTP).

Características

SCTP es una alternativa a los protocolos de transporte TCP y UDP pues provee confiabilidad, control de flujo y secuenciación como TCP. Sin embargo, SCTP opcionalmente permite el envío de mensajes fuera de orden y a diferencia de TCP, SCTP es un protocolo orientado al mensaje (similar al envío de datagramas UDP).

Asociaciones y Endpoints

En SCTP hay 2 conceptos claves y que lo hacen diferente a sus pares estos son los Endpoints (extremos de comunicación) y la Asociación (relacion de comunicación).
Un SCTP endpoint puede ser representado como una lista de direcciones con el mismo puerto, por ej:

$\displaystyle endpoints = [10.1.4.2, 10.1.5.3:80]$

La Asociación es el análogo a lo que en TCP sería denominado "conexión", pero en SCTP es llamado asociación dado que es un concepto más fuerte que una simple conexión, referentemente a la aplicación de Multihoming. Una Asociación en SCTP puede ser representada como un par de Endpoints:

$\displaystyle as = \{[10.1.4.2, 10.1.5.3:80],[161.10.8.221:4567]\}$

Como se dijo anteriormente este protocolo es orientado a la conexión, durante el establecimiento de la asociación ambos extremos intercambian 4-way handshake (INIT, INIT-ACK, COOKIE-ECHO, COOKIE-ACK). Esta asociación permite transferencias de datos confiables de mensajes, siendo estos ordenados o fuera de orden.

asociacion
Figura: SCTP 4-way handshake.

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 de vuelta 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 pérdida de muchos más.

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 pérdidas, 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 pérdida de los paquetes posteriores destinados a su mismo canal.

Estructura de paquete SCTP

SCTP tiene un paquete similar a la estructura de TCP, esta cuenta con 2 secciones, una cabecera común y una pila de bloques llamado Chunks. A su vez cada Chunk posee su propios campos de información, estos están limitados al MTU de la red.

data
Figura: Estructura de datos SCTP

La cabecera 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).

Ademáss, 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 último o si es que los datos deben ser enviados en orden.
Chunk Length:
Largo del Chunk completo en bytes.
Chunk Data:
Data que se enviará por el chunk.

Algunos Chunk types:

MultiStreaming

Una conexión realizada con el protocolo SCTP, es posible dividirla en varios streams, posibilitando la recepción en forma paralela de diferente información, que podría tratarse por ejemplo de un sitio web con su página html y los anexos como fotos, pudiendo presentar de forma más rápida el contenido de este al usuario.

asociacion
Figura: MultiStreaming en SCTP

MultiHoming

Una conexión multi-homing se refiere a que es posible la conexión simultánea desde y hacia diferentes enlaces físicos de conexión, posibilitando una mayor velocidad de transmisión y/o una seguridad de enlaces, esto es como respaldo en caso de una pérdida de alguno de ellos.

multihoming
Figura: MultiHoming en SCTP v/s TCP

SCTP en JAVA

El paquete "com.sun.nio.sctp" de Opensdk 5 define las clases/interfases que son usadas para el menejo de del protocolo SCTP.
Las principales clases que maneja son 3 tipos de channels que se pueden dividir en 2 grupos.
  1. El primer grupo es $ SctpChannel$ y $ SctpServerChannel$ . Un $ SctpChannel$ puede controlar solo 1 asociación simple, esto es enviar y recibir datos a un endpoints simple. $ SctpServerChannel$ escucha y acepta nuevas asociaciones inicializadas desde un socket address.
  2. El segundo grupo con consiste solo de $ SctpMultiChannel$ . Instancias de este tipo de channels puede controlar múltiples asociaciones, por lo tanto puede enviar y recibir datos de y hacia muchos Endpoints diferentes.

El SCTP stack es controlado por eventos , y las aplicaciones pueden recibir notificaciones de ciertos eventos de SCTP. Estos eventos son más útiles para $ SctpMultiChannel$ ya que puede controlar múltiple asociaciones, es necesario realizar un seguimiento de la situación de estas notificaciones. Por ejemplo "AssociationChangeNotification" le permite saber cuando se inicia o se terminan nuevas asociaciones. Si la asociacion permite la configuración dinámica de direcciones entonces $ PeerAddressChangeNotification$ le permite saber acerca de las direcciones IP que se han añadido o eliminado desde un peer endpoint. $ MessageInfo$ proporciona datos auxiliares del mensaje ya sea enviado o recibido.

Además es necesario manejar las clases de Socket y y manejo de IP, $ java.net.InetAddress$ , $ java.net.InetSocketAddress$ y $ java.net.SocketAddress$ .

Cliente

Las partes claves para un cliente se describen en el siguiente código donde se debe crear el socket con la IP del servidor y el puerto al cual se debe conectar, posteriormente se crea un objeto $ SctpChannel$ con el socket creado y además se crea el objeto de $ MessageInfo$ que contiene información adicional del mensaje que se envía. Luego se usa el método $ send$ de $ SctpChannel$ con el mensaje y la información adicional.


\begin{lstlisting}[frame=single]
InetSocketAddress socketAddress =
new InetSock...
...tgoing(null, 0);
...
sctpChannel.send(byteBuffer, messageInfo);
\end{lstlisting}

Servidor

Para el funcionamiento del servidor se tiene que crear un socket con el puerto por donde se escuchara ( $ SocketAddress$ ) y con el crear un objeto del tipo $ SctpServerChannel$ el cual tienen el método $ accept()$ que espera una nueva conexión, cuando esto ocurre devuelve un objeto del tipo $ SctpChannel$ el cual tiene implementado el método $ recive()$ para capturar los mensajes que lleguen al servidor.


\begin{lstlisting}[frame=single]
SocketAddress serverSocketAddress =
new InetSo...
...nnel.accept();
...
sctpChannel.receive(buf , System.out, null);
\end{lstlisting}

Requisitos de sistema

En linux el módulo del SCTP no viene instalado por defecto en el kernel por lo que es necesario instalar los módulos extras del kernel

$\displaystyle kernel-modules-extra$

junto con el paquete específico de SCTP $ lksctp-tools$ .
En fedora la instalación sería
\begin{lstlisting}
yum install kernel-modules-extra lksctp-tools
\end{lstlisting}
Para verificar la correcta instalación y funcionamiento de este, podemos revisar con los comandos $ checksctp $ , $ modinfo sctp$ y
\begin{lstlisting}
sctp_test -H 127.0.0.1 -P 2222 -l
sctp_test -H 127.0.0.1 -P 2223 -h 127.0.0.1 -p 2222 -s
\end{lstlisting}

Codigos fuentes: Codigo Cliente Codigo Servidor
Para compilar usar "javac *.java" y para correr usar "java Servidor" y "java Cliente localhost"
Versión informe en PDF

Concluciones

Continuar escribiendo SCTP es un protocolo de vanguardia que tiene un potencial significativo para las nuevas aplicaciones que se desarrollen al futuro. Si bien aun no se ha logrado masificar el protocolo las ventajas que presenta respecto a sus pares es significativa dado que recoge lo mejor da cada una de ellas y las potencia, además las herramientas para el desarrollo están disponibles en distintos lenguajes, acá en especial en java pero también esta por ej. en C. Lo que falta es generar más material demostrativo para poder mostrar las que proporciona y lograr por ejemplo incluir el modulo en el kernel de Linux porque si no esta hace mas difícil la implementación del mismo.

Referencias

http://openjdk.java.net/projects/sctp/javadoc/
http://thegeekhead.blogspot.com/2009/07/stream-control-transport-protocol-sctp.html
http://www.frlp.utn.edu.ar/materias/internetworking/apuntes/SCTP/SCTP.pdf
http://profesores.elo.utfsm.cl/~agv/elo330/2s10/projects/BenjaminGinouves/Documentacion.html
http://profesores.elo.utfsm.cl/~agv/elo330/2s11/projects/Reports/BarriosMedinaPerez/index.html



cesar reyes 2014-01-13