Transport

Stream Control Transmission Protocol (SCTP)

Protokół transportu wielostrumieni łączący funkcje TCP i UDP.

Wprowadzenie: Usługa Transportowa SCTP

TCP oferuje niezawodny, uporządkowany strumień bajtów aplikacjom takim jak przeglądarka i poczta elektroniczna, a UDP bezpołączeniową usługę datagramową często używaną w aplikacjach czasu rzeczywistego bez gwarancji dostarczenia. Aplikacje wymagające granic wiadomości, niezależnych strumieni albo wielu ścieżek sieciowych potrzebują innej usługi transportowej. SCTP zaprojektowano z myślą o takim zestawie wymagań.

Protokół Kontroli Transmisji Strumieniowej (SCTP) zaprojektowano w 2000 roku dla sygnalizacji telekomunikacyjnej, w tym SS7 przez IP, a następnie opisano jako protokół transportowy ogólnego przeznaczenia. Jest zorientowany na wiadomości i obsługuje niezawodne dostarczanie, wiele strumieni oraz wieloadresowość w jednym skojarzeniu. W odróżnieniu od połączenia TCP skojarzenie SCTP może obejmować listy adresów transportowych obu punktów końcowych.

SCTP jest zorientowany na wiadomości jak UDP, a uporządkowane i niezawodne dostarczanie może działać w obrębie każdego strumienia. Wielostrumieniowość (multi-streaming) ogranicza blokowanie na czele kolejki między niezależnymi strumieniami, a wieloadresowość (multi-homing) pozwala używać alternatywnych adresów transportowych. Zachowanie granic wiadomości pozwala odbiorcy rozróżniać jednostki danych aplikacji. Taki model transportu służy zarówno sygnalizacji telekomunikacyjnej, jak i innym protokołom aplikacyjnym.

Problem, Który Adresuje SCTP: Blokowanie Między Strumieniami

TCP udostępnia jeden uporządkowany strumień bajtów. Brakujący bajt blokuje dostarczanie kolejnych bajtów do aplikacji, co określa się jako Blokowanie na Czele Kolejki (HOLB).

Jeden Uporządkowany Strumień TCP

Rozważmy połączenie TCP przenoszące niezależne obiekty aplikacyjne, takie jak HTML, arkusze stylów CSS i obrazy. TCP przekazuje je w jednym uporządkowanym ciągu bajtów, nawet gdy aplikacja traktuje je jako osobne wiadomości.

Ponieważ TCP zapewnia jeden ściśle uporządkowany strumień, późniejsze bajty nie mogą zostać dostarczone przed wcześniejszym brakującym zakresem numerów sekwencyjnych. Dane obiektu numer 5 czekają więc na obiekt numer 4, a numer 4 na numer 3, gdy należą do tego samego porządku bajtów. TCP traktuje obiekty aplikacyjne jako jeden ciąg bajtów i nie rozpoznaje ich niezależności.

Problem pojawia się po utracie wcześniejszego segmentu. Załóżmy, że pakiet z obiektem numer 3 zostaje utracony. Nawet gdy segmenty z obiektami 4, 5 i 6 dotrą, odbiorca TCP zatrzymuje ich bajty do czasu naprawienia brakującego zakresu. Nadawca wykrywa lukę przez przekroczenie limitu retransmisji albo zduplikowane ACK i retransmituje brakujące dane. Dopiero wtedy odbiorca może przekazać aplikacji ciągły zakres. Opóźnienie występuje także po sprawdzeniu i zapisaniu późniejszych pakietów w buforze odbiorczym.

Zjawisko to określa się jako Blokowanie na Czele Kolejki. Jedna strata wstrzymuje późniejsze bajty tego samego strumienia TCP, także wtedy, gdy należą one do niezależnych obiektów aplikacji. Opóźnienie ogranicza aplikacje, które mogłyby przetwarzać te obiekty niezależnie.

Funkcje SCTP

SCTP opisano z myślą o ograniczeniu blokowania uporządkowanego strumienia oraz o zapewnieniu granic wiadomości, wieloadresowości i uzgadniania z ciasteczkiem stanu. Projekt zawiera także jawne potwierdzenia, retransmisje, kontrolę przeciążenia i procedury zamknięcia, więc funkcje te nie wymagają implementacji po stronie aplikacji.

1. Wielostrumieniowość: Niezależne Strumienie

Skojarzenie SCTP nie jest pojedynczym strumieniem aplikacyjnym. Zawiera wiele równoległych, niezależnych strumieni, z których każdy ma własny identyfikator i przenosi wiadomości w jednym kierunku.

Aplikacja może przypisać niezależne dane do różnych strumieni: HTML do strumienia 1, CSS do strumienia 2, jeden obraz do strumienia 3, a drugi do strumienia 4. Skojarzenie utrzymuje te kanały logiczne w ramach jednej relacji transportowej. Identyfikatory strumieni są lokalne dla punktu końcowego, a każdy strumień jest jednokierunkowy, więc komunikacja dwukierunkowa zwykle używa strumieni w obu kierunkach.

SCTP zapewnia uporządkowane dostarczanie wewnątrz każdego strumienia, a strumienie mają niezależne przestrzenie numerów. Utrata danych obrazu w strumieniu 3 wstrzymuje uporządkowane dostarczanie w strumieniu 3, lecz HTML w strumieniu 1 i CSS w strumieniu 2 mogą zostać przekazane, gdy ich dane są gotowe. Wielostrumieniowość omija zatem HOLB między strumieniami. Nie usuwa opóźnienia uporządkowania w strumieniu dotkniętym stratą. Aplikacja musi nadal dobrać przypisanie strumieni do zależności danych.

2. Wieloadresowość (Multi-homing): Wiele Adresów Transportowych

Połączenia TCP są zdefiniowane przez ścisłą 4-krotkę: źródłowy IP, port źródłowy, docelowy IP, port docelowy. Jeśli interfejs sieciowy odpowiadający jednemu z tych adresów IP ulegnie awarii (np. karta sieciowa ulegnie uszkodzeniu lub kabel zostanie odłączony), połączenie TCP zostanie zerwane, nawet jeśli oba komputery mają inne działające interfejsy sieciowe i istnieje alternatywna ścieżka między nimi.

SCTP obsługuje wieloadresowość, więc punkt końcowy może ogłosić wiele adresów transportowych dla jednego skojarzenia. Funkcja może dotyczyć jednego punktu końcowego albo obu. Awaria jednego interfejsu nie musi zniszczyć skojarzenia, jeśli inny ogłoszony adres pozostaje osiągalny.

  • Podczas konfiguracji każda ze stron może podać listę wszystkich swoich dostępnych adresów IP.
  • Stos SCTP sprawdza osiągalność ścieżek za pomocą procedur HEARTBEAT, zwykle dla bezczynnych ścieżek w skonfigurowanych odstępach.
  • Jedna ścieżka jest wyznaczona jako ścieżka główna do transmisji danych, a pozostałe mogą pełnić funkcję alternatywną.
  • Jeśli ścieżka główna zostanie oznaczona jako nieaktywna, SCTP może retransmitować dane przez działającą ścieżkę alternatywną i utrzymać skojarzenie. Aplikacja może pozostać połączona, zależnie od wykrycia awarii i dostępnego zestawu adresów. Zmiana odbywa się w warstwie transportowej i nie gwarantuje nieprzerwanego ruchu podczas wykrywania awarii.

3. Niezawodny, Zorientowany na Wiadomości Transport

SCTP łączy granice wiadomości znane z datagramów z niezawodnością transportową i kontrolą kolejności. Wiadomość może zostać podzielona na fragmenty przenoszone w blokach DATA podczas transmisji i ponownie złożona przed dostarczeniem.

  • Zorientowany na Wiadomości (jak UDP): Dane są wysyłane i odbierane jako odrębne wiadomości. Jeśli aplikacja zapisze wiadomość 100-bajtową, a następnie wiadomość 200-bajtową, odbiorca odczyta wiadomość 100-bajtową, a następnie wiadomość 200-bajtową. Zachowuje to granice wiadomości, które programiści często muszą implementować nad strumieniowym modelem TCP. Wiadomość większa od rozmiaru możliwego na ścieżce może zostać podzielona i złożona przez SCTP.
  • Niezawodny (jak TCP): SCTP potwierdza dane przenoszone w blokach DATA za pomocą bloków SACK i retransmituje niepotwierdzone dane zgodnie z polityką niezawodności. Usługa podstawowa jest niezawodna, a rozszerzenia takie jak PR-SCTP mogą porzucać wybrane wiadomości zgodnie z polityką częściowej niezawodności. Niezawodność dotyczy danych, których nie porzucono zgodnie z włączoną polityką częściowej niezawodności.
  • Dostarczanie Uporządkowane i Nieuporządkowane: SCTP domyślnie zapewnia uporządkowane dostarczanie wiadomości wewnątrz pojedynczego strumienia. Aplikacja może zażądać dostarczania nieuporządkowanego, aby ominąć wcześniejsze wiadomości uporządkowane w tym strumieniu. Wiadomość nieuporządkowana pozostaje niezawodna w podstawowym SCTP, a polityka częściowej niezawodności może osobno zezwolić na jej porzucenie.

4. Uzgadnianie z Ciasteczkiem Stanu

Aby zainicjować skojarzenie, SCTP używa czteroetapowego uzgadniania, które odracza zapisanie stanu skojarzenia do chwili zwrotu prawidłowego ciasteczka. Ogranicza to podatność na wyczerpanie zasobów w atakach takich jak SYN flood. Wymiana obejmuje INIT, INIT-ACK, COOKIE-ECHO i COOKIE-ACK.

  1. INIT: Inicjator wysyła blok 'INIT', proponując skojarzenie.
  2. INIT-ACK: Punkt końcowy odpowiada blokiem 'INIT-ACK' zawierającym ciasteczko stanu. Ciasteczko przenosi wymagany stan skojarzenia oraz kod MAC obliczony z użyciem tajnego klucza. Punkt końcowy nie musi utrzymywać bloku kontrolnego skojarzenia podczas oczekiwania na zwrot ciasteczka.
  3. COOKIE-ECHO: Inicjator otrzymuje 'INIT-ACK' i odsyła ciasteczko do odpowiadającego punktu końcowego w bloku 'COOKIE-ECHO'. Zwrot dowodzi odebrania odpowiedzi przez inicjatora.
  4. COOKIE-ACK: Punkt końcowy otrzymuje odesłane ciasteczko i sprawdza jego kod MAC, czas życia oraz stan. Dopiero po prawidłowej weryfikacji przydziela zasoby skojarzenia i potwierdza je blokiem 'COOKIE-ACK'.

Mechanizm ogranicza zużycie zasobów w atakach SYN flood, ponieważ punkt końcowy nie zapisuje stanu skojarzenia, dopóki inicjator nie odbierze i nie zwróci ciasteczka. Zwrot potwierdza osiągalność ścieżki źródłowej, lecz nie stanowi ogólnej walidacji deklarowanego adresu IP.

Struktura Pakietu SCTP

Pakiet SCTP zawiera obowiązkowy Wspólny Nagłówek, po którym występuje jeden lub więcej bloków o zmiennej długości (chunks). Taka architektura przenosi komunikaty sterujące i dane w jednym pakiecie.

KomponentOpis
Wspólny Nagłówek (12 bajtów)Zawiera porty źródłowe i docelowe, Tag Weryfikacyjny używany do powiązania pakietu z bieżącym skojarzeniem i odrzucania wielu ślepych pakietów oraz 32-bitową sumę kontrolną CRC32c obliczaną przy wyzerowanym polu sumy.
Bloki (Chunks)Po nagłówku pakiet zawiera jeden lub więcej bloków. Każdy blok ma własne pola Typ, Flagi i Długość. Pozwala to na łączenie komunikatów sterujących i danych w jednym pakiecie. Przykładowe typy bloków to:
  • DATA: Przenosi właściwy ładunek aplikacji. Jego nagłówek zawiera flagi dla dostarczania uporządkowanego/nieuporządkowanego oraz Identyfikator Strumienia.
  • INIT / INIT-ACK / COOKIE-ECHO / COOKIE-ACK: Bloki kontrolne używane w 4-etapowym uzgadnianiu.
  • SACK: Blok Potwierdzenia Selektywnego zawierający potwierdzenie skumulowane i informacje o lukach.
  • HEARTBEAT / HEARTBEAT-ACK: Używane do sprawdzania osiągalności ścieżek w skojarzeniu wieloadresowym.
  • SHUTDOWN / SHUTDOWN-ACK / SHUTDOWN-COMPLETE: Używane do eleganckiego zakończenia skojarzenia.

Zastosowania i Wdrożenia SCTP

SCTP jest wdrażane w wyspecjalizowanych środowiskach, zamiast pełnić rolę ogólnego zamiennika TCP lub UDP. Obsługa natywna bywa mniej jednolita w systemach konsumenckich, a urządzenia pośredniczące, takie jak NAT i zapory sieciowe, mogą nie przekazywać protokołu bez jawnego wsparcia. Te warunki wdrożenia są niezależne od funkcji samej usługi transportowej.

SCTP jest więc używane w określonych wdrożeniach:

  • Telefonia i Sygnalizacja: Pierwotne zastosowanie obejmuje transport systemów sygnalizacyjnych, takich jak SIGTRAN (SS7 przez IP), w sieciach operatorskich, w tym mobilnych 3G i 4G/LTE. Niezawodne dostarczanie i wieloadresowość wspierają wymagania dotyczące awarii ścieżek sygnalizacyjnych.
  • Kanały Danych WebRTC: Kanały danych WebRTC używają SCTP przez DTLS przez UDP do przesyłania danych w czasie rzeczywistym między przeglądarkami, natomiast dźwięk i obraz korzystają z osobnych transportów multimedialnych. Mapowanie obsługuje wiele strumieni oraz kanały uporządkowane, nieuporządkowane, niezawodne i częściowo niezawodne dla wiadomości czatu, stanu gry i transferu plików. WebRTC nie udostępnia wieloadresowości SCTP, ponieważ skojarzenie SCTP jest przenoszone przez transport DTLS/UDP.
  • Porównanie z QUIC: QUIC jest odrębnym, zabezpieczonym transportem przenoszonym w UDP. Udostępnia dwukierunkowe i jednokierunkowe uporządkowane strumienie bajtów bez relacji kolejności między różnymi strumieniami, więc utrata pakietu może opóźnić dane w strumieniu, którego dotyczy. QUIC integruje TLS i ma własny format pakietów oraz projekt kontroli przeciążenia. Nie należy opisywać go jako reimplementacji SCTP.

Powiązane artykuły