Passa al contenuto principale

3. Formato pacchetto SCTP (SCTP Packet Format)

Un pacchetto SCTP è composto da un'intestazione comune e chunk. Un chunk contiene informazioni di controllo o dati utente.

Il formato del pacchetto SCTP è 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Common Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk #1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk #n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Più chunk possono essere raggruppati in un pacchetto SCTP fino alla dimensione MTU, ad eccezione dei chunk INIT, INIT ACK e SHUTDOWN COMPLETE. Questi chunk NON DEVONO (MUST NOT) essere raggruppati con nessun altro chunk in un pacchetto. Vedere la Sezione 6.10 per maggiori dettagli sul raggruppamento dei chunk.

Se un messaggio di dati utente non rientra in un pacchetto SCTP, può essere frammentato in più chunk utilizzando la procedura definita nella Sezione 6.9.

Tutti i campi interi in un pacchetto SCTP DEVONO (MUST) essere trasmessi in ordine di byte di rete, salvo diversa indicazione.

3.1. Descrizioni dei campi dell'intestazione comune SCTP (SCTP Common Header Field Descriptions)

Formato intestazione comune SCTP

     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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port Number | Destination Port Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Verification Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Numero porta sorgente (Source Port Number): 16 bit (intero senza segno)

Questo è il numero di porta del mittente SCTP. Può essere utilizzato dal ricevitore in combinazione con l'indirizzo IP sorgente, la porta di destinazione SCTP e possibilmente l'indirizzo IP di destinazione per identificare l'associazione a cui appartiene questo pacchetto. Il numero di porta 0 NON DEVE (MUST NOT) essere utilizzato.

Numero porta destinazione (Destination Port Number): 16 bit (intero senza segno)

Questo è il numero di porta SCTP a cui è destinato questo pacchetto. L'host ricevente utilizzerà questo numero di porta per demultiplexare il pacchetto SCTP all'endpoint/applicazione ricevente corretta. Il numero di porta 0 NON DEVE (MUST NOT) essere utilizzato.

Tag di verifica (Verification Tag): 32 bit (intero senza segno)

Il ricevitore di questo pacchetto utilizza il tag di verifica per convalidare il mittente di questo pacchetto SCTP. In trasmissione, il valore di questo tag di verifica DEVE (MUST) essere impostato sul valore del tag di iniziazione (Initiate Tag) ricevuto dall'endpoint peer durante l'inizializzazione dell'associazione, con le seguenti eccezioni:

  • Un pacchetto contenente un chunk INIT DEVE (MUST) avere un tag di verifica zero.

  • Un pacchetto contenente un chunk SHUTDOWN COMPLETE con il bit T impostato DEVE (MUST) avere il tag di verifica copiato dal pacchetto con il chunk SHUTDOWN ACK.

  • Un pacchetto contenente un chunk ABORT può (may) avere il tag di verifica copiato dal pacchetto che ha causato l'invio dell'ABORT. Per dettagli vedere Sezioni 8.4 e 8.5.

Un chunk INIT DEVE (MUST) essere l'unico chunk nel pacchetto SCTP che lo trasporta.

Checksum: 32 bit (intero senza segno)

Questo campo contiene il checksum di questo pacchetto SCTP. Il suo calcolo è discusso nella Sezione 6.8. SCTP utilizza l'algoritmo CRC32c come descritto nell'Appendice B per calcolare il checksum.

3.2. Descrizioni dei campi chunk (Chunk Field Descriptions)

La figura seguente illustra il formato dei campi per i chunk da trasmettere nel pacchetto SCTP. Ogni chunk è formattato con un campo Tipo chunk (Chunk Type), un campo Flag specifico del chunk, un campo Lunghezza chunk (Chunk Length) e un campo Valore (Value).

     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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Type | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Chunk Value /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Tipo chunk (Chunk Type): 8 bit (intero senza segno)

Questo campo identifica il tipo di informazioni contenute nel campo Valore chunk (Chunk Value). Assume un valore da 0 a 254. Il valore 255 è riservato per uso futuro come campo di estensione.

I valori dei tipi di chunk sono definiti come segue:

Valore ID  Tipo chunk
----- ----------
0 - Dati payload (Payload Data, DATA)
1 - Iniziazione (Initiation, INIT)
2 - Riconoscimento iniziazione (Initiation Acknowledgement, INIT ACK)
3 - Riconoscimento selettivo (Selective Acknowledgement, SACK)
4 - Richiesta heartbeat (Heartbeat Request, HEARTBEAT)
5 - Riconoscimento heartbeat (Heartbeat Acknowledgement, HEARTBEAT ACK)
6 - Interruzione (Abort, ABORT)
7 - Arresto (Shutdown, SHUTDOWN)
8 - Riconoscimento arresto (Shutdown Acknowledgement, SHUTDOWN ACK)
9 - Errore operativo (Operation Error, ERROR)
10 - Cookie di stato (State Cookie, COOKIE ECHO)
11 - Riconoscimento cookie (Cookie Acknowledgement, COOKIE ACK)
12 - Riservato per Explicit Congestion Notification Echo (Reserved for ECNE)
13 - Riservato per Congestion Window Reduced (Reserved for CWR)
14 - Arresto completato (Shutdown Complete, SHUTDOWN COMPLETE)
15 a 62 - disponibile
63 - riservato per estensioni chunk definite IETF
64 a 126 - disponibile
127 - riservato per estensioni chunk definite IETF
128 a 190 - disponibile
191 - riservato per estensioni chunk definite IETF
192 a 254 - disponibile
255 - riservato per estensioni chunk definite IETF

I tipi di chunk sono codificati in modo che i 2 bit di ordine più alto specifichino l'azione che deve essere intrapresa se l'endpoint di elaborazione non riconosce il tipo di chunk.

00 - Interrompere l'elaborazione di questo pacchetto SCTP e scartarlo,
non elaborare ulteriori chunk al suo interno.

01 - Interrompere l'elaborazione di questo pacchetto SCTP e scartarlo,
non elaborare ulteriori chunk al suo interno, e segnalare il chunk
non riconosciuto in un 'Unrecognized Chunk Type'.

10 - Saltare questo chunk e continuare l'elaborazione.

11 - Saltare questo chunk e continuare l'elaborazione, ma segnalare in un
chunk ERROR utilizzando la causa di errore 'Unrecognized Chunk Type'.

Nota: I tipi di chunk ECNE e CWR sono riservati per l'uso futuro della notifica di congestione esplicita (ECN); vedere Appendice A.

Flag chunk (Chunk Flags): 8 bit

L'uso di questi bit dipende dal tipo di chunk come fornito dal campo Tipo chunk. Salvo diversa indicazione, sono impostati a 0 in trasmissione e ignorati in ricezione.

Lunghezza chunk (Chunk Length): 16 bit (intero senza segno)

Questo valore rappresenta la dimensione del chunk in byte, inclusi i campi Tipo chunk, Flag chunk, Lunghezza chunk e Valore chunk. Pertanto, se il campo Valore chunk ha lunghezza zero, il campo Lunghezza sarà impostato a 4. Il campo Lunghezza chunk non conta alcun riempimento del chunk.

I chunk (inclusi i campi Tipo, Lunghezza e Valore) sono riempiti dal mittente con tutti byte zero per essere un multiplo di 4 byte di lunghezza. Questo riempimento NON DEVE (MUST NOT) essere più di 3 byte in totale. Il valore di Lunghezza chunk non include il riempimento di terminazione del chunk. Tuttavia, include il riempimento di qualsiasi parametro a lunghezza variabile tranne l'ultimo parametro nel chunk. Il ricevitore DEVE (MUST) ignorare il riempimento.

Nota: Un'implementazione robusta dovrebbe accettare il chunk indipendentemente dal fatto che il riempimento finale sia stato incluso o meno nella Lunghezza chunk.

Valore chunk (Chunk Value): lunghezza variabile

Il campo Valore chunk contiene le informazioni effettive da trasferire nel chunk. L'uso e il formato di questo campo dipendono dal Tipo chunk.

La lunghezza totale di un chunk (inclusi i campi Tipo, Lunghezza e Valore) DEVE (MUST) essere un multiplo di 4 byte. Se la lunghezza del chunk non è un multiplo di 4 byte, il mittente DEVE (MUST) riempire il chunk con tutti byte zero, e questo riempimento non è incluso nel campo Lunghezza chunk. Il mittente NON DEVE (MUST NOT) riempire con più di 3 byte. Il ricevitore DEVE (MUST) ignorare i byte di riempimento.

I chunk definiti da SCTP sono descritti in dettaglio nella Sezione 3.3. Le linee guida per le estensioni di chunk definite dall'IETF possono essere trovate nella Sezione 14.1 di questo documento.

3.2.1. Formato parametro opzionale/a lunghezza variabile (Optional/Variable-Length Parameter Format)

I valori chunk dei chunk di controllo SCTP consistono in un'intestazione specifica del tipo di chunk di campi obbligatori, seguita da zero o più parametri. I parametri opzionali e a lunghezza variabile contenuti in un chunk sono definiti in un formato Tipo-Lunghezza-Valore come 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Parameter Type | Parameter Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Parameter Value /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Tipo parametro chunk (Chunk Parameter Type): 16 bit (intero senza segno)

Il campo Tipo è un identificatore a 16 bit del tipo di parametro. Assume un valore da 0 a 65534.

Il valore 65535 è riservato per estensioni definite dall'IETF. Valori diversi da quelli definiti nelle descrizioni specifiche dei chunk SCTP sono riservati per l'uso da parte dell'IETF.

Lunghezza parametro chunk (Chunk Parameter Length): 16 bit (intero senza segno)

Il campo Lunghezza parametro contiene la dimensione del parametro in byte, inclusi i campi Tipo parametro, Lunghezza parametro e Valore parametro. Quindi, un parametro con un campo Valore parametro di lunghezza zero avrebbe un campo Lunghezza di 4. La Lunghezza parametro non include alcun byte di riempimento.

Valore parametro chunk (Chunk Parameter Value): lunghezza variabile

Il campo Valore parametro contiene le informazioni effettive da trasferire nel parametro.

La lunghezza totale di un parametro (inclusi i campi Tipo, Lunghezza parametro e Valore) DEVE (MUST) essere un multiplo di 4 byte. Se la lunghezza del parametro non è un multiplo di 4 byte, il mittente riempie il parametro alla fine (cioè dopo il campo Valore parametro) con tutti byte zero. La lunghezza del riempimento non è inclusa nel campo Lunghezza parametro. Un mittente NON DEVE (MUST NOT) riempire con più di 3 byte. Il ricevitore DEVE (MUST) ignorare i byte di riempimento.

I tipi di parametro sono codificati in modo che i 2 bit di ordine più alto specifichino l'azione che deve essere intrapresa se l'endpoint di elaborazione non riconosce il tipo di parametro.

00 - Interrompere l'elaborazione di questo parametro; non elaborare
ulteriori parametri all'interno di questo chunk.

01 - Interrompere l'elaborazione di questo parametro, non elaborare
ulteriori parametri all'interno di questo chunk, e segnalare il
parametro non riconosciuto in un 'Unrecognized Parameter',
come descritto nella Sezione 3.2.2.

10 - Saltare questo parametro e continuare l'elaborazione.

11 - Saltare questo parametro e continuare l'elaborazione ma segnalare
il parametro non riconosciuto in un 'Unrecognized Parameter',
come descritto nella Sezione 3.2.2.

Si noti che in tutti e quattro i casi, viene inviato un chunk INIT ACK o COOKIE ECHO. Nel caso 00 o 01, l'elaborazione dei parametri dopo il parametro sconosciuto viene annullata, ma nessuna elaborazione già effettuata viene annullata.

I parametri SCTP effettivi sono definiti nelle sezioni specifiche dei chunk SCTP. Le regole per le estensioni di parametro definite dall'IETF sono definite nella Sezione 14.2. Si noti che un tipo di parametro DEVE (MUST) essere univoco su tutti i chunk. Ad esempio, il tipo di parametro '5' è utilizzato per rappresentare un indirizzo IPv4 (vedere Sezione 3.3.2.1). Il valore '5' è quindi riservato su tutti i chunk per rappresentare un indirizzo IPv4 e NON DEVE (MUST NOT) essere riutilizzato con un significato diverso in nessun altro chunk.

3.2.2. Segnalazione di parametri non riconosciuti (Reporting of Unrecognized Parameters)

Se il ricevitore di un chunk INIT rileva parametri non riconosciuti e deve segnalarli secondo la Sezione 3.2.1, DEVE (MUST) inserire i parametri 'Unrecognized Parameter' nel chunk INIT ACK inviato in risposta al chunk INIT. Si noti che se il ricevitore del chunk INIT NON sta per stabilire un'associazione (ad esempio, a causa della mancanza di risorse), un 'Unrecognized Parameter' NON sarebbe incluso con alcun ABORT inviato al mittente dell'INIT.

Se il ricevitore di un chunk INIT ACK rileva parametri non riconosciuti e deve segnalarli secondo la Sezione 3.2.1, DOVREBBE (SHOULD) raggruppare il chunk ERROR contenente la causa di errore 'Unrecognized Parameters' con il chunk COOKIE ECHO inviato in risposta al chunk INIT ACK. Se il ricevitore dell'INIT ACK non può raggruppare il chunk COOKIE ECHO con il chunk ERROR, il chunk ERROR PUÒ (MAY) essere inviato separatamente ma non prima che il COOKIE ACK sia stato ricevuto.

Nota: Ogni volta che un COOKIE ECHO viene inviato in un pacchetto, DEVE (MUST) essere il primo chunk.

3.3. Definizioni chunk SCTP (SCTP Chunk Definitions)

Questa sezione definisce il formato dei diversi tipi di chunk SCTP.

Nota: Poiché la Sezione 3.3 contiene numerose sottosezioni (da 3.3.1 a 3.3.13) che dettagliano vari tipi di chunk (DATA, INIT, INIT ACK, SACK, ecc.), questi contenuti saranno continuati nei documenti successivi.