Tajna broń protokołu TCP: kontrola przepływu sieci i kontrola przeciążenia sieci

Niezawodność transportu TCP
Wszyscy znamy protokół TCP jako niezawodny protokół transportowy, ale w jaki sposób gwarantuje on niezawodność transportu?

Aby osiągnąć niezawodną transmisję, należy uwzględnić wiele czynników, takich jak uszkodzenie, utrata, duplikacja danych i nieuporządkowane fragmenty. Jeśli tych problemów nie uda się rozwiązać, nie będzie można osiągnąć niezawodnej transmisji.

Dlatego też protokół TCP wykorzystuje mechanizmy takie jak numer sekwencyjny, potwierdzenie odpowiedzi, kontrolę ponownego wysyłania, zarządzanie połączeniami i kontrolę okna, aby zapewnić niezawodną transmisję.

W tym artykule skupimy się na przesuwnym oknie, kontroli przepływu i kontroli przeciążenia w protokole TCP. Mechanizm retransmisji zostanie omówiony osobno w następnej sekcji.

Kontrola przepływu sieciowego
Kontrola przepływu sieci, znana również jako kontrola ruchu sieciowego, jest w rzeczywistości przejawem subtelnej relacji między producentami a konsumentami. Prawdopodobnie wielokrotnie spotkałeś się z tym scenariuszem w pracy lub na rozmowach kwalifikacyjnych. Jeśli możliwości produkcyjne producenta znacznie przekraczają możliwości konsumpcji konsumenta, spowoduje to nieskończone wydłużanie kolejki. W poważniejszych przypadkach możesz wiedzieć, że nadmierne nagromadzenie wiadomości RabbitMQ może spowodować spadek wydajności całego serwera MQ. To samo dotyczy protokołu TCP; jeśli nie zostanie to sprawdzone, do sieci zostanie wysłanych zbyt wiele wiadomości, a konsumenci przekroczą swoje możliwości, podczas gdy producenci będą nadal wysyłać zduplikowane wiadomości, co znacząco wpłynie na wydajność sieci.

Aby zaradzić temu zjawisku, protokół TCP zapewnia nadawcy mechanizm kontroli ilości wysyłanych danych na podstawie rzeczywistej przepustowości odbiornika, znany jako sterowanie przepływem. Odbiorca utrzymuje okno odbioru, a nadawca okno wysyłania. Należy pamiętać, że te okna dotyczą tylko jednego połączenia TCP i nie wszystkie połączenia współdzielą to okno.

Protokół TCP zapewnia kontrolę przepływu poprzez użycie zmiennej dla okna odbioru. Okno odbioru informuje nadawcę o ilości dostępnej pamięci podręcznej. Nadawca kontroluje ilość wysyłanych danych na podstawie rzeczywistej przepustowości odbiornika.

Host odbiorczy powiadamia nadawcę o rozmiarze danych, które może odebrać, a nadawca wysyła dane w ramach tego limitu. Ten limit to rozmiar okna – pamiętasz nagłówek TCP? Istnieje pole okna odbioru, które wskazuje liczbę bajtów, które odbiorca może lub chce odebrać.

Host nadawcy okresowo wysyła pakiet sondy okna, który służy do sprawdzenia, czy host odbiorcy nadal jest w stanie odbierać dane. Gdy bufor odbiorcy jest zagrożony przepełnieniem, rozmiar okna jest ustawiany na mniejszą wartość, aby nadawca kontrolował ilość wysyłanych danych.

Oto diagram sterowania przepływem sieciowym:

Kontrola ruchu

Kontrola przeciążenia sieci
Zanim przejdziemy do kontroli przeciążenia, musimy zrozumieć, że oprócz okna odbioru i okna wysyłania istnieje również okno przeciążenia, które służy głównie do rozwiązania problemu szybkości, z jaką nadawca rozpoczyna wysyłanie danych do okna odbioru. Dlatego okno przeciążenia jest również utrzymywane przez nadawcę TCP. Potrzebujemy algorytmu, który zdecyduje, ile danych należy wysłać, ponieważ wysłanie zbyt małej lub zbyt dużej ilości danych nie jest idealne, stąd koncepcja okna przeciążenia.

W poprzednim podejściu do kontroli przepływu w sieci unikaliśmy sytuacji, w której nadawca wypełniał pamięć podręczną odbiorcy danymi, ale nie wiedzieliśmy, co dzieje się w sieci. Zazwyczaj sieci komputerowe działają w środowisku współdzielonym. W rezultacie może dochodzić do przeciążenia sieci z powodu komunikacji między innymi hostami.

Gdy sieć jest przeciążona, ciągłe wysyłanie dużej liczby pakietów może powodować problemy, takie jak opóźnienia i utrata pakietów. W tym momencie protokół TCP retransmituje dane, ale retransmisja zwiększa obciążenie sieci, co skutkuje większymi opóźnieniami i większą liczbą utraconych pakietów. Może to prowadzić do błędnego koła, które będzie się pogłębiać.

Zatem TCP nie może ignorować tego, co dzieje się w sieci. Gdy sieć jest przeciążona, TCP poświęca się, redukując ilość przesyłanych danych.

W związku z tym proponuje się kontrolę przeciążenia, której celem jest uniknięcie zapełnienia całej sieci danymi od nadawcy. Aby regulować ilość danych, które nadawca powinien wysłać, protokół TCP definiuje koncepcję zwaną oknem przeciążenia. Algorytm kontroli przeciążenia dostosowuje rozmiar okna przeciążenia w zależności od stopnia przeciążenia sieci, aby kontrolować ilość danych wysyłanych przez nadawcę.

Czym jest okno przeciążenia? Co to ma wspólnego z oknem wysyłania?

Okno przeciążenia to zmienna stanu utrzymywana przez nadawcę, która określa ilość danych, jaką nadawca może wysłać. Okno przeciążenia zmienia się dynamicznie w zależności od poziomu przeciążenia sieci.

Okno wysyłania to uzgodniony rozmiar okna między nadawcą a odbiorcą, który wskazuje ilość danych, jaką odbiorca może odebrać. Okno przeciążenia i okno wysyłania są ze sobą powiązane; okno wysyłania jest zazwyczaj równe minimalnemu rozmiarowi okna przeciążenia i okna odbioru, czyli swnd = min(cwnd, rwnd).

Okno przeciążenia cwnd zmienia się następująco:

Jeżeli w sieci nie występuje przeciążenie, tzn. nie występuje przekroczenie limitu czasu retransmisji, okno przeciążenia ulega wydłużeniu.

Jeżeli w sieci występuje przeciążenie, okno przeciążenia ulega skróceniu.

Nadawca ustala, czy sieć jest przeciążona, obserwując, czy pakiet potwierdzenia ACK został odebrany w określonym czasie. Jeśli nadawca nie odbierze pakietu potwierdzenia ACK w określonym czasie, uznaje się, że sieć jest przeciążona.

Oprócz okna przeciążenia, czas omówić algorytm kontroli przeciążenia TCP. Algorytm kontroli przeciążenia TCP składa się z trzech głównych części:

Powolny start:Początkowo okno przeciążenia cwnd jest stosunkowo małe, a nadawca zwiększa je wykładniczo, aby szybko dostosować się do przepustowości sieci.
Unikanie zatorów:Gdy okno przeciążenia przekroczy pewien próg, nadawca zwiększa okno przeciążenia liniowo, aby spowolnić tempo wzrostu okna przeciążenia i uniknąć przeciążenia sieci.
Szybka regeneracja:Jeżeli wystąpi przeciążenie, nadawca dzieli okno przeciążenia na pół i przechodzi w stan szybkiego odzyskiwania, aby określić lokalizację odzyskiwania sieci na podstawie otrzymanych duplikatów potwierdzeń, a następnie kontynuuje zwiększanie okna przeciążenia.

Powolny start
Po nawiązaniu połączenia TCP okno przeciążenia cwnd jest początkowo ustawiane na minimalną wartość MSS (maksymalny rozmiar segmentu). W ten sposób początkowa szybkość wysyłania wynosi około MSS/RTT bajtów na sekundę. Rzeczywista dostępna przepustowość jest zazwyczaj znacznie większa niż MSS/RTT, dlatego TCP dąży do znalezienia optymalnej szybkości wysyłania, co można osiągnąć za pomocą metody slow-start.

W procesie powolnego startu wartość okna przeciążenia cwnd zostanie zainicjowana na 1 MSS, a za każdym razem, gdy zostanie potwierdzony przesłany segment pakietu, wartość cwnd będzie zwiększana o jeden MSS, czyli osiągnie 2 MSS. Następnie wartość cwnd będzie podwajana po każdej pomyślnej transmisji segmentu pakietu itd. Szczegółowy proces wzrostu przedstawiono na poniższym rysunku.

 Kontrola przeciążenia sieci

Jednak tempo wysyłania nie zawsze może rosnąć; wzrost musi się kiedyś skończyć. Kiedy więc kończy się wzrost tempa wysyłania? Powolny start zazwyczaj kończy wzrost tempa wysyłania na jeden z kilku sposobów:

Pierwszym sposobem jest utrata pakietów podczas procesu wysyłania z powolnym startem. W przypadku utraty pakietów, TCP ustawia okno przeciążenia nadawcy cwnd na 1 i ponownie uruchamia proces powolnego startu. W tym momencie wprowadzana jest koncepcja progu powolnego startu ssthresh, którego wartość początkowa stanowi połowę wartości cwnd, która generuje utratę pakietów. Oznacza to, że w przypadku wykrycia przeciążenia, wartość ssthresh wynosi połowę wartości okna.

Drugim sposobem jest bezpośrednia korelacja z wartością progu powolnego startu ssthresh. Ponieważ wartość ssthresh stanowi połowę wartości okna w momencie wykrycia przeciążenia, utrata pakietów może wystąpić przy każdym podwojeniu, gdy cwnd jest większe niż ssthresh. Dlatego najlepiej ustawić cwnd na ssthresh, co spowoduje przejście protokołu TCP w tryb kontroli przeciążenia i zakończenie powolnego startu.

Ostatnim sposobem, w jaki powolny start może się zakończyć, jest wykrycie trzech redundantnych potwierdzeń. W takim przypadku TCP przeprowadza szybką retransmisję i przechodzi w stan odzyskiwania. (Jeśli nie jest jasne, dlaczego występują trzy pakiety ACK, zostanie to wyjaśnione osobno w mechanizmie retransmisji).

Unikanie zatorów
Gdy TCP wchodzi w stan kontroli przeciążenia, parametr cwnd jest ustawiany na połowę progu przeciążenia ssthresh. Oznacza to, że wartość cwnd nie może być podwajana za każdym razem, gdy odebrany zostaje segment pakietu. Zamiast tego, stosowane jest stosunkowo konserwatywne podejście, w którym wartość cwnd jest zwiększana tylko o jeden MSS (maksymalna długość segmentu pakietu) po zakończeniu każdej transmisji. Na przykład, nawet jeśli potwierdzonych zostanie 10 segmentów pakietu, wartość cwnd wzrośnie tylko o jeden MSS. Jest to liniowy model wzrostu, który ma również górną granicę wzrostu. W przypadku utraty pakietów, wartość cwnd jest zmieniana na MSS, a wartość ssthresh jest ustawiana na połowę wartości cwnd. Wzrost MSS zostanie również zatrzymany po odebraniu 3 redundantnych odpowiedzi ACK. Jeśli po zmniejszeniu wartości cwnd o połowę nadal odebrane zostaną trzy redundantne potwierdzenia, wartość ssthresh zostanie zapisana jako połowa wartości cwnd i nastąpi przejście w stan szybkiego odzyskiwania.

Szybki powrót do zdrowia
W trybie szybkiego odzyskiwania wartość okna przeciążenia cwnd jest zwiększana o jeden MSS za każde odebrane nadmiarowe potwierdzenie ACK, czyli takie, które nie dotarło w kolejności. Ma to na celu wykorzystanie segmentów pakietów, które zostały pomyślnie przesłane w sieci, aby maksymalnie zwiększyć wydajność transmisji.

Po nadejściu ACK utraconego segmentu pakietu, TCP zmniejsza wartość parametru cwnd, a następnie przechodzi w stan unikania przeciążenia. Ma to na celu kontrolowanie rozmiaru okna przeciążenia i zapobieganie dalszemu zwiększaniu przeciążenia sieci.

Jeśli po stanie kontroli przeciążenia nastąpi przekroczenie limitu czasu, stan sieci staje się poważniejszy, a protokół TCP przechodzi ze stanu unikania przeciążenia do stanu powolnego startu. W takim przypadku wartość okna przeciążenia cwnd jest ustawiona na 1 MSS, maksymalna długość segmentu pakietu, a wartość progu powolnego startu ssthresh jest ustawiona na połowę cwnd. Celem tego jest stopniowe zwiększanie rozmiaru okna przeciążenia po przywróceniu sieci do stanu równowagi między szybkością transmisji a stopniem przeciążenia sieci.

Streszczenie
Jako niezawodny protokół transportowy, TCP implementuje niezawodny transport poprzez numer sekwencyjny, potwierdzenie, kontrolę retransmisji, zarządzanie połączeniami i kontrolę okna. Wśród nich, mechanizm kontroli przepływu kontroluje ilość danych wysyłanych przez nadawcę zgodnie z rzeczywistą przepustowością odbiorczą odbiorcy, co pozwala uniknąć problemów z przeciążeniem sieci i spadkiem wydajności. Mechanizm kontroli przeciążenia zapobiega wystąpieniu przeciążenia sieci poprzez dostosowanie ilości danych wysyłanych przez nadawcę. Koncepcje okna przeciążenia i okna wysyłania są ze sobą powiązane, a ilość danych u nadawcy jest kontrolowana poprzez dynamiczne dostosowywanie rozmiaru okna przeciążenia. Powolny start, unikanie przeciążenia i szybkie odzyskiwanie to trzy główne elementy algorytmu kontroli przeciążenia TCP, które dostosowują rozmiar okna przeciążenia poprzez różne strategie, aby dostosować się do przepustowości i stopnia przeciążenia sieci.

W następnej sekcji szczegółowo omówimy mechanizm retransmisji TCP. Mechanizm retransmisji jest ważnym elementem protokołu TCP, który zapewnia niezawodną transmisję. Zapewnia on niezawodną transmisję danych poprzez retransmisję utraconych, uszkodzonych lub opóźnionych danych. Zasada implementacji i strategia mechanizmu retransmisji zostaną przedstawione i szczegółowo przeanalizowane w następnej sekcji. Bądźcie czujni!


Czas publikacji: 24-02-2025