Protokół Kontroli Transmisji (TCP)
Niezawodny, połączeniowy transport: nagłówek, 3-etapowe uzgadnianie, flagi i kontrola przepływu.
Wprowadzenie: Niezawodna Rozmowa Telefoniczna Internetu
Wyobraźmy sobie podstawowy system transportowy internetu jako dwa rodzaje usług pocztowych. Pierwsza to szybka, pozbawiona fanaberii usługa pocztówek. Piszesz wiadomość, adresujesz ją i wrzucasz do skrzynki. Jest niezwykle wydajna, ale nie oferuje żadnych gwarancji. Pocztówka może zginąć, dotrzeć uszkodzona, a nawet dotrzeć później niż inna pocztówka, którą wysłałeś później. Ta usługa bardzo przypomina protokół UDP (User Datagram Protocol).
Teraz wyobraźmy sobie drugą usługę: formalną, nagrywaną rozmowę telefoniczną. Zanim będziesz mógł wymienić jakiekolwiek informacje, musisz najpierw wybrać numer i poczekać, aż druga osoba odbierze i potwierdzi, że jest gotowa do rozmowy. Podczas konwersacji możesz poprosić o powtórzenie wszystkiego, czego nie usłyszałeś wyraźnie. Oboje mówicie w sposób ustrukturyzowany i wiesz, że rozmowa przebiega w odpowiedniej kolejności. Formalnie się żegnacie przed odłożeniem słuchawki. To idealna analogia dla Protokołu Kontroli Transmisji (TCP).
TCP jest jednym z głównych protokołów w . Jego podstawową rolą jest zapewnienie niezawodnego, uporządkowanego i zweryfikowanego pod kątem błędów dostarczania strumienia danych między aplikacjami działającymi na hostach komunikujących się przez sieć IP. Tam, gdzie IP zajmuje się dostarczaniem pakietów do właściwego komputera, TCP dba o to, aby cała, kompletna wiadomość dotarła do właściwej aplikacji na tym komputerze, bezbłędnie.
Podstawowe Cechy Protokołu TCP
TCP realizuje swoją misję, przestrzegając kilku kluczowych zasad, które definiują jego działanie.
- Połączeniowy (Connection-Oriented)
Zanim jakiekolwiek dane aplikacji zostaną wysłane, TCP musi najpierw ustanowić połączenie między nadawcą a odbiorcą. Nie jest to fizyczny kabel, ale logiczny, wirtualny obwód, który istnieje przez cały czas trwania konwersacji. Ten proces konfiguracji, znany jako trójetapowe uzgadnianie, zapewnia, że obie strony są gotowe do komunikacji i zsynchronizowały swoje początkowe parametry. Sprawia to, że komunikacja jest stanowa, co oznacza, że zarówno klient, jak i serwer przechowują informacje o połączeniu.
- Niezawodne Dostarczanie
To jest cecha charakterystyczna TCP. Jeśli dane zostaną utracone lub uszkodzone w tranzycie, TCP wykryje ten fakt i retransmituje dane, których dotyczy problem. Ta gwarancja jest osiągana dzięki kombinacji mechanizmów:
- Numery Sekwencyjne: TCP etykietuje każdy wysyłany bajt danych unikalnym numerem sekwencyjnym. Pomyśl o tym jak o numerowaniu każdej strony książki przed wysłaniem jej pocztą.
- Potwierdzenia (ACK): Odbiorca, po otrzymaniu danych, odsyła wiadomość z potwierdzeniem, określającą następny numer sekwencyjny, którego się spodziewa. To tak, jakby odbiorca mówił: Otrzymałem wszystkie strony do strony 35, teraz proszę o stronę 36.
- Suma Kontrolna: Każdy segment TCP zawiera wartość sumy kontrolnej. Zarówno nadawca, jak i odbiorca obliczają tę wartość. Jeśli wartości nie zgadzają się po dotarciu segmentu, odbiorca wie, że dane zostały uszkodzone i je odrzuca, polegając na mechanizmie potwierdzeń, aby wywołać retransmisję.
- Uporządkowany Strumień Danych
Pakiety IP mogą dotrzeć w złej kolejności. TCP używa numerów sekwencyjnych do ponownego złożenia strumienia danych w prawidłowej kolejności przed przekazaniem go do aplikacji. Jeśli strony książki dotrą w kolejności 1, 2, 5, 4, 3, TCP przechowa je i uporządkuje poprawnie jako 1, 2, 3, 4, 5, zanim pozwoli aplikacji przeczytać historię. Zapewnia to, że plik, strona internetowa lub e-mail zostaną zrekonstruowane dokładnie tak, jak zostały wysłane.
- Komunikacja Pełnodupleksowa (Full-Duplex):
Połączenie TCP jest pełnodupleksowe, co oznacza, że dane mogą być wysyłane i odbierane w obu kierunkach jednocześnie w ramach tego samego połączenia. Gdy połączenie zostanie ustanowione, zarówno klient, jak i serwer mogą wysyłać dane do siebie w tym samym czasie, podobnie jak w naturalnej rozmowie telefonicznej.
Nawiązywanie Połączenia: Trójetapowe Uzgadnianie (Three-Way Handshake)
Proces tworzenia niezawodnego połączenia TCP to starannie zaaranżowana wymiana komunikatów, zwana trójetapowym uzgadnianiem. Jej celem jest upewnienie się, że obie strony są obecne, zgadzają się na komunikację i synchronizują swoje początkowe numery sekwencyjne.
Trójetapowe Uzgadnianie TCP
Proces nawiązywania połączenia krok po kroku.
Stan Początkowy
Serwer nasłuchuje nadchodzących połączeń. Klient jest obecnie zamknięty/bezczynny.
Przeanalizujmy kroki z perspektywy klienta (np. Twojej przeglądarki) chcącego połączyć się z serwerem (np. serwerem WWW):
- Krok 1: Klient wysyła pakiet SYN
Klient inicjuje rozmowę, wysyłając specjalny segment TCP do serwera. Ta pierwsza wiadomość ma ustawioną flagę SYN (Synchronize) na 1. Jest to odpowiednik zadzwonienia do kogoś i powiedzenia: Cześć, chciałbym rozpocząć rozmowę. Wraz z flagą SYN, klient wysyła swój własny, losowo wybrany , powiedzmy SEQ=100.
- Krok 2: Serwer odpowiada pakietem SYN-ACK
Jeśli serwer jest aktywny i port jest otwarty, otrzymuje pakiet SYN klienta. Teraz wie, że klient chce się połączyć. Serwer odpowiada segmentem z ustawionymi dwiema flagami:
- Flaga SYN jest ustawiona na 1, co oznacza, że on również jest gotowy i wysyła swój własny ISN, powiedzmy SEQ=300.
- Flaga ACK (Acknowledgment) jest ustawiona na 1, aby potwierdzić żądanie klienta. Aby to zrobić, ustawia numer potwierdzenia na numer sekwencyjny klienta plus jeden (ACK=101).
To odpowiedź serwera: Cześć, słyszę cię i jestem gotów do rozmowy. Potwierdzam twój numer startowy 100, a mój własny numer startowy to 300.
- Krok 3: Klient potwierdza odpowiedź serwera
Na koniec klient otrzymuje pakiet SYN-ACK od serwera. Klient wie już, że serwer jest gotowy. Aby zakończyć uzgadnianie, klient wysyła ostatni segment. Ten segment ma ustawioną flagę ACK na 1, a jego numer potwierdzenia jest ustawiony na numer sekwencyjny serwera plus jeden (ACK=301). Ten ostatni pakiet nie wymaga flagi SYN, ponieważ synchronizacja jest już ustanowiona.
To klient mówiący: Świetnie, potwierdzam twój numer startowy 300. Zacznijmy wymieniać dane. W tym momencie połączenie uważa się za ustanowione i zarówno klient, jak i serwer mogą rozpocząć wysyłanie danych aplikacji.
Zamykanie Połączenia: Czteroetapowe Uzgadnianie
Tak jak połączenie musi być starannie nawiązane, tak samo musi być elegancko zakończone, aby żadne dane nie zostały utracone. Ponieważ TCP jest protokołem pełnodupleksowym, każdy kierunek przepływu danych musi zostać zamknięty niezależnie. Prowadzi to do czteroetapowego procesu.
Czteroetapowe Uzgadnianie TCP (Zamykanie połączenia)
Proces kończenia połączenia TCP krok po kroku.
Stan Początkowy
Aktywne połączenie jest ustanowione. Klient jest gotowy do jego zakończenia.
Załóżmy, że klient decyduje się zakończyć sesję:
- Krok 1: Klient wysyła pakiet FIN
Klient, po zakończeniu wysyłania swoich danych, wysyła segment TCP z ustawioną flagą FIN (Finish). Sygnalizuje to serwerowi: Skończyłem wysyłać do ciebie dane.
- Krok 2: Serwer potwierdza FIN
Serwer odbiera pakiet FIN i odsyła segment ACK w celu jego potwierdzenia. W tym momencie serwer wie, że klient nie wyśle więcej danych, ale sam serwer może nadal mieć dane do wysłania. Połączenie jest teraz w stanie półzamkniętym.
- Krok 3: Serwer wysyła swój własny pakiet FIN
Gdy serwer również zakończy wysyłanie wszystkich swoich danych do klienta, wysyła swój własny pakiet FIN. Sygnalizuje to: Ja również skończyłem wysyłać do ciebie dane.
- Krok 4: Klient potwierdza FIN serwera
Klient otrzymuje pakiet FIN serwera i wysyła ostatnie potwierdzenie ACK. Po wysłaniu tego ostatniego ACK klient czeka przez krótki okres (aby obsłużyć wszelkie zabłąkane, opóźnione pakiety), zanim całkowicie zamknie połączenie. Gdy serwer otrzyma to ostatnie ACK, również zamyka połączenie. Sesja jest teraz w pełni zakończona.
Zarządzanie Przepływem Danych: Kontrola Przepływu i Kontrola Przeciążenia
TCP zawiera zaawansowane mechanizmy do zarządzania szybkością transmisji danych, nie tylko w celu zapewnienia niezawodności, ale także aby zapobiec przeciążeniu odbiorcy i samej sieci.
Kontrola Przepływu: Ochrona Odbiorcy
Kontrola przepływu to mechanizm zapobiegający zalaniu wolnego odbiorcy przez szybkiego nadawcę zbyt dużą ilością danych. Każdy komputer ma ograniczoną ilość pamięci, zwaną buforem odbiorczym, dla każdego połączenia TCP, w której przechowuje przychodzące dane przed przekazaniem ich do aplikacji.
Nagłówek TCP zawiera 16-bitowe pole zwane Rozmiarem Okna. Odbiorca używa tego pola, aby poinformować nadawcę, ile wolnego miejsca w buforze ma do dyspozycji. Jeśli odbiorca jest zajęty i jego bufor jest prawie pełny, ogłosi mniejszy rozmiar okna. Nadawca jest zobowiązany do wysłania nie więcej danych, niż wynosi ogłoszony rozmiar okna, zanim poczeka na następne potwierdzenie. Ten mechanizm pozwala na wydajny i adaptacyjny przepływ danych, który dopasowuje się do zdolności przetwarzania odbiorcy.
Kontrola Przeciążenia: Ochrona Sieci
Podczas gdy kontrola przepływu chroni odbiorcę, kontrola przeciążenia chroni sieć. Internet jest zasobem współdzielonym, a jeśli wielu nadawców transmituje dane z maksymalną prędkością jednocześnie, pośredniczące routery mogą zostać przeciążone, co prowadzi do przeciążenia sieci, utraty pakietów i opóźnień dla wszystkich.
TCP używa utraty pakietów jako niejawnego sygnału, że sieć jest przeciążona. Utrzymuje wewnętrzną zmienną zwaną Oknem Przeciążenia (cwnd), która ogranicza ilość danych, jakie może wysłać w danym momencie. TCP zaczyna od wysłania małej ilości danych (powolny start) i stopniowo zwiększa szybkość wysyłania, dopóki potwierdzenia są otrzymywane na czas. Jeśli pakiet zostanie utracony (co wskazuje brakujący ACK), TCP zakłada, że sieć jest przeciążona i drastycznie zmniejsza szybkość wysyłania. Następnie rozpoczyna bardziej ostrożną fazę zwiększania prędkości (unikanie przeciążenia). To adaptacyjne zachowanie sprawia, że TCP jest odpowiedzialnym uczestnikiem sieci, ponieważ dynamicznie dostosowuje swoją prędkość do aktualnych warunków na ścieżce sieciowej.