Características de SCTP
Transferencia de datos Soporte Multistream
confiable con ACK
selectivo (SACK) Soporte Multihoming
Control de flujo Prevención contra
ataques SYN flood
SCTP Delimitadores de
Mensajes
(cookies)
Stream Control Transmission Protocol
PMTU y fragmentación de Escalable
mensajes
Opción de envío de datos
fuera de orden
Ing. Agustín Eijo <agu@[Link]>
Universidad Tecnológica Nacional Facultad Regional La Plata
Basado en: SCTP A detailed overview of the protocol and a examination of the socket API
[Link]
Asociaciones y Endpoints Asociación SCTP
Dos conceptos fundamentales de SCTP: En TCP, la comunicación es denominada “conexión”
Endpoints (extremos de la comunicación)
Asociación (relación en la comunicación) En SCTP, esto es llamado “Asociación” dado que es un
concepto más fuerte que una simple conexión (ej.
multihoming)
Un SCTP endpoint puede ser representado como una
lista de direcciones con un mismo puerto, ejemplo:
Una Asociación SCTP puede ser representada como un
endpoint = [[Link], [Link] : 80]
par de SCTP endpoints:
as = { [[Link] : 2223], [[Link], [Link] :
80]}
Asociación SCTP Asociación SCTP
SCTP como TCP es orientado a la conexión. Una asociación SCTP provee transferencia de datos
confiable de mensajes
Durante el establecimiento de la asociación ambos
extremos intercambian: El envío de mensajes puede ser ordenado o fuera de
En TCP 3-way handshake orden
(SYN, SYN/ACK, ACK)
En el envío ordenado a cada mensaje se le asigna un
En SCTP 4-way handshake
stream sequence number (SSN)
En el envío fuera de orden los mensajes no tienen
(INIT, INIT-ACK, COOKIE-ECHO, COOKIE-ACK)
SSN
1
Multistream Multihoming
Endpoint-1
Sd-queue Ro-queue Endpoint-2
NI-1 NI-2
NI-1 NI-2
IP Network
Ro-queue Sd-queue
IP Network
Mensajes SCTP SCTP Common Header
Los mensajes SCTP tienen un header común seguido de Source Port Destination Port
uno o mas chunks
Verification Tag
IP Header CRC-32c Checksum
Source and Destination Port: números de port (16-bit)
SCTP Common Header
Verification Tag: valor aleatorio de 32-bit elegido por cada
endpoint durante el establecimiento de la asociación
Chunk 1
Permite diferenciar dos asociaciones consecutivas.
Mecanismo de detección de ataques.
... CRC32c Checksum: 32-bit Checksum cubre todo el
mensaje SCTP (common header y todos los chunks)
Chunk N Mucho más robusto que el checksum de TCP
SCTP Chunks Tipos de Chunk
Chunk Type Chunk Flags Chunk Length Hay 20 tipos de chunk actualmente definidos en SCTP
(Incluyendo non-RFC/Internet Draft extensions):
Chunk Data
(1) DATA (0x00)
(2) INITIATION [INIT] (0x01)
(3) INITIATION-ACKNOWLEDGMENT [INIT-ACK] (0x02)
(4) SELECTIVE-ACKNOWLEDGMENT [SACK] (0x03)
Chunk Type: 8-bit indica tipo de chunk.
(5) HEARTBEAT (0x04)
Chunk Flags: 8-bit flags, definidos por tipo de chunk.
(6) HEARTBEAT-ACKNOWLEDGMENT [HEARTBEAT-
Chunk Length: 16-bit longitud en bytes, incluyendo chunk ACK] (0x05)
type, chunk flags, y chunk length.
(7) ABORT (0x06)
(8) SHUTDOWN (0x07)
2
Tipos de Chunk Tipos de Chunk (Extensiones)
(9) SHUTDOWN-ACKNOWLEGMENT [SHUTDOWN- PR-SCTP - RFC 3758
ACK] (0x08)
(16) FORWARD-TSN (0xC0)
(10) OPERATIONAL-ERROR [ERROR] (0x09)
ADD-IP draft
(11) COOKIE-ECHO (0x0A)
(17) ADDRESS-CONFIGURATION [ASCONF] (0xC1)
(12) COOKIE-ACKNOWLEDGMENT [COOKIE-ACK]
(18) ADDRESS-CONFIGURATION-ACKNOWLEDGMENT
(0x0B)
[ASCONF-ACK] (0x80)
(13) EXPLICIT CONGESTION NOTIFICATION ECHO
Packet-Drop draft
[ECNE] (0x0C)
(19) SCTP-PACKET-DROP-REPORT [PKT-DROP] (0x81)
(14) CONGESTION WINDOW REDUCE [CWR] (0x0D)
(15) SHUTDOWN-COMPLETE (0x0E) Authentication draft
(20) AUTHENTICATION [AUTH] (0x82) - about to undergo
drastic changes and will probably add 2-3 chunks.
Formato de los parámetros Establecimiento de una asociación
Parameter Type (16 bit) Longitud (16 bit)
SCTP usa 4-way handshake para establecer una
asociación.
Type = 0x0033 Length = 8
El extremo que realiza la apertura activa envía un INIT
4 Octets of Data chunk.
El envío de INIT incluye varios parámetros ejemplos:
Direcciones IPv4 e IPv6
Soporte de extensiones como PR-SCTP (Partial
Reliability)
Datos de longitud variable
Asociación completa Enviando INIT
Endpoint A Endpoint Z
Dos importantes valores son enviados al enviar un INIT e
INIT
INIT-ACK:
INIT-ACK
Association
Verification Tag (V-Tag) valor que se utilizará en todos
Association COOKIE-ECHO * Is Up los envíos (ubicado en el campo initiate tag)
Is Up
* COOKIE-ACK
Initial TSN provee el punto de inicio (transport
secuence space TSN)
* -- pueden ser incluidos datos de usuario
3
INIT Chunk Recibiendo INIT
Type=1 Flags=0 Length=variable Initiation Tag: valor aleatorio de 32-bit
Initiation Tag Receiver Window Credit: valor inicial de El receptor del INIT valida que exista una aplicación
rwnd usado para el control de flujo escuchando. Y en caso de no existir envía un ABORT
Receiver window credit
hacia el origen.
# of Outbound Streams: número de
# Out Streams Max # In Streams
streams que desea enviar el origen
Initial TSN
Se realiza un chequeo y validación, enviando un INIT ACK
Max # of Inbound Streams: numero máximo sin guardar estado, esto previene ataques tipo TCP SYN.
de stream que el origen puede recibir
Optional/Variable length parameters Initial TSN: valor aleatorio de 32-bit TSN En el INIT-ACK, el receptor responde incluyendo varios
número inicial de secuencia parámetros como hizo el origen al enviar el INIT
incluyendo uno importante state cookie.
INIT-ACK Chunk State cookie
Type=2 Flags=0 Length=variable Initiation Tag: valor aleatorio de 32-bit El parámetro state cookie:
Initiation Tag Receiver Window Credit: valor inicial de
rwnd usado para el control de flujo
Es firmado (generalmente con MD5 o SHA-1)
Receiver window credit
# of Outbound Streams: número de
# Out Streams Max # In Streams streams que desea enviar el origen
Cubre todos los parámetros necesarios para el
Initial TSN establecimiento de una asociación (generalmente INIT
Max # of Inbound Streams: numero máximo
de stream que el origen puede recibir completo y algunas partes de INIT-ACK)
Optional/Variable length parameters Initial TSN: valor aleatorio de 32-bit TSN
número inicial de secuencia
Depende de la implementación, pero debe incluir el
timestamp
Cookie Echo y Cookie Ack Chunk Asociación completa
Type=a Flags=0 Length=variable Endpoint A Endpoint Z
Type=b Flags=0 Length=4 INIT
State Cookie from INIT-ACK
INIT-ACK
Association
Cookie-Echo Cookie-ACK Association * Is Up
COOKIE-ECHO
Is Up
Cookie-Echo y Cookie-ACK son chunks simples, pero * COOKIE-ACK
ayudan a prevenir ataques
Ambos permiten ser enviados junto a otros chunks, como
DATA chunk * -- pueden ser incluidos datos de usuario
4
Recibiendo y enviando Mensajes Retransmisión
El envío de mensajes se realiza con las funciones
sndmsg() o sctp_sndmsg() Por cada DATA chunk enviado el receptor debe enviar un
SACK chunk.
Un simple rcvmsg() o sctp_rcvmsg() NUNCA devolverá
mas de un mensaje
En caso de no recibir el SACK Chunk en el tiempo
establecido RTO (Retransmission Time Out) el origen
Cuando se recibe un mensaje SCTP se deben procesar puede retransmitir el DATA Chunk.
primero los chunks de control.
Los chunks de datos deben ser entregados a la SCTP mantiene estadísticamente el RTT (Round Trip Time)
aplicación. para cada asociación.
Si un mensaje es fragmentado debe retenerse hasta estar
completo.
DATA Chunk Campos DATA Chunk
Type=0x00 Flags=UBE Length=variable
TSN Value
TSN: número de secuencia utilizado para ordenar y
Stream Identifier Stream Sequence Num
reensamblar y retransmitir
Payload Protocol Identifier
Stream Identifier: número de stream para los datos
Variable Length User Data Stream Sequence Number: identifica el mensaje dentro del
stream
Payload Protocol Identifier: identificador del protocolo de
Flags Bits ‘UBE’
la capa superior
U – Datos fuera de orden User Data: mensaje
B – Comienzo de mensaje fragmentado
E – Fin de mensaje fragmentado
Un mensaje completo debe tener los flags B y E bits activados
SACK Chunk SACK Chunk Example
Cumulative TSN Acknowledgment: el
Type=3 Flags=0 Length=variable mayor TSN consecutivo recibido
Cumulative TSN Type=3 Flags=0 Length=variable
Receiver Window Credit: valor actual de la
Receiver window credit ventana del receptor Cum Ack=109965
Num of Fragments=N Num of Dup=M # of Fragments: cantidad de bloques rwnd = 64200
faltantes
Gap Ack Blk #1 start Gap Ack Blk #1 end Num of Fragments=2 Num of Dup=2
Gap Ack Blk #N start Gap Ack Blk #N end # of Duplicates: cantidad de bloques Gap start = 2 Gap end = 5
duplicados
Duplicate TSN #1 Gap start = 7 Gap end = 9
Gap Ack Block Start / End TSN offset:
Duplicate TSN #M Duplicate TSN = 109963
comienzo y fin consecutivo de bloques
faltantes relativo al TSN
Duplicate TSN = 109964
Duplicate TSN: TSN de bloque duplicado
5
Que hacer cuando no se puede enviar Transferencia de mensajes grandes
un mensaje completo?
Los mensajes deben dividirse en múltiples partes Endpoint A Endpoint Z
llamadas fragmentos.
3800
octets
Todos los fragmentos deben utilizar el mismo Stream
Identifier (SID) y Stream Sequence Number (SSN). PMTU=512 octets
SCTP SCTP
Cada fragmento usa un único TSN y los flags apropiados
para identificar si es el primero, ultimo, medio. TSN 1*
* - B bit set to 1
Transferencia de mensajes grandes Transferencia de mensajes grandes
Endpoint A Endpoint Z Endpoint A Endpoint Z
3800
octets
PMTU=512 octets PMTU=512 octets
SCTP SCTP SCTP SCTP
TSN 1*
TSN 2
TSN 9+ TSN 8 TSN 7 TSN 6 TSN 3
TSN 4
TSN 5
* - B bit set to 1
+ - E bit set to 1
Control de flujo Control de Flujo
Como en TCP, la ventana de congestión (cwnd) y el Para evitar la congestión se utiliza la técnica Additive
tamaño de ventana recibida (rwnd) se utilizan para el Increase Multiplicative Decrease (AIMD) cómo en TCP.
control de envío de datos.
El origen no debe transmitir mas que rwnd. Básicamente consiste en el incremento lento de cwnd, al
Si el receptor indica rwnd en 0, el orígen debe detener el detectar una pérdida de datos se decrementa cwnd
envío de datos, sin embargo puede enviar mensajes rápidamente.
esperando una actualización de rwnd
6
Orden y Streams Cierre de una Asociación
SCTP permite el envío de datos en orden o fuera de orden.
SCTP utiliza 3-way handshake para cerrar una asociación.
En el envío fuera de orden los datos deben ser pasados
inmediatamente a la aplicación.
A diferencia de TCP, SCTP NO soporta el cierre de un
En el envío de datos en orden los mensajes deben ser único extremo.
retenidos para ser entregados a la aplicación en orden.
El origen indica en las funciones sndmsg() o
sctp_sndmsg() que stream utilizar.
The Shutdown Handshake Shutdown Chunks
Type=7 Flags=0 Length=8
Endpoint-A Endpoint-Z
Cumulative TSN
1 close()
SHUTDOWN
2
SHUTDOWN
3 Type=8 Flags=0 Length=4
4 SHUTDOWN-ACK
WN-ACK
SHUTDO
5
SHUTDOWN-COMPLET Type=14 Flags=T Length=4
E 6
SHUTDOWN-COMPLETE
ABORT Chunk Extensiones de SCTP
Otro mecanismo de cierre es mediante la utilización de
ABORT chunks. SCTP, como hemos visto es un protocolo fácilmente
extensible.
Cuando una aplicación realiza un cierre anormal
inmediatamente es enviado un ABORT chunk. Para extender el protocolo nuevos tipos de chunk o
parámetros pueden ser agregados en nuevas RFC's.
7
Extensión PR-SCTP Diferencias entre SCTP y TCP
SCTP utiliza four-way handshake para establecer una
asociación. TCP utiliza three-way handshake para
Partial Reliability SCTP permite omitir la retransmisión de establecer una conexión.
mensajes al no recibir el acknowledged.
Sin embargo, en SCTP puede enviarse datos en el tercer
Ambos extremos deben soportar la extensión esto se y cuarto mensaje de la asociación haciendo mas rápido
índica durante el establecimiento de la asociación. el comienzo de transmisión en relación a TCP.
Normalmente se establece un timer esperando el SCTP utiliza cookies durante el four-way handshake
acknowledged, cuando este tiempo expira el mensaje no evitando ataques SYN flooding.
es retransmitido.
SCTP permite la transferencia multihoming y
multistream.
Diferencias entre SCTP y TCP Socket API
SCTP envía mensajes , no “byte stream”
Una aplicación TCP debe definir sus propios int sd, newfd, sosz;
Nota: 0 implica IPPROTO_TCP
delimitadores de mensajes. struct sockaddr_in6 sin6;
sosz = sizeof(sin6);
sd = socket(PF_INET6, SOCK_STREAM, 0);
SCTP permite el envío de datos fuera de orden.
sd = socket(PF_INET6, SOCK_STREAM, IPPROTO_SCTP);
listen(sd, 1);
SCTP utiliza ACK selectivos en lugar de acumulativo while (1) {
como TCP. newfd = accept(sd, (struct sockaddr *)&sin6, &sosz)
do_child_stuff(newfd, &sin6, sosz);
SCTP no permite el cierre en un solo sentido. }
Ejemplo de servidor Referencias
[Link]
int sd, newfd, sosz, msg_flags;
struct sockaddr_in6 sin6;
struct sndrcvinfo snd_rcv; RFC 2960 - Stream Control Transmission Protocol.
char buf[8000];
sosz = sizeof(sin6); RFC 3286 - An Introduction to SCTP.
sd = socket(AF_INET6, SOCK_SEQPKT, IPPROTO_SCTP);
listen(sd, 1);
RFC 3578 - Partial Reliability.
while (1) {
len = sctp_recvmsg(sd, buf, sizeof(buf), (sockaddr *)&sin6, &sosz,
&snd_rcv, &msg_flags); RFC 3257 - Stream Control Transmission Protocol
do_child_stuff(newfd, buf, len, &sin6, &snd_rcv, msg_flags); Applicability Statement.
}