Passa al contenuto principale

1. Introduzione (Introduction)

Questa sezione spiega il ragionamento alla base dello sviluppo del protocollo di trasmissione con controllo di flusso (Stream Control Transmission Protocol, SCTP), i servizi che offre e i concetti di base necessari per comprendere la descrizione dettagliata del protocollo.

Questo documento rende obsoleti [RFC2960] e [RFC3309].

1.1. Motivazione

TCP [RFC0793] ha fornito un servizio immenso come mezzo principale di trasferimento affidabile dei dati nelle reti IP. Tuttavia, un numero crescente di applicazioni recenti ha trovato TCP troppo limitante e ha incorporato il proprio protocollo di trasferimento affidabile dei dati sopra UDP [RFC0768]. Le limitazioni che gli utenti hanno voluto aggirare includono le seguenti:

  • TCP fornisce sia il trasferimento affidabile dei dati che la consegna rigorosa dei dati nell'ordine di trasmissione. Alcune applicazioni hanno bisogno di trasferimento affidabile senza mantenimento della sequenza, mentre altre sarebbero soddisfatte con un ordinamento parziale dei dati. In entrambi questi casi, il blocco in testa alla linea (head-of-line blocking) offerto da TCP causa ritardi non necessari.

  • La natura orientata al flusso di TCP è spesso un inconveniente. Le applicazioni devono aggiungere la propria marcatura dei record per delimitare i loro messaggi e devono fare uso esplicito della funzione push per garantire che un messaggio completo venga trasferito in un tempo ragionevole.

  • L'ambito limitato dei socket TCP complica il compito di fornire capacità di trasferimento dati altamente disponibili utilizzando host multi-homed.

  • TCP è relativamente vulnerabile agli attacchi denial-of-service, come gli attacchi SYN.

Il trasporto della segnalazione PSTN attraverso la rete IP è un'applicazione per la quale tutte queste limitazioni di TCP sono rilevanti. Sebbene questa applicazione abbia motivato direttamente lo sviluppo di SCTP, altre applicazioni potrebbero trovare che SCTP si adatta bene ai loro requisiti.

1.2. Vista architetturale di SCTP

SCTP è visto come un livello tra l'applicazione utente SCTP (abbreviato "utente SCTP") e un servizio di rete a pacchetti senza connessione come IP. Il resto di questo documento presuppone che SCTP funzioni sopra IP. Il servizio di base offerto da SCTP è il trasferimento affidabile di messaggi utente tra utenti SCTP peer. Esegue questo servizio nel contesto di un'associazione tra due endpoint SCTP. La sezione 10 di questo documento descrive l'API che dovrebbe esistere al confine tra i livelli SCTP e utente SCTP.

SCTP è di natura orientato alla connessione, ma l'associazione SCTP è un concetto più ampio della connessione TCP. SCTP fornisce i mezzi per ciascun endpoint SCTP (sezione 1.3) per fornire all'altro endpoint (durante l'avvio dell'associazione) un elenco di indirizzi di trasporto (cioè, più indirizzi IP in combinazione con una porta SCTP) attraverso i quali quell'endpoint può essere raggiunto e dai quali originerà pacchetti SCTP. L'associazione si estende sui trasferimenti su tutte le possibili combinazioni sorgente/destinazione che possono essere generate dagli elenchi di ciascun endpoint.

     _____________                                      _____________
| SCTP User | | SCTP User |
| Application | | Application |
|-------------| |-------------|
| SCTP | | SCTP |
| Transport | | Transport |
| Service | | Service |
|-------------| |-------------|
| |One or more ---- One or more| |
| IP Network |IP address \/ IP address| IP Network |
| Service |appearances /\ appearances| Service |
|_____________| ---- |_____________|

SCTP Node A |<-------- Network transport ------->| SCTP Node B

Figura 1: Un'associazione SCTP

1.3. Termini chiave

Parte del linguaggio utilizzato per descrivere SCTP è stato introdotto nelle sezioni precedenti. Questa sezione fornisce un elenco consolidato dei termini chiave e delle loro definizioni.

  • Indirizzo di trasporto di destinazione attivo (Active destination transport address): Un indirizzo di trasporto su un endpoint peer che un endpoint trasmittente considera disponibile per ricevere messaggi utente.

  • Raggruppamento (Bundling): Un'operazione di multiplexing opzionale, per cui più di un messaggio utente può essere trasportato nello stesso pacchetto SCTP. Ogni messaggio utente occupa il proprio chunk DATA.

  • Chunk: Un'unità di informazione all'interno di un pacchetto SCTP, costituita da un'intestazione chunk e contenuto specifico del chunk.

  • Finestra di congestione (Congestion window, cwnd): Una variabile SCTP che limita i dati, in numero di byte, che un mittente può inviare a un particolare indirizzo di trasporto di destinazione prima di ricevere un acknowledgement.

  • Punto di conferma TSN cumulativo (Cumulative TSN Ack Point): Il TSN dell'ultimo chunk DATA confermato tramite il campo di conferma TSN cumulativo di un SACK.

  • Indirizzo di destinazione inattivo (Idle destination address): Un indirizzo a cui non sono stati inviati messaggi utente entro un certo periodo di tempo, normalmente l'intervallo HEARTBEAT o superiore.

  • Indirizzo di trasporto di destinazione inattivo (Inactive destination transport address): Un indirizzo considerato inattivo a causa di errori e non disponibile per trasportare messaggi utente.

  • Messaggio = messaggio utente (Message = user message): Dati inviati a SCTP dal protocollo di livello superiore (ULP).

  • Codice di autenticazione del messaggio (Message Authentication Code, MAC): Un meccanismo di controllo dell'integrità basato su funzioni hash crittografiche che utilizzano una chiave segreta. Tipicamente, i codici di autenticazione del messaggio vengono utilizzati tra due parti che condividono una chiave segreta per convalidare le informazioni trasmesse tra queste parti. In SCTP, viene utilizzato da un endpoint per convalidare le informazioni del cookie di stato (State Cookie) restituite dal peer nel chunk COOKIE ECHO. Il termine "MAC" ha significati diversi in contesti diversi. SCTP utilizza questo termine con lo stesso significato di [RFC2104].

  • Ordine dei byte di rete (Network Byte Order): Byte più significativo per primo, noto anche come big endian.

  • Messaggio ordinato (Ordered Message): Un messaggio utente che viene consegnato in ordine rispetto a tutti i precedenti messaggi utente inviati all'interno del flusso su cui è stato inviato il messaggio.

  • TSN in sospeso (Outstanding TSN, presso un endpoint SCTP): Un TSN (e il chunk DATA associato) che è stato inviato dall'endpoint ma per il quale non ha ancora ricevuto un acknowledgement.

  • Percorso (Path): Il percorso intrapreso dai pacchetti SCTP inviati da un endpoint SCTP a un indirizzo di trasporto di destinazione specifico del suo endpoint SCTP peer. L'invio a indirizzi di trasporto di destinazione diversi non garantisce necessariamente l'ottenimento di percorsi separati.

  • Percorso primario (Primary Path): Il percorso primario è l'indirizzo di destinazione e sorgente che verrà inserito in un pacchetto in uscita verso l'endpoint peer per impostazione predefinita. La definizione include l'indirizzo sorgente poiché un'implementazione può desiderare di specificare sia l'indirizzo di destinazione che quello sorgente per controllare meglio il percorso di ritorno intrapreso dai chunk di risposta e su quale interfaccia viene trasmesso il pacchetto quando il mittente dei dati è multi-homed.

  • Finestra del ricevitore (Receiver Window, rwnd): Una variabile SCTP che un mittente di dati utilizza per memorizzare la finestra del ricevitore calcolata più recentemente del suo peer, in numero di byte. Questo fornisce al mittente un'indicazione dello spazio disponibile nel buffer in entrata del ricevitore.

  • Associazione SCTP (SCTP association): Una relazione di protocollo tra endpoint SCTP, composta dai due endpoint SCTP e dalle informazioni sullo stato del protocollo, inclusi i tag di verifica (Verification Tags) e l'insieme attualmente attivo di numeri di sequenza di trasmissione (TSN), ecc. Un'associazione può essere identificata in modo univoco dagli indirizzi di trasporto utilizzati dagli endpoint nell'associazione. Due endpoint SCTP non devono (MUST NOT) avere più di un'associazione SCTP tra di loro in un dato momento.

  • Endpoint SCTP (SCTP endpoint): Il mittente/ricevitore logico di pacchetti SCTP. Su un host multi-homed, un endpoint SCTP è rappresentato ai suoi peer come una combinazione di un insieme di indirizzi di trasporto di destinazione idonei a cui possono essere inviati pacchetti SCTP e un insieme di indirizzi di trasporto sorgente idonei da cui possono essere ricevuti pacchetti SCTP. Tutti gli indirizzi di trasporto utilizzati da un endpoint SCTP devono utilizzare lo stesso numero di porta, ma possono utilizzare più indirizzi IP. Un indirizzo di trasporto utilizzato da un endpoint SCTP non deve essere utilizzato da un altro endpoint SCTP. In altre parole, un indirizzo di trasporto è univoco per un endpoint SCTP.

  • Pacchetto SCTP (o pacchetto) (SCTP packet or packet): L'unità di consegna dei dati attraverso l'interfaccia tra SCTP e la rete a pacchetti senza connessione (ad es., IP). Un pacchetto SCTP include l'intestazione SCTP comune, possibili chunk di controllo SCTP e dati utente incapsulati all'interno di chunk SCTP DATA.

  • Applicazione utente SCTP (utente SCTP) (SCTP user application, SCTP user): L'entità applicativa logica di livello superiore che utilizza i servizi di SCTP, chiamata anche protocollo di livello superiore (ULP).

  • Soglia di avvio lento (Slow-Start Threshold, ssthresh): Una variabile SCTP. Questa è la soglia che l'endpoint utilizzerà per determinare se eseguire l'avvio lento o l'evitamento della congestione su un particolare indirizzo di trasporto di destinazione. Ssthresh è espresso in numero di byte.

  • Flusso (Stream): Un canale logico unidirezionale stabilito da un endpoint SCTP associato a un altro, all'interno del quale tutti i messaggi utente vengono consegnati in sequenza tranne quelli inviati al servizio di consegna non ordinata.

Nota: La relazione tra i numeri di flusso in direzioni opposte è strettamente una questione di come le applicazioni li utilizzano. È responsabilità dell'utente SCTP creare e gestire queste correlazioni se desiderate.

  • Numero di sequenza del flusso (Stream Sequence Number): Un numero di sequenza a 16 bit utilizzato internamente da SCTP per garantire la consegna sequenziata dei messaggi utente all'interno di un dato flusso. Un numero di sequenza del flusso è allegato a ogni messaggio utente.

  • Tag di collegamento (Tie-Tags): Due numeri casuali a 32 bit che insieme formano un nonce a 64 bit. Questi tag vengono utilizzati all'interno di un cookie di stato (State Cookie) e TCB in modo che un'associazione appena riavviata possa essere collegata all'associazione originale all'interno dell'endpoint che non ha riavviato e tuttavia non rivelare i veri tag di verifica di un'associazione esistente.

  • Blocco di controllo della trasmissione (Transmission Control Block, TCB): Una struttura dati interna creata da un endpoint SCTP per ciascuna delle sue associazioni SCTP esistenti ad altri endpoint SCTP. Il TCB contiene tutte le informazioni sullo stato e operative per l'endpoint per mantenere e gestire l'associazione corrispondente.

  • Numero di sequenza di trasmissione (Transmission Sequence Number, TSN): Un numero di sequenza a 32 bit utilizzato internamente da SCTP. Un TSN è allegato a ogni chunk contenente dati utente per consentire all'endpoint SCTP ricevente di confermare la sua ricezione e rilevare consegne duplicate.

  • Indirizzo di trasporto (Transport address): Un indirizzo di trasporto è tradizionalmente definito da un indirizzo di livello rete, un protocollo di livello trasporto e un numero di porta di livello trasporto. Nel caso di SCTP in esecuzione su IP, un indirizzo di trasporto è definito dalla combinazione di un indirizzo IP e un numero di porta SCTP (dove SCTP è il protocollo di trasporto).

  • TSN non confermato (Unacknowledged TSN, presso un endpoint SCTP): Un TSN (e il chunk DATA associato) che è stato ricevuto dall'endpoint ma per il quale non è stata ancora inviata una conferma. O nel caso opposto, per un pacchetto che è stato inviato ma non è stata ricevuta alcuna conferma.

  • Messaggio non ordinato (Unordered Message): I messaggi non ordinati sono "non ordinati" rispetto a qualsiasi altro messaggio; ciò include sia altri messaggi non ordinati che altri messaggi ordinati. Un messaggio non ordinato potrebbe essere consegnato prima o dopo i messaggi ordinati inviati sullo stesso flusso.

  • Messaggio utente (User message): L'unità di consegna dei dati attraverso l'interfaccia tra SCTP e il suo utente.

  • Tag di verifica (Verification Tag): Un intero senza segno a 32 bit generato casualmente. Il tag di verifica fornisce una chiave che consente a un ricevitore di verificare che il pacchetto SCTP appartenga all'associazione corrente e non sia un pacchetto vecchio o obsoleto di un'associazione precedente.

1.4. Abbreviazioni

  • MAC - Codice di autenticazione del messaggio (Message Authentication Code) [RFC2104]
  • RTO - Timeout di ritrasmissione (Retransmission Timeout)
  • RTT - Tempo di andata e ritorno (Round-Trip Time)
  • RTTVAR - Variazione del tempo di andata e ritorno (Round-Trip Time Variation)
  • SCTP - Protocollo di trasmissione con controllo di flusso (Stream Control Transmission Protocol)
  • SRTT - RTT levigato (Smoothed RTT)
  • TCB - Blocco di controllo della trasmissione (Transmission Control Block)
  • TLV - Formato di codifica tipo-lunghezza-valore (Type-Length-Value coding format)
  • TSN - Numero di sequenza di trasmissione (Transmission Sequence Number)
  • ULP - Protocollo di livello superiore (Upper-Layer Protocol)

1.5. Vista funzionale di SCTP

Il servizio di trasporto SCTP può essere scomposto in un certo numero di funzioni. Queste sono rappresentate nella figura 2 e spiegate nel resto di questa sezione.

                        SCTP User Application

-----------------------------------------------------
_____________ ____________________
| | | Sequenced Delivery |
| Association | | within Streams |
| | |____________________|
| Startup |
| | ____________________________
| and | | User Data Fragmentation |
| | |____________________________|
| Takedown |
| | ____________________________
| | | Acknowledgement |
| | | and |
| | | Congestion Avoidance |
| | |____________________________|
| |
| | ____________________________
| | | Chunk Bundling |
| | |____________________________|
| |
| | ________________________________
| | | Packet Validation |
| | |________________________________|
| |
| | ________________________________
| | | Path Management |
|_____________| |________________________________|

Figura 2: Vista funzionale del servizio di trasporto SCTP

1.5.1. Avvio e chiusura dell'associazione

Un'associazione viene avviata da una richiesta dell'utente SCTP (vedere la descrizione della primitiva ASSOCIATE (o SEND) nella sezione 10).

Un meccanismo cookie, simile a quello descritto da Karn e Simpson in [RFC2522], viene impiegato durante l'inizializzazione per fornire protezione contro gli attacchi di sincronizzazione. Il meccanismo cookie utilizza un handshake a quattro vie, le ultime due fasi del quale sono autorizzate a trasportare dati utente per una configurazione rapida. La sequenza di avvio è descritta nella sezione 5 di questo documento.

SCTP prevede la chiusura graziosa (cioè, shutdown) di un'associazione attiva su richiesta dell'utente SCTP. Vedere la descrizione della primitiva SHUTDOWN nella sezione 10. SCTP consente anche la chiusura non graziosa (cioè, abort), sia su richiesta dell'utente (primitiva ABORT) sia come risultato di una condizione di errore rilevata all'interno del livello SCTP. La sezione 9 descrive sia le procedure di chiusura graziosa che quelle non graziose.

SCTP non supporta uno stato semi-aperto (come TCP) in cui una parte può continuare a inviare dati mentre l'altra estremità è chiusa. Quando uno dei due endpoint esegue uno shutdown, l'associazione su ciascun peer smetterà di accettare nuovi dati dal suo utente e consegnerà solo i dati in coda al momento della chiusura graziosa (vedere sezione 9).

1.5.2. Consegna sequenziata all'interno dei flussi

Il termine "flusso" è utilizzato in SCTP per riferirsi a una sequenza di messaggi utente che devono essere consegnati al protocollo di livello superiore in ordine rispetto ad altri messaggi all'interno dello stesso flusso. Questo è in contrasto con il suo utilizzo in TCP, dove si riferisce a una sequenza di byte (in questo documento, si presume che un byte sia di 8 bit).

L'utente SCTP può specificare al momento dell'avvio dell'associazione il numero di flussi da supportare dall'associazione. Questo numero viene negoziato con l'estremità remota (vedere sezione 5.1.1). I messaggi utente sono associati a numeri di flusso (primitive SEND, RECEIVE, sezione 10). Internamente, SCTP assegna un numero di sequenza del flusso a ogni messaggio passato ad esso dall'utente SCTP. Sul lato ricevente, SCTP garantisce che i messaggi vengano consegnati all'utente SCTP in sequenza all'interno di un dato flusso. Tuttavia, mentre un flusso può essere bloccato in attesa del successivo messaggio utente in sequenza, la consegna da altri flussi può procedere.

SCTP fornisce un meccanismo per bypassare il servizio di consegna sequenziata. I messaggi utente inviati utilizzando questo meccanismo vengono consegnati all'utente SCTP non appena vengono ricevuti.

1.5.3. Frammentazione dei dati utente

Quando necessario, SCTP frammenta i messaggi utente per garantire che il pacchetto SCTP passato al livello inferiore sia conforme al MTU del percorso. Al ricevimento, i frammenti vengono riassemblati in messaggi completi prima di essere passati all'utente SCTP.

1.5.4. Conferma e prevenzione della congestione

SCTP assegna un numero di sequenza di trasmissione (TSN) a ciascun frammento di dati utente o messaggio non frammentato. Il TSN è indipendente da qualsiasi numero di sequenza del flusso assegnato a livello di flusso. L'estremità ricevente conferma tutti i TSN ricevuti, anche se ci sono lacune nella sequenza. In questo modo, la consegna affidabile viene mantenuta funzionalmente separata dalla consegna del flusso sequenziato.

La funzione di conferma e prevenzione della congestione è responsabile della ritrasmissione dei pacchetti quando non è stata ricevuta una conferma tempestiva. La ritrasmissione dei pacchetti è condizionata da procedure di prevenzione della congestione simili a quelle utilizzate per TCP. Vedere la sezione 6 e la sezione 7 per una descrizione dettagliata delle procedure di protocollo associate a questa funzione.

1.5.5. Raggruppamento di chunk

Come descritto nella sezione 3, il pacchetto SCTP consegnato al livello inferiore consiste in un'intestazione comune seguita da uno o più chunk. Ogni chunk può contenere dati utente o informazioni di controllo SCTP. L'utente SCTP ha l'opzione di richiedere il raggruppamento di più di un messaggio utente in un singolo pacchetto SCTP. La funzione di raggruppamento di chunk di SCTP è responsabile dell'assemblaggio del pacchetto SCTP completo e del suo disassemblaggio sul lato ricevente.

Durante i periodi di congestione, un'implementazione SCTP può (MAY) ancora eseguire il raggruppamento anche se l'utente ha richiesto che SCTP non raggruppi. La disabilitazione del raggruppamento da parte dell'utente influisce solo sulle implementazioni SCTP che possono ritardare un breve periodo di tempo prima della trasmissione (per tentare di incoraggiare il raggruppamento). Quando il livello utente disabilita il raggruppamento, questo piccolo ritardo è vietato ma non il raggruppamento eseguito durante la congestione o la ritrasmissione.

1.5.6. Validazione del pacchetto

Un campo tag di verifica obbligatorio e un campo checksum a 32 bit (vedere l'appendice B per una descrizione del checksum CRC32c) sono inclusi nell'intestazione comune SCTP. Il valore del tag di verifica viene scelto da ciascuna estremità dell'associazione durante l'avvio dell'associazione. I pacchetti ricevuti senza il valore del tag di verifica previsto vengono scartati, come protezione contro gli attacchi di mascheramento cieco e contro i pacchetti SCTP obsoleti di un'associazione precedente. Il checksum CRC32c dovrebbe essere impostato dal mittente di ogni pacchetto SCTP per fornire protezione aggiuntiva contro la corruzione dei dati nella rete. Il ricevitore di un pacchetto SCTP con un checksum CRC32c non valido scarta silenziosamente il pacchetto.

1.5.7. Gestione del percorso

L'utente SCTP mittente è in grado di manipolare l'insieme di indirizzi di trasporto utilizzati come destinazioni per i pacchetti SCTP attraverso le primitive descritte nella sezione 10. La funzione di gestione del percorso SCTP sceglie l'indirizzo di trasporto di destinazione per ogni pacchetto SCTP in uscita in base alle istruzioni dell'utente SCTP e allo stato di raggiungibilità attualmente percepito dell'insieme di destinazioni idonee. La funzione di gestione del percorso monitora la raggiungibilità attraverso heartbeat quando il traffico di altri pacchetti è inadeguato a fornire queste informazioni e avvisa l'utente SCTP quando la raggiungibilità di qualsiasi indirizzo di trasporto dell'estremità remota cambia. La funzione di gestione del percorso è anche responsabile di segnalare l'insieme idoneo di indirizzi di trasporto locali all'estremità remota durante l'avvio dell'associazione e di segnalare gli indirizzi di trasporto restituiti dall'estremità remota all'utente SCTP.

All'avvio dell'associazione, un percorso primario viene definito per ciascun endpoint SCTP e viene utilizzato per l'invio normale di pacchetti SCTP.

Sul lato ricevente, la gestione del percorso è responsabile di verificare l'esistenza di un'associazione SCTP valida a cui appartiene il pacchetto SCTP in entrata prima di passarlo per ulteriore elaborazione.

Nota: La gestione del percorso e la validazione del pacchetto vengono eseguite contemporaneamente, quindi sebbene descritte separatamente sopra, in realtà non possono essere eseguite come elementi separati.

1.6. Aritmetica dei numeri di serie

È essenziale ricordare che lo spazio effettivo dei numeri di sequenza di trasmissione è finito, sebbene molto grande. Questo spazio varia da 0 a 2^32 - 1. Poiché lo spazio è finito, tutta l'aritmetica che tratta i numeri di sequenza di trasmissione deve essere eseguita modulo 2**32. Questa aritmetica senza segno preserva la relazione dei numeri di sequenza quando ciclano da 2**32 - 1 a 0 di nuovo. Ci sono alcune sottigliezze nell'aritmetica modulo del computer, quindi si dovrebbe prestare grande attenzione nella programmazione del confronto di tali valori. Quando si fa riferimento ai TSN, il simbolo "=<" significa "minore o uguale" (modulo 2**32).

I confronti e l'aritmetica sui TSN in questo documento dovrebbero (SHOULD) utilizzare l'aritmetica dei numeri di serie come definita in [RFC1982] dove SERIAL_BITS = 32.

Un endpoint non dovrebbe (SHOULD NOT) trasmettere un chunk DATA con un TSN che è più di 2**31 - 1 sopra il TSN iniziale della sua finestra di invio corrente. Farlo causerà problemi nel confronto dei TSN.

I numeri di sequenza di trasmissione si avvolgono quando raggiungono 2**32 - 1. Cioè, il successivo TSN che un chunk DATA deve (MUST) utilizzare dopo aver trasmesso TSN = 2**32 - 1 è TSN = 0.

Qualsiasi aritmetica eseguita sui numeri di sequenza del flusso dovrebbe (SHOULD) utilizzare l'aritmetica dei numeri di serie come definita in [RFC1982] dove SERIAL_BITS = 16. Tutta l'altra aritmetica e i confronti in questo documento utilizzano l'aritmetica normale.

1.7. Modifiche rispetto a RFC 2960

SCTP è stato originariamente definito in [RFC2960], che questo documento rende obsoleto. I lettori interessati ai dettagli delle varie modifiche che questo documento incorpora sono invitati a consultare [RFC4460].