Wprowadzenie: Pola Nagłówka TCP
Pakiet IP przenosi segment TCP między hostami, a nagłówek TCP zawiera pola opisujące połączenie i obsługę strumienia. Określa porty, numery sekwencyjne, potwierdzenia, rozmiar okna oraz flagi sterujące. Zestaw tych informacji wspiera uporządkowane dostarczanie danych, wykrywanie błędów i zarządzanie połączeniem. Za nagłówkiem mogą znajdować się dane aplikacji.
Zanim dane aplikacji zostaną wysłane, oprogramowanie TCP na komputerze wysyłającym konstruuje ten nagłówek. Nagłówek jest dołączany na początku fragmentu danych aplikacji (ładunku), tworząc jednostkę znaną jako segment TCP. Segment może także nie zawierać danych aplikacji. Kompletny segment jest następnie przekazywany do warstwy IP, która opakowuje go w nagłówek IP, tworząc pakiet gotowy do podróży przez sieć.
Każde pole nagłówka TCP rozwiązuje konkretny problem związany z porządkowaniem danych, wykrywaniem błędów, kontrolą przepływu albo zarządzaniem połączeniem.
Ogólna Struktura Nagłówka TCP
Nagłówek TCP ma standardową strukturę. Jego podstawowy rozmiar to 20 bajtów (160 bitów), ale może być większy, jeśli dołączone są pola opcjonalne, maksymalnie do 60 bajtów. Nagłówek jest zorganizowany jako seria pól, z których każde ma stały rozmiar i określone przeznaczenie. Odbiorca interpretuje pola według ich kolejności i długości.
Odbiorca używa pól nagłówka do identyfikacji połączenia i interpretacji odebranego segmentu. Bazowy układ z RFC 9293 zawiera cztery bity zarezerwowane i osiem flag sterujących. RFC 9768 przydziela jeden z tych zarezerwowanych bitów mechanizmowi Accurate ECN.
Port Źródłowy i Port Docelowy
Te dwa pola identyfikują punkty końcowe w nagłówku TCP.
- Port Źródłowy (16 bitów): To pole identyfikuje numer portu aplikacji, która wysłała segment na maszynie źródłowej. Gdy aplikacja kliencka, taka jak przeglądarka internetowa, inicjuje połączenie, system operacyjny przypisuje jej tymczasowy, z zakresu dynamicznego. Ten numer jest umieszczany w polu portu źródłowego, aby serwer wiedział, dokąd odesłać swoją odpowiedź.
- Port Docelowy (16 bitów): To pole identyfikuje numer portu aplikacji, która ma odebrać segment na maszynie docelowej. W przypadku aplikacji serwerowych jest to zazwyczaj związany ze standardową usługą, np. port 443 dla bezpiecznego serwera WWW (HTTPS).
Razem, kombinacja źródłowego adresu IP, portu źródłowego, docelowego adresu IP i portu docelowego tworzy unikalny identyfikator dla konkretnego połączenia TCP, pozwalając pojedynczemu serwerowi obsługiwać tysiące połączeń klienckich jednocześnie.
Numer Sekwencyjny (32 bity)
Pole wspiera niezawodność i uporządkowane dostarczanie danych przez TCP. TCP traktuje dane aplikacji jako strumień bajtów i numeruje każdy bajt w tym strumieniu.
W segmencie przenoszącym dane bez flagi SYN pole Numer Sekwencyjny zawiera numer pierwszego bajtu danych w jego ładunku. Na przykład, jeśli segment zawiera 100 bajtów danych, a jego numer sekwencyjny to 501, oznacza to, że ten segment przenosi bajty od 501 do 600 z całego strumienia danych. Segment SYN używa Początkowego Numeru Sekwencyjnego i zajmuje jeden numer sekwencyjny.
Pole ma 32 bity, więc numeracja obejmuje wartości, czyli 4 GiB, po czym zawija się i zaczyna od nowa. W szybkich sieciach opóźniony segment z poprzedniego cyklu może przypominać nowy. Mechanizmy porównywania numerów sekwencyjnych ograniczają takie ryzyko.
Podczas nawiązywania połączenia (trójetapowe uzgadnianie) klient i serwer wymieniają się nieprzewidywalnym Początkowym Numerem Sekwencyjnym (ISN). Kolejne numery sekwencyjne są wyznaczane względem tego punktu początkowego.
Numer Potwierdzenia (32 bity)
To pole jest odpowiednikiem Numeru Sekwencyjnego i jest mechanizmem potwierdzania pomyślnego odbioru danych. Jest ono ważne tylko wtedy, gdy ustawiona jest flaga kontrolna ACK.
Wartość pola Numer Potwierdzenia wskazuje numer sekwencyjny następnego bajtu, którego nadawca oczekuje od drugiej strony. Potwierdzenie to jest kumulatywne. Na przykład, jeśli odbiorca odsyła numer potwierdzenia 750, potwierdza tym samym, że pomyślnie i poprawnie otrzymał wszystkie bajty danych aż do numeru sekwencyjnego 749, i jest teraz gotowy na bajt 750.
Ten system kumulatywnych potwierdzeń jest wydajny, ale może prowadzić do niejednoznaczności, jeśli pojedynczy segment zostanie utracony. Jeśli segmenty 1, 2 i 4 dotrą, ale segment 3 zaginie, odbiorca będzie wciąż potwierdzał numer sekwencyjny początku segmentu 3, aż ten nie dotrze. Bardziej zaawansowane opcje, takie jak Selektywne Potwierdzenie (SACK), mogą rozwiązać ten problem.
Długość Nagłówka (4 bity)
To pole, czasami nazywane Przesunięciem Danych (Data Offset), jest niezbędne, ponieważ nagłówek TCP nie zawsze ma stały rozmiar. Podstawowy rozmiar to 20 bajtów, ale może być rozszerzony przez pole Opcje TCP. To 4-bitowe pole określa całkowitą długość nagłówka w 32-bitowych słowach (jednostkach 4-bajtowych).
Minimalna wartość tego pola to 5, co odpowiada obowiązkowemu nagłówkowi o długości 20 bajtów . Maksymalna wartość to 15, co odpowiada nagłówkowi o długości 60 bajtów . Pole wskazuje odbiorcy, gdzie kończy się nagłówek i zaczynają dane aplikacji.
Bity zarezerwowane
RFC 9293 rezerwuje cztery bity do przyszłego wykorzystania. Bez uzgodnionego rozszerzenia nadawca ustawia je na zero, a odbiorca je ignoruje. RFC 9768 przydziela bit bezpośrednio przed CWR fladze AE (Accurate ECN), pozostawiając trzy bity zarezerwowane. Przydział ten rozszerza informację zwrotną o przeciążeniu bez zwiększania stałej części nagłówka.
Flagi sterujące i Accurate ECN
RFC 9293 definiuje osiem flag sterujących: CWR, ECE, URG, ACK, PSH, RST, SYN i FIN. RFC 9768 dodaje AE w pozycji zajmowanej wcześniej przez historyczną flagę NS. Po uzgodnieniu AccECN bity AE, CWR i ECE tworzą wspólnie trzybitowe pole ACE przenoszące informację zwrotną o przeciążeniu. Oddzielne znaczenia CWR i ECE dotyczą klasycznego ECN.
AE (Accurate ECN): Służy do negocjowania AccECN podczas uzgadniania połączenia, a następnie współtworzy licznik ACE. Jego interpretacja zależy od trybu informacji zwrotnej uzgodnionego przez oba końce połączenia.
NS (Nonce Sum): Historyczna flaga eksperymentalnego mechanizmu ECN Nonce. RFC 8311 zakończyło ten eksperyment, a RFC 9768 przydzieliło następnie ten bit fladze AE.
CWR (Congestion Window Reduced): W klasycznym ECN ustawiana przez nadawcę, aby wskazać, że zmniejszył on swoją szybkość wysyłania po otrzymaniu segmentu z flagą ECE. W trybie AccECN ten bit współtworzy licznik ACE, zamiast przenosić samodzielny sygnał CWR.
ECE (ECN-Echo): Używana w . W klasycznym ECN ustawiana przez odbiorcę, aby poinformować nadawcę, że otrzymał sygnał o przeciążeniu sieci od routera. W trybie AccECN bit współtworzy licznik ACE, zamiast przenosić samodzielne echo ECE.
URG (Urgent): Wskazuje, że pole Wskaźnik Pilności jest ważne. Flaga sygnalizuje dane pilne, których obsługa przez aplikację zależy od semantyki interfejsu TCP. Dane pozostają częścią uporządkowanego strumienia.
ACK (Acknowledgment): Wskazuje, że pole Numer Potwierdzenia jest ważne. Prawie wszystkie pakiety wysyłane po początkowym pakiecie SYN będą miały tę flagę ustawioną.
PSH (Push): Żądanie przekazania danych do aplikacji bez celowego oczekiwania na zapełnienie bufora. Flaga nie opisuje osobnego kanału danych ani nie gwarantuje natychmiastowego dostarczenia do aplikacji. Może być użyteczna w aplikacjach interaktywnych, takich jak Telnet.
RST (Reset): Natychmiastowe zakończenie połączenia w odpowiedzi na błąd. Jest to gwałtowny sposób zakończenia sesji, na przykład, jeśli jedna strona otrzyma pakiet dla połączenia, które już nie istnieje, lub w przypadku błędu krytycznego.
SYN (Synchronize): Używana w segmentach SYN i SYN-ACK podczas ustanawiania połączenia. Synchronizuje początkowe numery sekwencyjne między hostami. Retransmisje mogą powtarzać te segmenty.
FIN (Finish): Sygnalizuje, że nadawca nie ma więcej danych do wysłania w swoim kierunku strumienia. Rozpoczyna zamykanie połączenia. Często prowadzi ono do wymiany czterech segmentów, lecz możliwe są inne kolejności.
Rozmiar Okna (16 bitów)
To pole jest rdzeniem mechanizmu kontroli przepływu w TCP. Określa liczbę bajtów, począwszy od bajtu wskazanego w polu Numer Potwierdzenia, którą nadawca tego segmentu jest obecnie w stanie przyjąć.
Odbiorca ogłasza X bajtów wolnego miejsca, więc nadawca powinien wstrzymać dodatkową transmisję po osiągnięciu tej wartości i czekać na aktualizację. Chroni to pojemność bufora odbiorczego. Ponieważ pole ma 16 bitów, maksymalna wartość bez skalowania wynosi 65 535 bajtów. W szybkich sieciach dalekiego zasięgu limit ten może ograniczać przepustowość, co doprowadziło do opracowania opcji TCP Skala Okna.
Suma Kontrolna (16 bitów)
Pole sumy kontrolnej służy do podstawowego wykrywania błędów. Nadawca oblicza 16-bitową wartość sumy kontrolnej na podstawie zawartości nagłówka TCP, danych aplikacji i specjalnego pseudo-nagłówka. Odbiorca wykonuje to samo obliczenie. Jeśli wyniki się różnią, odbiorca wie, że segment został uszkodzony w tranzycie i go odrzuca.
Pseudo-nagłówek to koncepcyjna struktura zawierająca źródłowy i docelowy adres IP, identyfikator protokołu transportowego oraz długość segmentu TCP. W IPv4 TCP używa numeru protokołu 6, a w IPv6 wartości Next Header z uwzględnieniem nagłówków rozszerzeń. Włączenie adresów do obliczeń sumy kontrolnej pomaga wykryć przypadki, w których warstwa IP błędnie dostarczyła segment do niewłaściwego hosta lub protokołu.
Wskaźnik Pilności (16 bitów)
To pole jest ważne tylko wtedy, gdy ustawiona jest flaga URG. Jest to 16-bitowe przesunięcie od bieżącego numeru sekwencyjnego, wskazujące numer sekwencyjny oktetu następującego po danych pilnych. Pozwala to systemowi odbiorczemu zinterpretować zakres danych pilnych, na przykład polecenie przerwania Ctrl+C w zdalnej sesji terminalowej, zgodnie z obsługą interfejsu TCP.
Opcje TCP (Zmienna Długość) i Wypełnienie
Podstawowy 20-bajtowy nagłówek TCP zapewnia podstawową funkcjonalność, ale nowoczesne sieci wymagają dodatkowych funkcji. Pole Opcje pozwala na tę rozszerzalność. Może mieć do 40 bajtów długości. Jeśli używane są opcje, pole Długość Nagłówka będzie miało wartość większą niż 5.
Powszechnie używane opcje to:
- Maksymalny Rozmiar Segmentu (MSS): Opcja jest wysyłana w segmentach SYN. Każda strona używa jej do ogłoszenia największej ilości danych TCP, jaką jest gotowa przyjąć w jednym segmencie. Pomaga to uniknąć fragmentacji IP, która może obniżać wydajność sieci.
- Skala Okna: Usuwa ograniczenie 16-bitowego pola Rozmiar Okna. Jest to współczynnik skalujący (potęga 2), który mnoży wartość w polu Rozmiar Okna, pozwalając na znacznie większe okna odbiorcze, do około 1 GiB przy maksymalnym przesunięciu 14 bitów. Wspiera to wysoką przepustowość na ścieżkach o dużym iloczynie przepustowości i opóźnienia.
- Selektywne Potwierdzenie (SACK): Pozwala odbiorcy na potwierdzenie nieciągłych bloków otrzymanych danych. Jest to znacznie bardziej wydajne niż standardowe kumulatywne ACK, gdy z jednego okna danych zaginie wiele pakietów.
- Znaczniki Czasu: Po uzgodnieniu opcja dodaje informacje o czasie do segmentów TCP. Wspiera pomiar Czasu Obiegu (RTT) i zapewnia kolejny mechanizm ochrony przed zawinięciem numerów sekwencyjnych (PAWS - Protection Against Wrapped Sequence numbers).
Na koniec, Wypełnienie jest używane, aby zapewnić, że całkowita długość nagłówka jest wielokrotnością 4 bajtów. Ponieważ niektóre opcje nie kończą się na granicy 4 bajtów, dodaje się bajty zerowe jako wypełnienie, aby uzupełnić ostatnie 32-bitowe słowo nagłówka.