Potwierdzenie otrzymania segmentów

Jedną z funkcji TCP jest upewnienie się, że każdy wysłany segment dotarł do odbiorcy. Usługi TCP na hoście docelowym potwierdzają dostarczenie danych, wysłanych przez aplikację źródłową.

Numery - sekwencyjny (SEQ) i potwierdzenia (ACK), które znajdują się w nagłówku segmentu, używane są do potwierdzenia otrzymania bajtów danych, zawartych w segmentach. Numer SEQ wskazuje na względną liczbę bajtów (łącznie z bieżącym segmentem), przesłanych podczas trwającej sesji. TCP używa numeru potwierdzenia ACK, celem wskazania następnego bajtu w tej sesji, który spodziewa się otrzymać adresat. Nazywane jest to przewidywanym potwierdzeniem (ang. expectational acknowledgment).

Źródło informowane jest, że odbiorca otrzymał wszystkie wysłane bajty danych, aż do podanej wartości, ale z jej wyłączeniem (tzn. bez bajtu o podanym numerze). Host docelowy czeka na wysłanie przez źródło segmentu, zawierającego numer sekwencyjny, równy numerowi potwierdzenia ACK.

Należy pamiętać, że każde połączenie składa się z dwóch jednokierunkowych sesji. A więc SEQ i ACK są wymieniane podczas tej dwukierunkowej komunikacji.

W przykładzie, przedstawionym na rysunku, host z lewej strony wysyła dane do hosta po prawej stronie. Wysyłany jest segment zawierający 10 bajtów danych (dla tej sesji) z numerem sekwencyjnym w nagłówku, wynoszącym 1.

Odbiorca po prawej otrzymuje segment i ustala, że numer sekwencyjny wynosi 1, a segment zawiera 10 bajtów danych. Następnie odsyła segment do hosta po lewej z potwierdzeniem otrzymania tych danych. Segment potwierdzający ma ustawioną wartość ACK na 11, co wskazuje, że następny, oczekiwany bajt w sesji będzie miał wartość 11. Kiedy host po lewej otrzyma to potwierdzenie, może wysłać następny segment z danymi, rozpoczynając od bajtu z numerem 11.

Analizując podany przykład, gdyby nadawca musiał czekać na potwierdzenie każdego z 10 wysłanych bajtów, sieć byłaby przeciążona dużą ilością potwierdzeń. Aby temu zapobiec, wiele segmentów z danymi, może zostać wysłanych, zanim adresat potwierdzi ich otrzymanie pojedynczym segmentem TCP. To potwierdzenie zawiera numer, który jest obliczony na podstawie wszystkich otrzymanych bajtów w sesji. Na przykład, zaczynając z numerem sekwencyjnym równym 2000, jeśli host docelowy otrzyma 10 segmentów, każdy zawierający po 1000 bajtów danych, w potwierdzeniu wysłanym do nadawcy tej partii danych numer potwierdzenia wyniesie 12001.

Ilość danych, którą host źródłowy może wysłać, aż do otrzymania potwierdzenia jest nazywana wielkością okna, która jest zapisywana w dedykowanym polu nagłówka TCP (dzięki czemu możliwie jest zarządzanie i kontrola transmisji).