Transport

Protokół Kontroli Transmisji (TCP)

Niezawodny, połączeniowy transport: nagłówek, 3-etapowe uzgadnianie, flagi i kontrola przepływu.

Wprowadzenie: TCP jako niezawodny strumień bajtów

Protokoły transportowe oferują aplikacjom różne usługi dostarczania. Protokół UDP (User Datagram Protocol) wysyła niezależne datagramy z małym narzutem, lecz nie zapewnia retransmisji, kolejności ani stanu połączenia charakterystycznych dla TCP. Datagram może zaginąć, zostać uszkodzony, zduplikowany albo dotrzeć poza kolejnością, więc aplikacja UDP sama obsługuje potrzebne mechanizmy odtwarzania.

Protokół sterowania transmisją (TCP) zapewnia połączeniowy strumień bajtów. W zwykłym połączeniu punkty końcowe najpierw wymieniają segmenty sterujące, a następnie wykorzystują numery sekwencyjne, potwierdzenia, sumy kontrolne, retransmisje i kontrolę przepływu. Każdy kierunek można zamknąć osobno, a błąd może spowodować przerwanie połączenia.

TCP jest jednym z głównych protokołów w . Jego rolą jest zapewnienie niezawodnego, uporządkowanego i sprawdzonego pod kątem błędów strumienia bajtów między aplikacjami na hostach komunikujących się przez IP. IP przekazuje pakiety w kierunku hosta, a TCP kieruje strumień do aplikacji na podstawie portów i dostarcza bajty w kolejności, gdy połączenie pozostaje użyteczne. TCP nie zachowuje granic komunikatów aplikacyjnych, a przerwane połączenie może zakończyć się przed dostarczeniem wszystkich żądanych danych. Aplikacja musi samodzielnie wyznaczyć granice komunikatów i obsłużyć koniec strumienia albo błąd połączenia. TCP nie gwarantuje określonej przepływności ani opóźnienia, ponieważ zależą one od ścieżki, zasobów punktów końcowych i stanu kontroli przeciążenia.

Podstawowe Cechy Protokołu TCP

Działanie TCP wynika z kilku zasad definiujących usługę transportową.

  • Połączeniowy (Connection-Oriented)

    W zwykłym połączeniu TCP punkty końcowe ustanawiają stan przed wysłaniem danych aplikacji. Jest to logiczne powiązanie identyfikowane lokalnymi i zdalnymi adresami oraz portami, lecz nie dedykowany obwód fizyczny. Trójetapowe uzgadnianie wymienia początkowe informacje o sekwencji i potwierdza osiągalność w obu kierunkach. Następnie oba punkty końcowe przechowują stan dla kontroli sekwencji, potwierdzeń, przepływu i liczników czasu. Powiązanie jest lokalne dla dwóch implementacji punktów końcowych, a routery przekazują pakiety IP bez przechowywania stanu połączenia TCP. TCP Fast Open może zmienić moment wysłania danych aplikacji, lecz nadal wykorzystuje stan TCP i kontrolę numerów sekwencyjnych.

  • Niezawodne Dostarczanie

    TCP może obsługiwać zwykłe straty i odrzucać uszkodzone segmenty, gdy połączenie pozostaje aktywne. Niezawodność opiera się na kilku mechanizmach. Suma kontrolna wykrywa uszkodzenia, a ACK i retransmisje obsługują brakujące zakresy. Gdy odtworzenie nie może się zakończyć, TCP zgłasza błąd albo zamyka połączenie, więc niezawodność jest usługą z określonymi przypadkami awarii, bez gwarancji dostarczenia w każdych warunkach sieciowych:

    • Numery sekwencyjne: TCP przypisuje numery sekwencyjne bajtom w każdym kierunku. Numery identyfikują zakres bajtów oraz wspierają wykrywanie duplikatów i składanie danych.
    • Potwierdzenia (ACK): Odbiorca potwierdza następny oczekiwany numer sekwencyjny. Potwierdzenie skumulowane może potwierdzić spójny zakres bajtów i pozostawić brakujący zakres bez potwierdzenia.
    • Suma kontrolna: Każdy segment TCP zawiera sumę obliczoną z nagłówka TCP, danych i pseudo-nagłówka. Po nieudanej weryfikacji odbiorca odrzuca segment, a późniejsze potwierdzenie lub licznik może wywołać retransmisję.
  • Uporządkowany Strumień Danych

    TCP może otrzymać segmenty IP poza kolejnością. Wykorzystuje numery sekwencyjne do złożenia spójnego strumienia bajtów przed udostępnieniem go aplikacji. Segmenty odpowiadające zakresom 1, 2, 5, 4 i 3 mogą zostać zbuforowane i przekazane w kolejności po otrzymaniu brakujących zakresów. Aplikacja otrzymuje bajty sekwencyjnie, bez zachowania granic pierwotnych komunikatów.

  • Komunikacja Pełnodupleksowa (Full-Duplex):

    Połączenie TCP jest pełnodupleksowe. Każdy punkt końcowy może jednocześnie wysyłać i odbierać bajty w ramach tego samego połączenia. Oba kierunki mają osobne przestrzenie numerów sekwencyjnych, potwierdzenia i okna kontroli przepływu. FIN zamyka jeden kierunek, więc drugi może pozostać otwarty podczas uporządkowanego zamykania.

Nawiązywanie Połączenia: Trójetapowe Uzgadnianie (Three-Way Handshake)

Proces tworzenia połączenia TCP to trójetapowe uzgadnianie. Wymienia początkowe informacje o sekwencji i pozwala każdemu punktowi końcowemu potwierdzić, że druga strona może odbierać oraz potwierdzać segmenty sterujące. SYN i SYN-ACK zajmują również numery sekwencyjne, dlatego wartości potwierdzeń w przykładzie zwiększają się o jeden. Nasłuchujący serwer może odrzucić żądanie, pozostać bez odpowiedzi albo użyć ciasteczek SYN przy presji na stan oczekujących połączeń.

Rozważmy klienta, na przykład przeglądarkę, łączącego się z nasłuchującym serwerem WWW. Podane wartości sekwencji są przykładowe.

  1. Krok 1: Klient wysyła pakiet SYN

    Klient wysyła do serwera segment TCP z ustawioną flagą SYN (Synchronize). Wraz z SYN przekazuje . W przykładzie przyjmijmy SEQ=100. Wartość jest ilustracyjna i nie jest stałą TCP.

  2. Krok 2: Serwer odpowiada pakietem SYN-ACK

    Jeśli na porcie docelowym nasłuchuje aplikacja, serwer przetwarza SYN klienta i odpowiada segmentem z dwiema ustawionymi flagami:

    • Flaga SYN jest ustawiona na 1, a serwer wysyła własny ISN, oznaczony w przykładzie jako SEQ=300.
    • Flaga ACK (Acknowledgment) jest ustawiona na 1. Numer potwierdzenia jest równy ISN klienta plus jeden, więc w przykładzie ACK=101.

    Serwer potwierdził początkową wartość sekwencji klienta i przekazał własną. Rzeczywiste wartości są generowane przez punkty końcowe i nie są ustalone na 100 ani 300.

  3. Krok 3: Klient potwierdza odpowiedź serwera

    Klient otrzymuje SYN-ACK i wysyła segment z ustawioną flagą ACK. Numer potwierdzenia jest równy ISN serwera plus jeden, co w przykładzie daje ACK=301. Segment nie potrzebuje SYN, ponieważ obie początkowe wartości sekwencji zostały wymienione.

    Po końcowym ACK oba punkty końcowe mogą wejść w stan ESTABLISHED i wysyłać bajty aplikacyjne. TCP zapewnia strumień bajtów, a sposób podziału tych bajtów na żądania lub komunikaty określa protokół aplikacyjny.

Zamykanie Połączenia: Czteroetapowe Uzgadnianie

Uporządkowane zamknięcie wyłącza niezależnie oba kierunki pełnodupleksowego połączenia. Typowa wymiana wykorzystuje cztery segmenty sterujące, lecz jednoczesne zamknięcie i przerwanie przez RST prowadzą do innych przejść. FIN oznacza brak dalszych bajtów w danym kierunku, bez odrzucania danych już przekazanych do TCP. Aplikacja odbierająca może otrzymać informację o końcu strumienia w tym kierunku, gdy kierunek przeciwny pozostaje użyteczny. TIME-WAIT dotyczy aktywnego zamykającego i chroni starą krotkę połączenia przed opóźnionymi duplikatami.

W tym przykładzie klient inicjuje uporządkowane zamknięcie:

  1. Krok 1: Klient wysyła pakiet FIN

    Po zakończeniu wysyłania danych klient wysyła segment TCP z ustawioną flagą FIN (Finish). Sygnalizuje zamknięcie kierunku wysyłania przez klienta.

  2. Krok 2: Serwer potwierdza FIN

    Serwer odbiera FIN i wysyła ACK. Nie otrzyma już bajtów od klienta, lecz może nadal wysyłać pozostałe dane. Połączenie jest półzamknięte w kierunku klient-serwer.

  3. Krok 3: Serwer wysyła swój własny pakiet FIN

    Po zakończeniu wysyłania pozostałych danych serwer wysyła własny FIN i zamyka kierunek serwer-klient.

  4. Krok 4: Klient potwierdza FIN serwera

    Klient odbiera FIN serwera i wysyła końcowy ACK. Aktywny zamykający przechodzi następnie do TIME-WAIT na 2MSL, aby móc potwierdzić retransmitowany FIN i odczekać zgodnie z regułami dla starych duplikatów. Serwer może przejść do CLOSED po otrzymaniu końcowego ACK.

Zarządzanie Przepływem Danych: Kontrola Przepływu i Kontrola Przeciążenia

TCP ogranicza liczbę niepotwierdzonych danych za pomocą osobnych sygnałów odbiorcy i sieci. Kontrola przepływu chroni bufor odbiorcy, a kontrola przeciążenia reaguje na stan współdzielonej ścieżki.

Kontrola Przepływu: Ochrona Odbiorcy

Kontrola przepływu zapobiega przekroczeniu dostępnego bufora wolniejszego odbiorcy przez szybkiego nadawcę. Każde połączenie TCP ma przestrzeń bufora dla danych odebranych przed odczytaniem ich przez aplikację.

Nagłówek TCP zawiera 16-bitowe pole Rozmiar Okna. Odbiorca ogłasza wolne miejsce w buforze, więc zajęty odbiorca może przekazać mniejszą wartość. Nadawca ogranicza liczbę niepotwierdzonych bajtów do ogłoszonego okna odbiorczego. Opcja skalowania okna rozszerza efektywny zakres poza nieskalowane pole 16-bitowe. Zerowe okno zatrzymuje nowe dane, a mechanizm podtrzymania może sondować późniejszą aktualizację. Ten mechanizm dopasowuje szybkość bajtów do możliwości odbiorcy.

Kontrola Przeciążenia: Ochrona Sieci

Kontrola przepływu chroni odbiorcę, a kontrola przeciążenia chroni współdzieloną ścieżkę. Gdy wielu nadawców wysyła z dużą szybkością, kolejki routerów pośredniczących mogą się zapełniać, powodując przeciążenie, straty i opóźnienia.

TCP utrzymuje Okno Przeciążenia (cwnd), które ogranicza dane w tranzycie na podstawie oszacowania stanu sieci. Użyteczny limit jest mniejszą z wartości cwnd i ogłoszonego okna odbiorczego. Powolny start, unikanie przeciążenia, szybka retransmisja i szybkie odtwarzanie zmieniają cwnd w reakcji na potwierdzenia i straty. Przeciążenie może również sygnalizować ECN. Utrata jest zwykle traktowana jako sygnał przeciążenia, więc nadawca zmniejsza szybkość i następnie zwiększa ją ostrożnie zgodnie z używanym algorytmem. Dokładna reakcja zależy od używanego algorytmu kontroli przeciążenia, a okno odbiorcze może ograniczać transmisję nawet przy dostępnej przepustowości ścieżki.

Powiązane artykuły