Kontrola Przeciążenia
Ogólnosieciowe strategie unikania i zarządzania przeciążeniem.
1. Czym jest Przeciążenie Sieci?
W każdej sieci, od małej domowej sieci LAN po globalny internet, zasoby są ograniczone. Łącza sieciowe mają maksymalną przepustowość, a urządzenia takie jak routery mają ograniczoną ilość pamięci i mocy obliczeniowej. ma miejsce, gdy zapotrzebowanie na te zasoby przekracza ich podaż.
Kiedy router odbiera pakiety szybciej, niż jest w stanie je przekazać przez odpowiedni interfejs wyjściowy, przechowuje nadmiarowe pakiety w tymczasowym buforze pamięci zwanym kolejką. Jeśli ruch nadal napływa z tak dużą szybkością, kolejka rośnie. Jest to źródło przeciążenia. Jego objawy są natychmiast widoczne dla użytkowników i aplikacji:
- Zwiększone Opóźnienie (Latencja): Pakiety spędzają więcej czasu w kolejce, więc dłużej trwa ich dotarcie do celu.
- Zwiększony Jitter: Długość kolejki może się gwałtownie zmieniać, powodując wahania opóźnień między pakietami, co jest szkodliwe dla aplikacji czasu rzeczywistego.
- Utrata Pakietów: W końcu kolejka staje się całkowicie pełna. Wszelkie nowe pakiety, które przybywają, nie mogą być przechowane i są po prostu odrzucane przez router.
Pozostawione bez kontroli, poważne przeciążenie może doprowadzić do stanu znanego jako zapaść kongestyjna, w którym sieć staje się zablokowana. Nadawcy, zauważając utratę swoich pakietów, retransmitują je, dodając jeszcze więcej ruchu do już przeciążonej sieci. Większość przepustowości sieci jest zużywana na retransmisję pakietów, które prawdopodobnie i tak zostaną utracone, a bardzo mało użytecznych danych dociera do celu. Kontrola przeciążeń to zestaw mechanizmów zaprojektowanych w celu zapobiegania takiemu scenariuszowi i łagodnego zarządzania zasobami sieciowymi.
2. Kontrola Przeciążeń a Kontrola Przepływu
Należy odróżnić kontrolę przeciążeń od powiązanego, ale odrębnego pojęcia: kontroli przepływu.
- Kontrola Przepływu
to mechanizm lokalny, działający między pojedynczym nadawcą a pojedynczym odbiorcą. Jego celem jest zapewnienie, że nadawca nie przesyła danych szybciej, niż odbiorca jest w stanie je przetworzyć. Odbiorca ogłasza dostępną przestrzeń buforową (okno odbiorcze w TCP), a nadawca dostosowuje swoją szybkość transmisji, aby nie przepełnić tego bufora. Kontrola przepływu chroni odbiorcę.
- Kontrola Przeciążeń
to problem globalny, ogólnosieciowy. Jej celem jest ochrona samej sieci przed przeciążeniem. Nadawca może wysyłać dane do bardzo szybkiego odbiorcy z ogromnym buforem, więc kontrola przepływu pozwoliłaby na wysoką szybkość. Jeśli jednak ścieżka między nimi zawiera wolne lub zatłoczone łącze, mechanizmy kontroli przeciążeń zmuszą nadawcę do zwolnienia, aby nie przyczyniać się do przeciążenia sieci. Kontrola przeciążeń chroni sieć.
3. Cele Kontroli Przeciążeń
Efektywne algorytmy kontroli przeciążeń starają się zrównoważyć kilka konkurencyjnych celów:
- Wydajność: Sieć powinna mieć wysoką przepływność, co oznacza wysoką szybkość pomyślnego dostarczania danych. Zasoby nie powinny być niewykorzystane.
- Sprawiedliwość: Algorytm powinien przydzielać sprawiedliwy udział w przepustowości sieci konkurującym przepływom danych. Definicja "sprawiedliwości" może się różnić, ale zazwyczaj oznacza, że przepływy dzielące to samo wąskie gardło powinny otrzymać w przybliżeniu równą część pojemności.
- Stabilność: Wydajność sieci powinna być stabilna i przewidywalna, unikając gwałtownych wahań przepustowości i opóźnień.
- Niskie Opóźnienie: Zwłaszcza w przypadku aplikacji interaktywnych i czasu rzeczywistego, utrzymanie niskich opóźnień kolejkowania jest głównym celem.
4. Kontrola Przeciążeń w TCP: Podejście Kooperacyjne
Najszerzej wdrożone i zbadane mechanizmy kontroli przeciążeń są częścią Protokołu Kontroli Transmisji (TCP). Podejście TCP to strategia od końca do końca, w której nadawca wnioskuje o stanie sieci i odpowiednio dostosowuje swoje zachowanie, bez jawnych sygnałów od samych routerów. Centralnym pojęciem w kontroli przeciążeń TCP jest .
`cwnd` reprezentuje aktualne oszacowanie nadawcy dotyczące dostępnej pojemności na ścieżce sieciowej. Nadawca nie może wysłać więcej danych, niż wynosi minimum z `cwnd` i ogłoszonego przez odbiorcę okna kontroli przepływu (`rwnd`). Algorytmy TCP dynamicznie dostosowują rozmiar tego `cwnd` na podstawie informacji zwrotnych otrzymywanych z sieci w postaci potwierdzeń (ACK) i dowodów utraty pakietów. Ta dynamiczna regulacja generalnie podąża za zasadą znaną jako AIMD (Wzrost Addytywny, Spadek Multiplikatywny).
Cykl życia kontroli przeciążeń w TCP można podzielić na odrębne fazy.
Faza 1: Powolny Start (Slow Start)
Kiedy połączenie TCP dopiero się rozpoczyna, nadawca nic nie wie o dostępnej przepustowości ścieżki sieciowej. Faza Powolnego Startu ma na celu szybkie zbadanie sieci w celu znalezienia przybliżonej pojemności. Nazwa jest nieco myląca, ponieważ wzrost okna jest w rzeczywistości wykładniczy.
- Sesja zaczyna się z bardzo małym `cwnd`, zazwyczaj od 1 do 10 Maksymalnych Rozmiarów Segmentu (MSS). Załóżmy, że zaczyna się od `cwnd = 1 MSS`.
- Nadawca przesyła jeden segment. Kiedy otrzymane zostanie potwierdzenie (ACK) dla tego segmentu, nadawca zwiększa swoje `cwnd` o 1 MSS.
- Ponieważ dzieje się to dla każdego ACK, `cwnd` faktycznie podwaja się co czas podróży w obie strony (RTT). (Wysłanie 1 pakietu daje 1 ACK, `cwnd` staje się 2. Wysłanie 2 pakietów daje 2 ACK, `cwnd` staje się 4, i tak dalej).
- Ten wykładniczy wzrost trwa, dopóki nie zostanie utracony pakiet, lub `cwnd` nie osiągnie wartości zwanej .
Faza 2: Unikanie Przeciążeń (Congestion Avoidance)
Gdy `cwnd` osiągnie `ssthresh`, nadawca zakłada, że zbliża się do pojemności sieci i musi przejść w tryb bardziej ostrożny, aby nie spowodować przeciążenia. Jest to faza Unikania Przeciążeń.
- Zamiast wzrostu wykładniczego, nadawca używa teraz wzrostu addytywnego.
- `cwnd` jest zwiększane o około 1 MSS co każdy pełny czas podróży w obie strony. Oznacza to, że za każde otrzymane `cwnd` ACK, okno rośnie o jeden segment.
- Reprezentuje to znacznie wolniejszą, liniową fazę wzrostu, pozwalając nadawcy delikatnie sondować w poszukiwaniu dodatkowej dostępnej przepustowości.
Faza 3: Wykrywanie Przeciążeń i Reakcja
Faza Unikania Przeciążeń trwa do momentu, gdy nadawca wykryje utratę pakietu, co traktuje jako wyraźny sygnał przeciążenia w sieci. TCP ma dwa główne sposoby wykrywania utraty pakietów, a jego reakcja znacznie się różni dla każdego z nich.
- Reakcja na Timeout: Jest to najpoważniejszy wskaźnik przeciążenia. Timeout występuje, gdy nadawca nie otrzyma ACK dla wysłanego segmentu w obliczonym okresie czasu (RTO). Oznacza to, że pakiet (i prawdopodobnie jego późniejsze ACK) są definitywnie utracone.
- `ssthresh` jest ustawiany na połowę bieżącego `cwnd`.
- `cwnd` jest drastycznie redukowane, resetując się do `1 MSS`.
- Nadawca ponownie wchodzi w fazę Powolnego Startu. Jest to klasyczne zachowanie TCP Tahoe.
- Reakcja na Potrójne Zduplikowane ACK (Szybka Retransmisja/Szybkie Odtwarzanie): TCP może również wywnioskować pojedynczą utratę pakietu znacznie wcześniej. Jeśli nadawca wyśle segmenty 1, 2, 3, 4, 5, a segment 3 zostanie utracony, odbiorca otrzyma 1, 2, 4, 5. Potwierdzi segment 2, a po otrzymaniu segmentu 4, wyśle ponownie zduplikowane ACK dla segmentu 2 (wskazując, że wciąż czeka na 3). Gdy nadejdzie segment 5, wyśle kolejne zduplikowane ACK dla 2. Kiedy nadawca otrzyma trzy zduplikowane ACK dla tego samego segmentu, zakłada, że następny segment został utracony i wykonuje Szybką Retransmisję bez czekania na timeout. Wskazuje to na mniej poważne zdarzenie przeciążenia. Reakcja, charakterystyczna dla TCP Reno, jest również mniej surowa:
- To jest część "spadku multiplikatywnego" w AIMD. `ssthresh` jest ustawiany na połowę bieżącego `cwnd`.
- `cwnd` jest również redukowane do nowej wartości `ssthresh` (nie z powrotem do 1).
- Nadawca natychmiast wchodzi w fazę Unikania Przeciążeń, pomijając agresywny Powolny Start.
5. Nowoczesne Algorytmy Kontroli Przeciążeń TCP
Chociaż podejście AIMD w TCP Reno jest fundamentalne, nowoczesne sieci o bardzo dużej przepustowości i długich opóźnieniach ("długie, grube sieci") ujawniły słabości jego liniowego sondowania. Doprowadziło to do rozwoju bardziej zaawansowanych algorytmów.
- TCP CUBIC
CUBIC jest domyślnym algorytmem kontroli przeciążeń w systemie Linux i wielu innych nowoczesnych systemach. Zamiast liniowego wzrostu podczas Unikania Przeciążeń, CUBIC używa funkcji sześciennej do zarządzania wzrostem okna. Po utracie pakietu okno jest redukowane, a następnie na początku rośnie bardzo szybko. W miarę zbliżania się do rozmiaru okna sprzed utraty, wzrost znacznie zwalnia, aby zachować ostrożność. Po przekroczeniu tego punktu zaczyna ponownie przyspieszać, aby agresywnie sondować w poszukiwaniu nowej dostępnej przepustowości. To podejście jest bardziej stabilne i działa znacznie lepiej w sieciach o dużej prędkości i długich opóźnieniach.
- BBR (Bottleneck Bandwidth and Round-trip propagation time)
Opracowany przez Google, BBR przyjmuje fundamentalnie inne podejście. Zamiast używać utraty pakietów jako głównego sygnału przeciążenia, BBR aktywnie stara się mierzyć dwa kluczowe parametry ścieżki sieciowej: przepustowość wąskiego gardła i czas propagacji w obie strony. Następnie dostosowuje swoją szybkość wysyłania, aby pasowała do zmierzonej przepustowości wąskiego gardła. Dzięki temu BBR dąży do działania w optymalnym punkcie sieci, osiągając wysoką przepustowość bez zapełniania buforów routera, unikając w ten sposób wysokich opóźnień i utraty pakietów (bufferbloat), które mogą powodować algorytmy oparte na stratach, takie jak Reno i CUBIC.
6. Kontrola Przeciążeń Wspomagana przez Sieć
Chociaż mechanizmy od końca do końca, takie jak te w TCP, są potężne, same urządzenia sieciowe mogą odgrywać bardziej aktywną rolę w zarządzaniu przeciążeniami.
- Aktywne Zarządzanie Kolejkami (AQM)
AQM odnosi się do klasy algorytmów opartych na routerach, które proaktywnie zarządzają długością kolejek. Zamiast czekać, aż kolejka się całkowicie zapełni, a następnie odrzucać wszystkie przychodzące pakiety (zachowanie zwane tail-drop), algorytmy AQM zaczynają odrzucać pakiety wcześniej. Najbardziej znanym algorytmem AQM jest Losowe Wczesne Wykrywanie (RED). RED monitoruje średnią długość kolejki i, w miarę jej wzrostu, zaczyna losowo odrzucać pakiety z rosnącym prawdopodobieństwem. Wysyła to wczesny sygnał ostrzegawczy do nadawców TCP, skłaniając ich do zmniejszenia szybkości wysyłania przed wystąpieniem poważnego przeciążenia, co prowadzi do bardziej stabilnej sieci.
- Jawne Powiadamianie o Przeciążeniu (ECN)
ECN to dalsze udoskonalenie AQM. Zamiast odrzucać pakiet w celu zasygnalizowania przeciążenia, router obsługujący ECN może ustawić specjalną flagę "Doświadczono Przeciążenia" w nagłówku IP pakietu i normalnie go przekazać. Urządzenie odbierające widzi tę flagę i odsyła powiadomienie o przeciążeniu z powrotem do nadawcy w swoim potwierdzeniu TCP. Nadawca TCP reaguje tak, jakby otrzymał potrójne zduplikowane ACK (redukując swoje okno), ale bez potrzeby retransmisji utraconego pakietu. ECN pozwala na sygnalizowanie przeciążeń bez indukowania utraty pakietów, co jest bardziej wydajne.
Podsumowując, kontrola przeciążeń to złożona i dynamiczna dziedzina. Jest to kooperacyjny taniec między systemami końcowymi, które próbują dostosować się do stanu sieci, a samymi urządzeniami sieciowymi, które zarządzają swoimi zasobami i mogą dostarczać sygnałów, aby pomóc systemom końcowym dobrze się zachowywać. Mechanizmy te są ukrytym silnikiem, który pozwala współdzielonemu, publicznemu internetowi funkcjonować wydajnie na skalę globalną.