Struktura SCTP paketu
Stream Control Transmission Protocol (SCTP) má jednodušší strukturu paketu než TCP. Každý paket má dvě části:
- Společná hlavička – je vždy na začátku a má pevnou délku 12 bytů. Na obrázku vpravo je vyznačena tmavě modrým podkladem.
- Datové bloky nazývané chunk, které tvoří zbytek paketu. Na obrázku má první chunk zelené pozadí a poslední z N chunků (Chunk N) má červené pozadí.
|
Společná hlavička
Každý SCTP paket musí začínat společnou hlavičkou délky 12 bytů, která obsahuje následující informace:
- Zdrojový port
- Číslo portu jako u protokolu TCP nebo UDP.
- Cílový port
- Tento port slouží pro výběr aplikace na přijímající straně.
- Verifikační tag
- 32bitová náhodná hodnota zvolená při inicializaci pro odlišení vlastních paketů od zatoulaných paketů z předchozích spojení.
Chunky
Každý SCTP paket se skládá ze společné hlavičky a informačních chunků. Všechny chunky mají stejný formát a liší se pouze obsahem. Na obrázku vpravo je chunk vyznačen zeleným pozadím.
- Typ chunku
- 8bitová hodnota definovaná IETF pro rozlišení obsahu chunku.
- Příznaky chunku
- Osm bitů příznaků, jejichž definice závisí na typu chunku. Implicitní hodnota je nula.
- Délka chunku
- 16bitová hodnota bez znaménka udává celkovou délku chunku v bytech, která zahrnuje pole typ, příznaky, délka a data chunku, ne však jeho zarovnání na násobek 4.
- Data chunku
- Libovolná data závislá na typu chunku.
Pokud se délka chunku nerovná násobku 4, pak protokol implicitně doplní (padding) chunk byty s kódem 0.
|
Každý typ chunku může definovat sadu parametrů, které jsou umístěny uvnitř pole hodnota chunku (a jejichž délka je zahrnuta v délce chunku).
Existují dva typy parametrů:
- Pevné parametry – musí být vždy přítomné v uvedeném pořadí
- Volitelné parametry proměnnou délkou – následují vždy až po pevných parametrech a může jich být libovolný počet v libovolném pořadí.
Pro volitelné parametry (které mají proměnnou délku) se pole typ parametru, délka parametru a hodnota parametru chovají jako příslušná pole v chunku. Minimální velikost parametru 4 byty je použita, když je pole hodnota parametru prázdné a parametr obsahuje pouze pole typ parametru a délka parametru.
Typy chunků
RFC 2960 definuje následující seznam typů chunků.
hodnota | Zkratka | Popis |
---|---|---|
0 | DATA | Uživatelská data |
1 | INIT | Inicializace |
2 | INIT ACK | Potvrzení inicializace |
3 | SACK | Selektivní potvrzení |
4 | HEARTBEAT | Udržovací zpráva (heartbeat) |
5 | HEARTBEAT ACK | Potvrzení udržovací zprávy |
6 | ABORT | Zrušení (odmítnutí) spojení |
7 | SHUTDOWN | Žádost o ukončení |
8 | SHUTDOWN ACK | Potvrzení žádosti o ukončení |
9 | ERROR | Chyba |
10 | COOKIE ECHO | Stavové cookie |
11 | COOKIE ACK | Potvrzení stavového cookie |
12 | ECNE | Explicitní oznámení o zahlcení (rezervováno) |
13 | CWR | Okno zahlcení zmenšeno (rezervováno) |
14 | SHUTDOWN COMPLETE | Ukončení provedeno |
15-62 | N/A | Rezervováno IETF |
63 | rozšiřující chunk definovaný organizací IETF | |
64-126 | Rezervováno IETF | |
127 | rozšiřující chunk definovaný organizací IETF | |
128-190 | Rezervováno IETF | |
191 | rozšiřující chunk definovaný organizací IETF | |
192-254 | Rezervováno IETF | |
255 | rozšiřující chunk definovaný organizací IETF |
Následují tabulky definující jednotlivé chunky a jejich parametry. Na obrázcích jsou použity následující barvy podkladu:
- šedá: pole chunku
- červená: pevné parametry
- střídající se zelená a modrá barva: volitelné parametry
DATA chunk
|
- typ chunku
- pro payload data (DATA) vždy nula.
- příznaky chunku
- V roce 2006 byly definovány 3 příznaky:
- I – SACK chunk byl odeslán zpět bez zpoždění.
- U – Pokud je nastaven, indikuje, že tato data jsou neřazený chunk a pořadové číslo není validní. Pokud je fragmentován neřazený chunk, pak každý fragment má nastaven tento příznak.
- B – Pokud je nastaven, označuje počáteční fragment. Nefragmentované chunky mají tento příznak nastaven.
- E – Pokud je nastaven, označuje koncový fragment. Nefragmentované chunk mají tento příznak nastaven.
- délka chunku
- Délka chunku má minimální hodnotu 17, protože data délky 0 nejsou dovolena.
- Pevné parametry:
- Transmission sequence number (TSN)
- Pořadové číslo pro celý proud DATA (použitý pro sestavení fragmentovaných bloků).
- Identifikátor proudu
- Identifikátor proudu, do kterého tento datový chunk patří
- Stream sequence number
- Identifikátor pořadového čísla pro zprávu v tomto proudu. Pokud zpráva je fragmentovaná, pak tato hodnota se udržuje pro všechny fragmenty.
- Payload protokol identifikátor
- Identifikátor protokolu závislý na aplikaci. SCTP samotné toto pole nepoužívá ani nemodifikuje, může být však modifikováno zařízeními po trase. Hodnota 0 má význam žádný paylod protokol není zadán.
- Data
- Data závislá na aplikaci.
- Volitelné parametry: žádné.
INIT chunk
|
- typ chunku
- Pro inicializaci (INIT) vždy 1.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku, minimálně 20, když hodnota chunku je prázdná a žádné volitelné parametry nejsou použity
- Pevné parametry mají stejný význam jako u INIT ACK:
- Initiate tag
- 32bitové číslo bez znaménka, které je obsaženo ve společné hlavičce každého SCTP paketu v poli verifikační tag.
- Oznámený kredit okna příjemce (a_rwnd)
- Množství vyhrazeného místa ve vyrovnávací paměti pro tuto asociaci, které musí být vždy zachováno.
- počet odchozích proudů
- počet odchozích proudů (ve směru od odesilatele zprávy INIT), které bude možné používat v této asociaci. Nula není povolená hodnota a příjemce na ni musí odpovědět ABORT.
- počet příchozích proudů
- Neprovádí se žádné vyjednávání, musí být dostupných minimálně tolik proudů kolik bylo udáno.
- Počáteční TSN
- Libovolně zvolená počáteční hodnota transmission sequence number.
- Volitelné parametry jsou vyznačeny střídáním zeleného a modrého pozadí:
- typ parametru = 5
- Tento parametr obsahuje všechny IPv4 adresy použité na odesílající straně. Pro multihomed spojení.
- typ parametru = 6
- Tento parametr obsahuje všechny IPv6 adresy použité na odesílající straně. Pro multihomed spojení.
- typ parametru = 9
- Tento parametr obsahuje navrhovaný přírůstek doby života, o který by příjemce měl zvětšit svoji implicitní hodnotu doby života cookie (v milisekundách).
- typ parametru = 11
- Tento parametr je jméno počítače (hostname) podle RFC 1123, část 2.1. Vyhodnocení (resolution) tohoto jména není součástí SCTP. Jméno musí končit znakem s kódem 0, který musí být zahrnut v délce parametru.
- typ parametru = 12
- Tento parametr obsahuje typy adres, které odesilatel podporuje (např. IPv4 = 5, IPv6 = 6, hostname = 11).
- typ parametru = 32768
- Tento parametr je rezervovaný pro podporu explicitních oznámení o zahlcení.
INIT ACK chunk
INIT ACK chunk obsahuje stejné hodnoty jako INIT, ale typ chunku je vždy 2.
- Povinné parametry, pouze pro INIT ACK:
- typ parametru = 7 (State Cookie)
- State cookie obsahuje minimální informace pro vytvoření Transmission Control Block a je podepsána soukromým klíčem odesilatele. Formát cookie není specifikován.
SACK chunk
|
- typ chunku
- Pro selektivní acknowledgment (SACK) vždy 3.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku má minimální hodnotu 16, pokud chunk neobsahuje žádné informace o dírách nebo duplicitách.
- Pevné parametry:
- Kumulativní TSN ACK
- Potvrzuje všechna pořadová čísla přijatá ve správném pořadí – je to pořadové číslo posledního přijatého bytu. Následující byte zatím nebyl přijat.
- Oznámený kredit okna příjemce
- Množství vyhrazeného místa ve vyrovnávací paměti pro tuto asociaci, které musí být vždy zachováno.
- počet potvrzení chybějících bloků
- indikuje počet potvrzených chybějících bloků (děr).
- počet duplicitních TSN
- indikuje počet duplicitních TSN, které byly přijaty.
- Volitelné parametry jsou vyznačeny střídáním zeleného a modrého pozadí:
- Začátek chybějícího bloku
- potvrzuje, že byl přijat chybějící blok TSN (přidaný ke kumulativnímu TSN ACK) bloku TSN, který se potvrzuje.
- Konec chybějícího bloku
- potvrzuje, že byl přijat chybějící blok TSN (přidaný ke kumulativnímu TSN ACK) bloku TSN, který se potvrzuje.
- Duplicitní TSN číslo x
- TSN, který byl přijat více než jednou. TSN se objeví v tomto seznamu pokaždé, když byl přijat opakovaně.
HEARTBEAT chunk
|
- typ chunku
- Pro udržovací zprávu (HEARTBEAT) má vždy hodnotu 4.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku; minimálně 8, pokud není zadána žádná hodnota parametru.
- Pevné parametry: žádné
- Volitelné parametry jsou vyznačeny střídáním zeleného a modrého pozadí:
- typ parametru = 1
- Tento parametr obsahuje libovolné informace zadané odesilatelem
HEARTBEAT ACK chunk
|
- typ chunku
- Pro udržovací (heartbeat) potvrzení (HEARTBEAT ACK) má vždy hodnotu 5.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku je minimálně 8, pokud není obsažena žádná hodnota parametru.
- Pevné parametry: žádné
- Volitelné parametry jsou vyznačeny střídáním zeleného a modrého pozadí:
- typ parametru = 1
- Tento parametr obsahuje informace z udržovací zprávy.
ABORT chunk
|
- typ chunku
- Pro zrušení (ABORT) vždy 6.
- příznaky chunku
- Zatím je definován pouze jeden příznak:
- T
- Nastaven, pokud odesilatel nemá TCB.
- délka chunku
- délka chunku; minimálně 4, pokud nejsou přítomné žádné kódy chyb.
- Volitelné parametry (příčiny chyb) jsou definovány u chunku ERROR.
SHUTDOWN chunk
|
- typ chunku
- Pro ukončení (SHUTDOWN) má vždy hodnotu 7.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku, která je vždy 8.
- Pevné parametry:
- kumulativní TSN ACK
- Obsahuje poslední TSN přijaté odesilatelem ve správném pořadí.
SHUTDOWN ACK chunk
|
- typ chunku
- Pro ukončení potvrzení (SHUTDOWN ACK) má vždy hodnotu 8.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku, která je vždy 4.
ERROR chunk
|
- typ chunku
- Pro error (ERROR) má vždy hodnotu 9.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku (minimální hodnotu je 8, pokud pole hodnota obsahuje pouze jednu chybu. Velikost je 4 bytů plus velikost všech příčin chyby.
- Pevné parametry: žádné.
- Volitelné parametry jsou vyznačeny střídáním zeleného a modrého pozadí:
- typ parametru = 1
- Tento parametr identifikuje, že odesilatel přijal nevalidní identifikátor proudu.
- typ parametru = 2
- Tento parametr indikuje, že odesilatel přijal INIT nebo INIT ACK chunk s chybějícími povinnými parametry.
- typ parametru = 3
- Tento parametr indikuje přijetí validního stavového cookie, který byl opožděn o zadaný počet mikrosekund.
- typ parametru = 4
- Tento parametr indikuje, že odesilatel nemá prostředky pro spojení; obvykle v ABORT chunku.
- typ parametru = 5
- Tento parametr identifikuje adresu, kterou odesilatel nemohl resolvovat (pravděpodobně protože nepodporuje příslušný typ adresy); obvykle v ABORT chunku.
- typ parametru = 6
- Tento parametr identifikuje chybný chunk, když nejvyšší dva bity typu chunku jsou 01 nebo 11.
- typ parametru = 7
- Tento parametr identifikuje, že povinný parametr v INIT nebo INIT ACK chunku má chybnou hodnotu.
- typ parametru = 8
- Tento parametr je určen odesilateli INIT ACK chunku, který obsahoval chybný parametr.
- typ parametru = 9
- Tento parametr indikuje, že DATA chunk neobsahoval uživatelská data; obvykle v ABORT chunku.
- typ parametru = 10
- Tento parametr indikuje, že odesilatel přijal COOKIE ECHO, když byl ve stavu SHUTDOWN-ACK-SENT.
COOKIE ECHO chunk
|
- typ chunku
- Pro cookie echo (COOKIE ECHO) má vždy hodnotu 10.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- délka chunku.
- Chunk hodnota
- Obsahuje cookie data.
COOKIE ACK chunk
|
- typ chunku
- Pro cookie potvrzení (COOKIE ACK) má vždy hodnotu 11.
- příznaky chunku
- Zatím není definován žádný příznak.
- délka chunku
- pro tento typ vždy 4.
ECNE chunk
Zatím není definován.
CWR chunk
Zatím není definován.
SHUTDOWN COMPLETE chunk
|
- typ chunku
- Pro ukončení complete (SHUTDOWN COMPLETE) má vždy hodnotu 14.
- příznaky chunku
- Zatím je definován pouze jeden příznak:
- T
- Nastaven, pokud odesilatel nemá TCB.
- délka chunku
- Délka chunku; vždy 4.
Reference
V tomto článku byl použit překlad textu z článku SCTP paket structure na anglické Wikipedii.
- CASTAGNOLI, G., S. Braeuer; M. Herrman. Optimization of Cyclic Redundancy-Check Codes with 24 and 32 Parity Bity. IEEE Transactions on Communications. 1993, s. 883. DOI 10.1109/26.231911. (anglicky) . Castagnoli's et al. work on algorithmic selection of CRC polynomials
- Koopman, P. 32-Bit Cyclic Redundancy Codes Pro Internet Applications. The International Conference on Dependable Systems and Networks. 2002, s. 459. Dostupné online. DOI 10.1109/DSN.2002.1028931. (anglicky) . Verifikace Castagnoliho výsledků úplným prohledáním a některé nové vhodné polynomy
- RFC 4960 Stream Control Transmission Protocol (Obsoletes: 2960, 3309)
- RFC 4460 Stream Control Transmission Protocol (SCTP) Specification Errata and Issues
- RFC 3873 Stream Control Transmission Protocol (SCTP) Management Information Base (MIB)
- RFC 3758 Stream Control Transmission Protocol (SCTP) Partial Reliability Extension
- RFC 3554 On the Use of Stream Control Transmission Protocol (SCTP) with IPsec
- RFC 3436 Transport Layer Security over Stream Control Transmission Protocol
- RFC 3309 Stream Control Transmission Protocol (SCTP) Checksum Change
- RFC 3286 An Introduction to the Stream Control Transmission Protocol
- RFC 3257 Stream Control Transmission Protocol Applicability Statement
- RFC 2960 Stream Control Transmission Protocol