Nagłówek TCP

Analiza pól nagłówka TCP: numery sekwencji/ACK, flagi, okno, suma kontrolna, MSS i opcje.

Wprowadzenie: Szczegółowa Instrukcja Obsługi dla Danych

Kontynuując naszą analogię z protokołu TCP, jeśli pakiet IP jest główną kopertą, która dostarcza wiadomość do właściwego budynku (komputera), to nagłówek TCP jest szczegółowym, wieloczęściowym formularzem instrukcji dołączonym do zawartości wewnątrz. Formularz ten nie tylko określa nadawcę i odbiorcę; zawiera bogactwo informacji kontrolnych, które zarządzają całym cyklem życia konwersacji, zapewniając jej niezawodność, uporządkowanie i wydajność.

Zanim jakiekolwiek 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. Ten 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ć.

Zrozumienie każdego pola nagłówka TCP jest jak nauka gramatyki i słownictwa niezawodności sieciowej. Każde pole rozwiązuje konkretny problem związany z porządkowaniem, wykrywaniem błędów, kontrolą przepływu i 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.

Struktura Nagłówka TCP

Poznaj 20-bajtowy podstawowy nagłówek TCP i zrozum, jak każde pole przyczynia się do niezawodnego, uporządkowanego dostarczania danych.

Rozmiar Nagłówka

20 bajtów (minimum)

Do 60 bajtów z opcjami

01234567891011121314151617181920212223242526272829303132Port Źródłowy16 bitówPort ŹródłowyPort Docelowy16 bitówPort DocelowyNumer Sekwencyjny32 bityNumer SekwencyjnyNumer Potwierdzenia32 bityNumer PotwierdzeniaOffset4 bityDługość NagłówkaRez4 bityZarezerwowaneFlagi8 bitówFlagi Kontrolne (CWR, ECE, URG, ACK, PSH, RST, SYN, FIN)Okno16 bitówRozmiar OknaSuma Kontrolna16 bitówSuma KontrolnaWskaźnik Pilności16 bitówWskaźnik PilnościOpcjeOpcje (Zmienna Długość, 0-40 bajtów) + Wypełnienie

Wybierz pole, aby zobaczyć szczegóły

Legenda

Adresowanie Portów
Sekwencja i Potwierdzenie
Kontrola i Flagi
Kontrola Przepływu
Wykrywanie Błędów
Opcjonalne Rozszerzenia

Przeanalizujmy każde z tych pól jedno po drugim, od góry do dołu, zgodnie z diagramem.

Port Źródłowy i Port Docelowy

Te dwa pola są najbardziej podstawowymi komponentami adresującymi 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)

Jest to jedno z najważniejszych pól zapewniających niezawodność i uporządkowane dostarczanie danych przez TCP. Wyobraź sobie cały strumień danych, który aplikacja chce wysłać, jako jeden bardzo długi dokument tekstowy. TCP numeruje każdy pojedynczy bajt w tym dokumencie.

Pole Numer Sekwencyjny w danym segmencie zawiera numer pierwszego bajtu danych w ładunku tego segmentu. 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.

32-bitowy rozmiar tego pola jest celowo duży. Pozwala TCP na ponumerowanie do 2322^{32} bajtów, czyli 4 Gigabajtów, zanim numery będą musiały się zawinąć i zacząć od nowa. Ten duży zakres jest niezbędny w szybkich sieciach, aby zapobiec zjawisku zwanemu zawinięciem numerów sekwencyjnych, gdzie stary pakiet z poprzedniego cyklu mógłby zostać omyłkowo wzięty za nowy.

Podczas nawiązywania połączenia (trójetapowe uzgadnianie), zarówno klient, jak i serwer wymieniają się losowym Początkowym Numerem Sekwencyjnym (ISN). Wszystkie kolejne numery sekwencyjne w konwersacji są inkrementowane od tego punktu startowego.

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 20-bajtowym nagłówkowi (5×4 bajty=20 bajtoˊw)(5 \times 4 \text{ bajty} = 20 \text{ bajtów}). Maksymalna wartość to 15, co odpowiada maksymalnemu rozmiarowi nagłówka 60 bajtów (15×4 bajty=60 bajtoˊw)(15 \times 4 \text{ bajty} = 60 \text{ bajtów}). To pole informuje komputer odbierający, gdzie dokładnie kończy się nagłówek i zaczynają się właściwe dane aplikacji.

Zarezerwowane (3 bity)

To 3-bitowe pole (w starszych diagramach czasem pokazywane jako większe, zanim niektóre bity zostały przeznaczone na inne cele) jest odłożone do przyszłego wykorzystania. Zgodnie ze standardami, musi być ustawione na zero przez nadawcę i ignorowane przez odbiorcę. Jego celem jest umożliwienie przyszłych rozszerzeń protokołu bez naruszania kompatybilności wstecznej.

Flagi Kontrolne (9 bitów)

Ta kolekcja jednobitowych flag działa jak zestaw włączników/wyłączników, które kontrolują stan i zachowanie połączenia TCP. Każda flaga, gdy jest ustawiona na 1, aktywuje określoną funkcję. Dziewięć flag to: NS, CWR, ECE, URG, ACK, PSH, RST, SYN i FIN.

  • NS (Nonce Sum): Jednobitowa flaga używana w eksperymentalnym mechanizmie kontroli przeciążenia, aby chronić przed przypadkowym lub złośliwym ukrywaniem powiadomień o przeciążeniu.

  • CWR (Congestion Window Reduced): Ustawiana przez nadawcę, aby wskazać, że zmniejszył on swoją szybkość wysyłania w odpowiedzi na otrzymanie segmentu z flagą ECE.

  • ECE (ECN-Echo): Używana w . Ustawiana przez odbiorcę, aby poinformować nadawcę, że otrzymał sygnał o przeciążeniu sieci od routera.

  • URG (Urgent): Wskazuje, że pole Wskaźnik Pilności jest ważne. Flaga ta sygnalizuje, że niektóre dane w segmencie są pilne i powinny być przetworzone przez aplikację odbiorczą jak najszybciej, omijając normalny bufor danych.

  • 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 od nadawcy do odbiorcy. Gdy jest ustawione, mówi odbiorczemu stosowi TCP, aby natychmiast przepchnął dane otrzymane w tym segmencie do oczekującej aplikacji, bez czekania na zapełnienie bufora. Jest to przydatne 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 tylko w pierwszym jednym lub dwóch pakietach trójetapowego uzgadniania w celu ustanowienia połączenia. Synchronizuje początkowe numery sekwencyjne między dwoma hostami.

  • FIN (Finish): Używana do eleganckiego zakończenia połączenia, gdy nadawca nie ma więcej danych do wysłania. Sygnalizuje rozpoczęcie czteroetapowego uzgadniania w celu zamknięcia połączenia.

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ąć.

W istocie odbiorca mówi: Mój bufor odbiorczy ma X bajtów wolnego miejsca, więc proszę nie wysyłaj mi więcej niż X bajtów, dopóki nie dam ci nowej aktualizacji. Zapobiega to zalaniu wolnego odbiorcy przez szybkiego nadawcę. Ponieważ pole ma 16 bitów, maksymalny rozmiar okna, który można ogłosić, to 65 535 bajtów. Stało się to wąskim gardłem w nowoczesnych, szybkich sieciach dalekiego zasięgu, 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 adres IP, docelowy adres IP, numer protokołu (6 dla TCP) i długość segmentu TCP. Włączenie adresów IP do obliczeń sumy kontrolnej stanowi ważne zabezpieczenie: pomaga wykryć przypadki, w których pakiet został błędnie dostarczony przez warstwę IP 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, które wskazuje na ostatni bajt pilnych danych. Pozwala to systemowi odbiorczemu szybko znaleźć i dostarczyć dane pozapasmowe do aplikacji, na przykład polecenie przerwania, jak Ctrl+C w zdalnej sesji terminalowej, bez konieczności czekania w normalnym buforze danych.

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.

Niektóre z najważniejszych opcji to:

  • Maksymalny Rozmiar Segmentu (MSS): Jest to jedna z najczęstszych opcji, wymieniana podczas trójetapowego uzgadniania. Każda strona używa jej do ogłoszenia największego fragmentu danych (segmentu), jaki jest w stanie przyjąć. Pomaga to uniknąć fragmentacji IP, która może degradować wydajność sieci.
  • Skala Okna: Rozwiązuje 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 1 Gigabajta), co jest kluczowe dla osiągnięcia wysokiej przepustowości w sieciach 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: Dodaje informacje o czasie do każdego segmentu, co pomaga w dokładniejszych obliczeniach 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.