SCTP (RFC 4960) è un trasporto affidabile e orientato ai messaggi progettato per la segnalazione. A differenza del singolo stream di byte di TCP, consegna messaggi discreti su più stream indipendenti (evitando il head-of-line blocking) e supporta il multi-homing — più indirizzi IP per endpoint per il failover automatico di percorso. SIGTRAN lo usa per trasportare SS7 su IP.
Perché SCTP invece di TCP
La segnalazione SS7 necessita di consegna affidabile, in sequenza e a bassa latenza con failover rapido — requisiti che TCP soddisfa solo parzialmente. TCP è un singolo stream di byte, quindi un segmento perso blocca ogni byte successivo finché non è ritrasmesso (head-of-line blocking), e una connessione TCP è legata a una sola coppia di indirizzi IP, quindi un guasto di percorso la interrompe. SCTP è stato progettato per risolvere entrambi: consegna messaggi indipendenti su più stream e lega un'associazione a più indirizzi per il failover trasparente. Resiste inoltre agli attacchi SYN-flood con un handshake a quattro vie.
| Proprietà | TCP | SCTP |
|---|---|---|
| Modello dati | Flusso di byte | Orientato ai messaggi (preserva i confini) |
| Stream | One | Molti flussi indipendenti per associazione |
| Blocco in testa alla fila | Attraverso l'intera connessione | Confinato a un solo flusso |
| Indirizzamento degli endpoint | Coppia IP singola | Multihomed (indirizzi IP multipli per endpoint) |
| Handshake | 3 vie (esposto a SYN flood) | 4 vie con cookie firmato |
| Opzioni di consegna | Solo ordinato | Ordinato o non ordinato per messaggio |
Multi-streaming
Un'associazione SCTP trasporta più stream logici, numerati da uno Stream Identifier. Ogni stream è ordinato indipendentemente tramite uno Stream Sequence Number, mentre un unico Transmission Sequence Number (TSN) governa la consegna affidabile sull'intera associazione. L'effetto è che una perdita su uno stream non blocca gli altri — un messaggio bloccato per una destinazione non blocca la segnalazione per un'altra. Le applicazioni possono anche inviare messaggi non ordinati quando il sequenziamento non è richiesto, riducendo ulteriormente la latenza.
Multi-homing e failover
Un endpoint SCTP può legare più indirizzi IP — di norma su percorsi di rete distinti. Un indirizzo è il percorso primario; gli altri sono alternativi. SCTP monitora di continuo ogni indirizzo di destinazione con chunk HEARTBEAT e, se il percorso primario si guasta, ritrasmette su uno alternativo senza abbattere l'associazione. Ciò conferisce ai collegamenti di segnalazione una resilienza di livello carrier su IP che una connessione TCP single-homed non può offrire, ed è un motivo di primo piano per cui SIGTRAN ha scelto SCTP.
Il formato dei pacchetti basato su chunk
Un pacchetto SCTP ha un common header di 12 byte — porta di origine e destinazione, un Verification Tag a 32 bit che protegge l'associazione e un checksum CRC-32c — seguito da uno o più chunk. I chunk sono auto-descrittivi (tipo, flag, lunghezza, valore) e diversi possono essere raggruppati in un unico pacchetto. I control chunk instaurano e gestiscono l'associazione; i DATA chunk trasportano i messaggi utente. Questa struttura consente a SCTP di riscontrare, effettuare heartbeat e trasportare dati in modo efficiente nello stesso pacchetto.
Common header (12 bytes):
Source port (2) Destination port (2)
Verification Tag (4) Checksum CRC-32c (4)
Then 1..n chunks, each:
Type (1) Flags (1) Length (2) Value (variable)
e.g. [ DATA chunk (TSN, Stream ID, SSN, payload) ] [ SACK chunk ]Tipi di chunk e instaurazione dell'associazione
Un'associazione è instaurata con un handshake a quattro vie — INIT, INIT ACK (che trasporta un state cookie firmato), COOKIE ECHO, COOKIE ACK — che consente al server di restare stateless finché il cookie non viene restituito, vanificando gli attacchi SYN-flood. I dati fluiscono in DATA chunk riscontrati da SACK. HEARTBEAT/HEARTBEAT ACK sondano i percorsi inattivi. L'associazione è chiusa in modo ordinato con SHUTDOWN o bruscamente con ABORT.
| Tipo | Chunk | Scopo |
|---|---|---|
| 0 | DATA | Trasporta un messaggio utente (TSN, ID flusso, SSN, payload) |
| 1 / 2 | INIT / INIT ACK | Inizio dell'associazione; INIT ACK contiene il cookie di stato |
| 3 | SACK | Conferma selettiva dei DATA ricevuti |
| 4 / 5 | HEARTBEAT / HEARTBEAT ACK | Verifica la raggiungibilità di un indirizzo di destinazione |
| 6 | ABORT | Chiusura anomala e immediata dell'associazione |
| 7 / 8 | SHUTDOWN / SHUTDOWN ACK | Chiusura ordinata |
| 10 / 11 | COOKIE ECHO / COOKIE ACK | Completa l'handshake a 4 vie |
Domande frequenti
Qual è il principale vantaggio di SCTP rispetto a TCP?
Due cose: il multi-streaming, così un pacchetto perso su uno stream non blocca gli altri (nessun head-of-line blocking a livello di connessione), e il multi-homing, così un endpoint può usare più indirizzi IP ed effettuare il failover automatico quando un percorso cade. Entrambi contano molto per l'affidabilità della segnalazione.
Che cos'è il multi-homing SCTP?
Il multi-homing consente a una singola associazione SCTP di legare più indirizzi IP per endpoint. Uno è il percorso primario e gli altri sono alternativi, monitorati da heartbeat. Se il percorso primario si guasta, SCTP ritrasmette su uno alternativo senza abbattere l'associazione — ridondanza di percorso integrata nel trasporto.
Che cos'è un chunk SCTP?
Un chunk è un'unità auto-descrittiva all'interno di un pacchetto SCTP, con tipo, flag, lunghezza e valore. I DATA chunk trasportano i messaggi utente; i control chunk (INIT, SACK, HEARTBEAT, SHUTDOWN e altri) gestiscono l'associazione. Più chunk possono essere raggruppati in un unico pacchetto.
Perché SCTP usa un handshake a quattro vie?
Il passaggio aggiuntivo consente al rispondente di restare stateless finché non riceve indietro un state cookie firmato (nel COOKIE ECHO). Poiché nessuno stato di associazione è allocato finché il cookie non torna, SCTP resiste agli attacchi di esaurimento risorse in stile SYN-flood che colpiscono l'handshake a tre vie di TCP.
Che cos'è il Verification Tag in SCTP?
Un valore a 32 bit nel common header, scambiato durante l'instaurazione dell'associazione, che entrambi gli endpoint devono includere in ogni pacchetto. Valida che un pacchetto appartenga all'associazione corrente, proteggendo da pacchetti obsoleti e da attacchi di injection alla cieca.
Specifiche della fonte
Gli standard pubblicati su cui si basa questa pagina. Si apre in una nuova scheda.