Kompresja Protokolów Sieciowych

Kompresja nagłówków w protokołach takich jak IPv6, TCP i komunikacji VoIP.

Anatomia Cyfrowego Pakietu: Dlaczego Nagłówki Mają Znaczenie

Aby zrozumieć, dlaczego kompresja protokołów sieciowych jest tak ważna, musimy najpierw wyobrazić sobie, jak dane podróżują przez internet. Informacje nie płyną jednym, ciągłym strumieniem. Zamiast tego są dzielone na miliony małych, odrębnych fragmentów zwanych . Każdy pakiet jest jak cyfrowa koperta. Wewnątrz koperty znajduje się niewielka część Twoich właściwych danych, jest to ładunek (payload). Ale tak jak w prawdziwej kopercie, najważniejsza dla dostarczenia jest informacja zapisana na zewnątrz: nagłówek.

Nagłówek pakietu zawiera wszystkie niezbędne informacje kontrolne i adresowe, potrzebne do dostarczenia pakietu od nadawcy do odbiorcy oraz zapewnienia, że dane można poprawnie złożyć z powrotem. W typowym połączeniu internetowym wykorzystującym stos protokołów TCP/IP, pojedynczy pakiet przenosi stos nagłówków z różnych warstw protokołów, w tym:

  • Nagłówek IP (Internet Protocol): To główna etykieta adresowa. Zawiera adresy IP źródłowy i docelowy, na przykład 192.168.1.10192.168.1.10, które działają jak adresy uliczne dla komputerów wysyłającego i odbierającego. Standardowy nagłówek IPv4 ma 20 bajtów.
  • Nagłówek TCP (Transmission Control Protocol) lub Nagłówek UDP (User Datagram Protocol): Ten nagłówek zarządza połączeniem między konkretnymi aplikacjami. Zawiera numery portów źródłowego i docelowego (jak numer mieszkania przy danym adresie ulicznym), numery sekwencyjne do śledzenia kolejności pakietów i sumy kontrolne do wykrywania błędów. Standardowy nagłówek TCP ma 20 bajtów, a nagłówek UDP 8 bajtów.
  • Nagłówki Warstwy Aplikacji (czasami): Niektóre protokoły, takie jak RTP (Real-time Transport Protocol) używany do strumieniowania głosu i wideo, dodają swój własny nagłówek na wierzchu TCP/UDP, zawierający znaczniki czasu i inne informacje synchronizacyjne. Nagłówek RTP ma zazwyczaj 12 bajtów.

Problem Narzutu Protokolarnego

Łączny rozmiar tych nagłówków jest znany jako . W wielu sytuacjach ten narzut jest znikomy. Jeśli pobierasz duży obraz o rozmiarze 5 MB, dodatkowe 40 bajtów nagłówków na każdym pakiecie jest nieistotne. Jednak istnieje wiele nowoczesnych zastosowań, w których ładunek jest z natury bardzo mały, i to właśnie tam narzut staje się poważnym problemem.

Klasycznym przykładem jest Voice over IP (VoIP), technologia stojąca za rozmowami telefonicznymi przez internet. Aby zapewnić płynną rozmowę w czasie rzeczywistym, dźwięk jest dzielony na bardzo małe fragmenty. Typowy pakiet VoIP może zawierać tylko 20 lub 30 bajtów danych audio w swoim ładunku. Obliczmy teraz rozmiar nagłówka dla tego pakietu:

Nagłoˊwek IPv4 (20 bajtoˊw)+Nagłoˊwek UDP (8 bajtoˊw)+Nagłoˊwek RTP (12 bajtoˊw)=40 bajtoˊw nagłoˊwkoˊw\text{Nagłówek IPv4 (20 bajtów)} + \text{Nagłówek UDP (8 bajtów)} + \text{Nagłówek RTP (12 bajtów)} = \textbf{40 bajtów nagłówków}

Ten wynik jest zdumiewający. Aby wysłać zaledwie 20 bajtów rzeczywistej informacji audio, sieć musi przesłać pakiet o rozmiarze 60 bajtów, z czego 40 bajtów (czyli 67 procent) to czysty narzut. Ponad dwie trzecie przepustowości jest marnowane tylko na informacje adresowe i kontrolne. Ta nieefektywność jest szczególnie szkodliwa na łączach o niskiej przepustowości lub drogich, takich jak dane mobilne czy połączenia satelitarne. Ogranicza to liczbę jednoczesnych rozmów, zwiększa opóźnienia i zużywa baterię w urządzeniach mobilnych. To jest dokładnie problem, który kompresja protokołów sieciowych, a w szczególności kompresja nagłówków, została stworzona, aby rozwiązać.

Zasada Kompresji Nagłówków: Wykorzystanie Redundancji Między Pakietami

Kompresja nagłówków działa dzięki wykorzystaniu prostej, ale potężnej obserwacji: w ramach jednego strumienia komunikacyjnego (jak rozmowa telefoniczna, strumień wideo czy nawet pobieranie jednego pliku), większość informacji w nagłówkach pakietów jest wysoce powtarzalna.

Przeanalizujmy nagłówki w rozmowie VoIP od Użytkownika A do Użytkownika B:

  • Pola Statyczne: Niektóre pola są całkowicie statyczne przez cały czas trwania rozmowy. Adres IP źródłowy (IP Użytkownika A), adres IP docelowy (IP Użytkownika B), port UDP źródłowy i port UDP docelowy będą identyczne w każdym pojedynczym pakiecie. Niezwykle marnotrawne jest wysyłanie tych samych 40 bajtów informacji w kółko.
  • Pola Zmieniające się w Przewidywalny Sposób: Inne pola nie są statyczne, ale zmieniają się w bardzo przewidywalny sposób. Na przykład numer sekwencyjny RTP rośnie dokładnie o jeden z każdym kolejnym pakietem. Znacznik czasu RTP również wzrasta o stałą, przewidywalną wartość, odpowiadającą rozmiarowi ładunku audio.

Schematy kompresji nagłówków wykorzystują tę przewidywalność. Kompresor (u nadawcy) i dekompresor (u odbiorcy) ustanawiają wspólny stan, znany jako . Proces generalnie działa w następujący sposób:

  1. Pierwszych kilka pakietów strumienia jest wysyłanych z pełnymi, nieskompresowanymi nagłówkami. Pozwala to odbiorcy na zbudowanie swojej lokalnej kopii kontekstu, przechowując wszystkie informacje statyczne, takie jak adresy IP i numery portów.
  2. Gdy obie strony są zsynchronizowane i dzielą ten sam kontekst, kompresor przestaje wysyłać pełne nagłówki. Dla kolejnych pakietów wysyła tylko niewielki skompresowany nagłówek. Ten skompresowany nagłówek nie zawiera pełnych adresów IP, ale raczej mały identyfikator kontekstu, aby zidentyfikować, który zapisany kontekst należy użyć, wraz z minimalnymi informacjami opisującymi zmiany (np. jeden bit oznaczający "numer sekwencyjny wzrósł o jeden").
  3. Dekompresor na końcu odbierającym otrzymuje ten mały 1-3 bajtowy skompresowany nagłówek. Używa identyfikatora kontekstu, aby odzyskać zapisany pełny nagłówek, a następnie stosuje małą aktualizację (np. inkrementuje zapisany numer sekwencyjny), aby idealnie zrekonstruować oryginalny, pełny nagłówek przed przekazaniem pakietu do aplikacji.

Wysyłając tylko zmiany zamiast całego nagłówka za każdym razem, kompresja nagłówków może zmniejszyć 40-bajtowy narzut typowego pakietu VoIP do zaledwie 1 do 3 bajtów, co stanowi zysk wydajności ponad 90 procent.

ROHC (Solidna Kompresja Nagłówków): Złoty Standard

Najczęściej używanym i najpotężniejszym standardem kompresji nagłówków jest dziś ROHC. Słowo "Solidna" (Robust) w nazwie jest kluczowe; został on specjalnie zaprojektowany, aby działać niezawodnie nawet na trudnych, podatnych na błędy łączach, takich jak sieci bezprzewodowe i satelitarne, gdzie pakiety są często gubione lub dochodzą w innej kolejności.

ROHC to zaawansowany protokół stanowy, który definiuje różne profile dla różnych typów ruchu (np. ROHC-RTP dla VoIP, ROHC-TCP dla ruchu internetowego). Działa on w kilku stanach, aby zrównoważyć wydajność i solidność:

  • Stan Inicjalizacji i Odświeżania (IR): Kompresor zaczyna w tym stanie, wysyłając pełne nagłówki, aby ustanowić lub odświeżyć kontekst dekompresora.
  • Stan Pierwszego Rzędu (FO): Po ustanowieniu kontekstu kompresor przechodzi do tego stanu. Wysyła skompresowane nagłówki, które zawierają aktualizacje dla pól zmieniających się w nieprzewidywalny sposób lub wymagających ponownej synchronizacji.
  • Stan Drugiego Rzędu (SO): Jest to najbardziej zoptymalizowany stan. Gdy kompresor jest pewien, że dekompresor jest w pełni zsynchronizowany, wysyła najmniejsze możliwe nagłówki, często zawierające tylko skompresowany numer sekwencyjny.

Protokół może dynamicznie przechodzić między tymi stanami. Jeśli pakiet zostanie utracony, a dekompresor straci synchronizację, może zasygnalizować kompresorowi (jeśli dostępny jest kanał zwrotny) powrót do niższego stanu i wysłanie bardziej szczegółowego pakietu aktualizacyjnego w celu ponownego ustanowienia kontekstu. Ta solidność sprawia, że ROHC jest tak skuteczny w nowoczesnej komunikacji mobilnej.

Zastosowanie Praktyczne 1: IPv6 i Internet Rzeczy (IoT)

Jednym z najważniejszych nowoczesnych zastosowań kompresji nagłówków jest umożliwienie działania Internetu Rzeczy (IoT). Następca IPv4, , został zaprojektowany, aby rozwiązać problem wyczerpywania się adresów, ale wiązał się z kompromisem: większymi nagłówkami. Standardowy nagłówek IPv6 ma stały rozmiar 40 bajtów, czyli jest dwa razy większy od standardowego nagłówka IPv4.

Dla małych, niskoenergetycznych urządzeń IoT, takich jak czujniki czy inteligentne gadżety domowe, ten 40-bajtowy nagłówek jest ogromnym obciążeniem, zwłaszcza gdy ładunek może mieć tylko kilka bajtów (np. odczyt temperatury). Aby rozwiązać ten problem, stworzono wyspecjalizowany standard o nazwie 6LoWPAN (IPv6 over Low-Power Wireless Personal Area Networks). 6LoWPAN to zestaw standardów, które wykorzystują agresywną kompresję nagłówków i inne techniki, aby uczynić IPv6 praktycznym dla tych ograniczonych sieci. Kompresuje nagłówki poprzez:

  • Opuszczanie Wspólnych Pól: Wiele pól w nagłówkach IPv6 i UDP można pominąć i wywnioskować z kontekstu warstwy łącza danych.
  • Współdzielone Prefiksy: Wszystkie urządzenia w jednej sieci 6LoWPAN dzielą ten sam prefiks sieciowy IPv6. Ten prefiks nie musi być wysyłany w każdym pakiecie; jest częścią kontekstu.
  • Wyprowadzanie Adresu: 64-bitowy identyfikator interfejsu adresu IPv6 często można wyprowadzić bezpośrednio z 48-bitowego lub 64-bitowego adresu MAC urządzenia, co eliminuje potrzebę jego przesyłania.

Dzięki tym technikom 48 bajtów nagłówka IPv6 i UDP można skompresować do zaledwie 2-4 bajtów, co umożliwia wydajną komunikację IP nawet dla najmniejszych urządzeń.