3.3. Definizioni chunk SCTP (SCTP Chunk Definitions)
Questa sezione definisce il formato dei diversi tipi di chunk SCTP.
3.3.1. Dati payload (Payload Data, DATA) (0)
Il seguente formato DEVE (MUST) essere utilizzato per il chunk DATA:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0 | Reserved|U|B|E| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TSN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream Identifier S | Stream Sequence Number n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Protocol Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ User Data (seq n of Stream S) /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Riservato (Reserved): 5 bit
Dovrebbe essere impostato su tutti '0' e ignorato dal ricevitore.
Bit U: 1 bit
Il bit non ordinato (Unordered). Se impostato su '1', indica che questo è un chunk DATA non ordinato e non è assegnato alcun numero di sequenza del flusso a questo chunk DATA. Pertanto, il ricevitore DEVE (MUST) ignorare il campo numero di sequenza del flusso.
Dopo il riassemblaggio (se necessario), i chunk DATA non ordinati DEVONO (MUST) essere inviati al livello superiore dal ricevitore senza alcun tentativo di riordinamento.
Se un messaggio utente non ordinato è frammentato, ogni frammento del messaggio DEVE (MUST) avere il suo bit U impostato su '1'.
Bit B: 1 bit
Il bit frammento iniziale (Beginning fragment bit). Se impostato, indica il primo frammento di un messaggio utente.
Bit E: 1 bit
Il bit frammento finale (Ending fragment bit). Se impostato, indica l'ultimo frammento di un messaggio utente.
Un messaggio utente non frammentato deve avere sia il bit B che il bit E impostati su '1'. L'impostazione sia del bit B che del bit E su '0' indica un frammento intermedio di un messaggio utente multi-frammento, come riassunto nella seguente tabella:
B E Descrizione
============================================================
| 1 0 | Primo pezzo di un messaggio utente frammentato |
+----------------------------------------------------------+
| 0 0 | Pezzo intermedio di un messaggio utente frammentato |
+----------------------------------------------------------+
| 0 1 | Ultimo pezzo di un messaggio utente frammentato |
+----------------------------------------------------------+
| 1 1 | Messaggio non frammentato |
============================================================
| Tabella 1: Flag di descrizione frammento |
============================================================
Quando un messaggio utente è frammentato in più chunk, i TSN sono utilizzati dal ricevitore per riassemblare il messaggio. Ciò significa che i TSN per ogni frammento di un messaggio utente frammentato DEVONO (MUST) essere strettamente sequenziali.
Lunghezza (Length): 16 bit (intero senza segno)
Questo campo indica la lunghezza del chunk DATA in byte dall'inizio del campo tipo fino alla fine del campo dati utente escluso qualsiasi riempimento. Un chunk DATA con un byte di dati utente avrà la lunghezza impostata su 17 (indicando 17 byte).
Un chunk DATA con un campo dati utente di lunghezza L avrà il campo Lunghezza impostato su (16 + L) (indicando 16+L byte) dove L DEVE (MUST) essere maggiore di 0.
TSN: 32 bit (intero senza segno)
Questo valore rappresenta il TSN per questo chunk DATA. L'intervallo valido di TSN è da 0 a 4294967295 (2**32 - 1). Il TSN torna a 0 dopo aver raggiunto 4294967295.
Identificatore flusso S (Stream Identifier S): 16 bit (intero senza segno)
Identifica il flusso a cui appartengono i seguenti dati utente.
Numero sequenza flusso n (Stream Sequence Number n): 16 bit (intero senza segno)
Questo valore rappresenta il numero di sequenza del flusso dei seguenti dati utente all'interno del flusso S. L'intervallo valido è da 0 a 65535.
Quando un messaggio utente è frammentato da SCTP per il trasporto, lo stesso numero di sequenza del flusso DEVE (MUST) essere trasportato in ciascuno dei frammenti del messaggio.
Identificatore protocollo payload (Payload Protocol Identifier): 32 bit (intero senza segno)
Questo valore rappresenta un identificatore di protocollo specificato dall'applicazione (o livello superiore). Questo valore viene passato a SCTP dal suo livello superiore e inviato al suo peer. Questo identificatore non è utilizzato da SCTP ma può essere utilizzato da determinate entità di rete, così come dall'applicazione peer, per identificare il tipo di informazioni trasportate in questo chunk DATA. Questo campo deve essere inviato anche nei chunk DATA frammentati (per assicurarsi che sia disponibile per gli agenti nel mezzo della rete). Si noti che questo campo NON è toccato da un'implementazione SCTP; pertanto, il suo ordine dei byte NON è necessariamente big endian. Il livello superiore è responsabile di qualsiasi conversione dell'ordine dei byte su questo campo.
Il valore 0 indica che nessun identificatore di applicazione è specificato dal livello superiore per questi dati payload.
Dati utente (User Data): lunghezza variabile
Questi sono i dati utente del payload. L'implementazione DEVE (MUST) riempire la fine dei dati fino a un confine di 4 byte con tutti byte zero. Qualsiasi riempimento NON DEVE (MUST NOT) essere incluso nel campo Lunghezza. Un mittente NON DEVE mai (MUST never) aggiungere più di 3 byte di riempimento.
3.3.2. Iniziazione (Initiation, INIT) (1)
Questo chunk è utilizzato per iniziare un'associazione SCTP tra due endpoint. Il formato del chunk INIT è mostrato di seguito:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 1 | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Initiate Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Receiver Window Credit (a_rwnd) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of Outbound Streams | Number of Inbound Streams |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Initial TSN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Optional/Variable-Length Parameters /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il chunk INIT contiene i seguenti parametri. Salvo diversa indicazione, ogni parametro DEVE (MUST) essere incluso solo una volta nel chunk INIT.
Parametri fissi Stato
----------------------------------------------
Initiate Tag Obbligatorio
Advertised Receiver Window Credit Obbligatorio
Number of Outbound Streams Obbligatorio
Number of Inbound Streams Obbligatorio
Initial TSN Obbligatorio
Parametri variabili Stato Valore tipo
-------------------------------------------------------------
IPv4 Address (Nota 1) Opzionale 5
IPv6 Address (Nota 1) Opzionale 6
Cookie Preservative Opzionale 9
Reserved for ECN Capable (Nota 2) Opzionale 32768 (0x8000)
Host Name Address (Nota 3) Opzionale 11
Supported Address Types (Nota 4) Opzionale 12
Nota 1: I chunk INIT possono contenere più indirizzi che possono essere IPv4 e/o IPv6 in qualsiasi combinazione.
Nota 2: Il campo ECN Capable è riservato per l'uso futuro della notifica di congestione esplicita.
Nota 3: Un chunk INIT NON DEVE (MUST NOT) contenere più di un parametro di indirizzo nome host. Inoltre, il mittente dell'INIT NON DEVE (MUST NOT) combinare altri tipi di indirizzo con l'indirizzo nome host nell'INIT. Il ricevitore dell'INIT DEVE (MUST) ignorare qualsiasi altro tipo di indirizzo se il parametro indirizzo nome host è presente nel chunk INIT ricevuto.
Nota 4: Questo parametro, quando presente, specifica tutti i tipi di indirizzo che l'endpoint mittente può supportare. L'assenza di questo parametro indica che l'endpoint mittente può supportare qualsiasi tipo di indirizzo.
NOTA DI IMPLEMENTAZIONE: Se un chunk INIT è ricevuto con parametri noti che non sono parametri opzionali del chunk INIT, allora il ricevitore DOVREBBE (SHOULD) elaborare il chunk INIT e inviare indietro un INIT ACK. Il ricevitore del chunk INIT PUÒ (MAY) raggruppare un chunk ERROR con il chunk COOKIE ACK successivamente. Tuttavia, le implementazioni restrittive POSSONO (MAY) inviare indietro un chunk ABORT in risposta al chunk INIT.
Il campo Flag chunk in INIT è riservato, e tutti i bit in esso dovrebbero essere impostati su 0 dal mittente e ignorati dal ricevitore. La sequenza di parametri all'interno di un INIT può essere elaborata in qualsiasi ordine.
Tag di iniziazione (Initiate Tag): 32 bit (intero senza segno)
Il ricevitore dell'INIT (il lato rispondente) registra il valore del parametro Tag di iniziazione. Questo valore DEVE (MUST) essere inserito nel campo Tag di verifica di ogni pacchetto SCTP che il ricevitore dell'INIT trasmette all'interno di questa associazione.
Il Tag di iniziazione è permesso avere qualsiasi valore tranne 0. Vedere Sezione 5.3.1 per maggiori informazioni sulla selezione del valore del tag.
Se il valore del Tag di iniziazione in un chunk INIT ricevuto risulta essere 0, il ricevitore DEVE (MUST) trattarlo come un errore e chiudere l'associazione trasmettendo un ABORT.
Credito finestra ricevitore pubblicizzato (Advertised Receiver Window Credit, a_rwnd): 32 bit (intero senza segno)
Questo valore rappresenta lo spazio buffer dedicato, in numero di byte, che il mittente dell'INIT ha riservato in associazione con questa finestra. Durante la vita dell'associazione, questo spazio buffer NON DOVREBBE (SHOULD NOT) essere ridotto (cioè, buffer dedicati prelevati da questa associazione); tuttavia, un endpoint PUÒ (MAY) modificare il valore di a_rwnd che invia nei chunk SACK.
Numero di flussi in uscita (Number of Outbound Streams, OS): 16 bit (intero senza segno)
Definisce il numero di flussi in uscita che il mittente di questo chunk INIT desidera creare in questa associazione. Il valore 0 NON DEVE (MUST NOT) essere utilizzato.
Nota: Un ricevitore di un INIT con il valore OS impostato su 0 DOVREBBE (SHOULD) interrompere l'associazione.
Numero di flussi in entrata (Number of Inbound Streams, MIS): 16 bit (intero senza segno)
Definisce il numero massimo di flussi che il mittente di questo chunk INIT consente all'endpoint peer di creare in questa associazione. Il valore 0 NON DEVE (MUST NOT) essere utilizzato.
Nota: Non c'è negoziazione del numero effettivo di flussi, ma invece i due endpoint useranno il min(requested, offered). Vedere Sezione 5.1.1 per i dettagli.
Nota: Un ricevitore di un INIT con il valore MIS di 0 DOVREBBE (SHOULD) interrompere l'associazione.
TSN iniziale (Initial TSN, I-TSN): 32 bit (intero senza segno)
Definisce il TSN iniziale che il mittente utilizzerà. L'intervallo valido è da 0 a 4294967295. Questo campo PUÒ (MAY) essere impostato sul valore del campo Tag di iniziazione.
3.3.2.1. Parametri opzionali/a lunghezza variabile in INIT
I seguenti parametri seguono il formato Tipo-Lunghezza-Valore come definito nella Sezione 3.2.1. Tutti i campi Tipo-Lunghezza-Valore DEVONO (MUST) venire dopo i campi a lunghezza fissa definiti nella sezione precedente.
Parametro indirizzo IPv4 (5)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 5 | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Indirizzo IPv4: 32 bit (intero senza segno)
Contiene un indirizzo IPv4 dell'endpoint mittente. È codificato in binario.
Parametro indirizzo IPv6 (6)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 6 | Length = 20 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| IPv6 Address |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Indirizzo IPv6: 128 bit (intero senza segno)
Contiene un indirizzo IPv6 [RFC2460] dell'endpoint mittente. È codificato in binario.
Nota: Un mittente NON DEVE (MUST NOT) utilizzare un indirizzo IPv6 mappato IPv4 [RFC4291], ma dovrebbe invece utilizzare un parametro indirizzo IPv4 per un indirizzo IPv4.
Combinato con il numero porta sorgente nell'intestazione comune SCTP, il valore passato in un parametro indirizzo IPv4 o IPv6 indica un indirizzo di trasporto che il mittente dell'INIT supporterà per l'associazione che viene iniziata. Cioè, durante la durata di questa associazione, questo indirizzo IP può apparire nel campo indirizzo sorgente di un datagramma IP inviato dal mittente dell'INIT, e può essere utilizzato come indirizzo di destinazione di un datagramma IP inviato dal ricevitore dell'INIT.
Più di un parametro indirizzo IP può essere incluso in un chunk INIT quando il mittente INIT è multi-homed. Inoltre, un endpoint multi-homed può avere accesso a diversi tipi di rete; quindi, più di un tipo di indirizzo può essere presente in un chunk INIT, cioè, gli indirizzi IPv4 e IPv6 sono consentiti nello stesso chunk INIT.
Se l'INIT contiene almeno un parametro indirizzo IP, allora l'indirizzo sorgente del datagramma IP contenente il chunk INIT e qualsiasi indirizzo aggiuntivo fornito all'interno dell'INIT possono essere utilizzati come destinazioni dall'endpoint che riceve l'INIT. Se l'INIT non contiene alcun parametro indirizzo IP, l'endpoint che riceve l'INIT DEVE (MUST) utilizzare l'indirizzo sorgente associato al datagramma IP ricevuto come suo unico indirizzo di destinazione per l'associazione.
Si noti che non utilizzare alcun parametro indirizzo IP nell'INIT e INIT ACK è un'alternativa per rendere un'associazione più probabile che funzioni attraverso una scatola NAT.
Cookie preservativo (Cookie Preservative) (9)
Il mittente dell'INIT deve utilizzare questo parametro per suggerire al ricevitore dell'INIT una durata di vita più lunga del cookie di stato.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 9 | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Suggested Cookie Life-Span Increment (msec.) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Incremento durata cookie suggerito (Suggested Cookie Life-Span Increment): 32 bit (intero senza segno)
Questo parametro indica al ricevitore di quanto incremento in millisecondi il mittente desidera che il ricevitore aggiunga alla sua durata di vita del cookie predefinita.
Questo parametro opzionale dovrebbe essere aggiunto al chunk INIT dal mittente quando riprova a stabilire un'associazione con un peer per il quale il suo precedente tentativo di stabilire l'associazione è fallito a causa di un errore di operazione cookie scaduto. Il ricevitore PUÒ (MAY) scegliere di ignorare l'aumento suggerito della durata di vita del cookie per le proprie ragioni di sicurezza.
Nota: Questo documento contiene le Sezioni 3.3.1 e 3.3.2. Le definizioni chunk rimanenti (3.3.3 e oltre) saranno continuate nei documenti successivi.