Подтверждение получения сегментов
Одной из функциональных особенностей протокола TCP является гарантия доставки каждого сегмента по назначению. Сервисы TCP на узле назначения подтверждают данные, полученные им от приложения источника.
Порядковый номер (SEQ) и номер подтверждения (ACK) используются совместно для подтверждения получения байтов данных, которые содержатся в переданных сегментах. Порядковый номер SEQ обозначает относительное число байтов, переданных во время этого сеанса, включая байты в текущем сегменте. TCP использует номер ACK, отправленный обратно источнику, чтобы обозначить следующий байт, который получатель рассчитывает получить. Это называется ожидаемым подтверждением.
Источнику сообщается, что узел назначения получил все данные в этом потоке до того байта (но не включая его), который обозначен номером ACK. Предполагается, что передающий узел отправит сегмент, в котором используется порядковый номер, равный номеру ACK.
Необходимо помнить, что каждое соединение фактически представляет собой два односторонних сеанса. Обмен номерами SEQ и ACK осуществляется в обоих направлениях.
В примере, показанном на рисунке, узел слева отправляет данные узлу справа. Он отправляет сегмент, который содержит 10 байт данных для этого сеанса, и порядковый номер, равный 1, в заголовке.
Получающий узел принимает сегмент на 4-м уровне и определяет, что порядковый номер равен 1, а также то, что сегмент содержит 10 байт данных. Затем узел отправляет сегмент обратно узлу слева, чтобы подтвердить получение этих данных. В этом сегменте узел устанавливает 11 в качестве номера ACK, чтобы показать, что в этом сеансе следующим байтом данных он ожидает получить байт с номером 11. Когда передающий узел получает это подтверждение, он может отправить следующий сегмент, содержащий данные для этого сеанса, которые начинаются с байта номер 11.
Из этого примера видно, что если бы отправляющему узлу пришлось ждать подтверждения каждых 10 байт, это создало бы значительную нагрузку на сеть. Чтобы снизить нагрузку, связанную с получением этих подтверждений, несколько сегментов данных можно отправить и подтвердить в одном сообщении TCP, отправленном в противоположном направлении. Это подтверждение содержит номер ACK, который указывается исходя из общего количества байтов, полученных в течение сеанса связи. Например, начиная с порядкового номера 2000 (если было получено 10 сегментов из каждых 1000 байт) источнику должен быть отправлен ACK с номером 12001.
Количество данных, которое может быть передано до получения подтверждения, называется размером окна. Размер окна — это поле в заголовке TCP, с помощью которого можно обрабатывать утраченные данные и управлять потоками.