ACK
Коротко: Флаг подтверждения в TCP, сигнализирующий, что пакет (или определённый порядковый номер) успешно получен.
Подробнее: Пакеты ACK — основа надёжности TCP: если ожидаемое подтверждение не приходит, отправитель считает пакет потерянным и отправляет его заново. Третий пакет трёхстороннего рукопожатия — чистый ACK, завершающий установление соединения.
Подробности
Кумулятивное подтверждение вместо квитанции на каждый пакет
Технически ACK — не отдельный пакет, а один бит-флаг в заголовке TCP, отправляемый вместе с 32-битным номером подтверждения. Этот номер сообщает отправителю, какой байт ожидается следующим: не «пакет 5 пришёл», а «я получил всё до байта 4000 включительно, пришли мне байт 4001». Это позволяет кумулятивные подтверждения: если до получателя дошли сегменты с байтами 1000–2000, 2000–3000 и 3000–4000, одного ACK с номером 4001 достаточно, чтобы подтвердить все три сразу. Это экономит значительные накладные расходы на стабильных соединениях, но есть недостаток: если в середине отсутствует сегмент (например, потеряны байты 2000–3000), получатель может подтвердить лишь до последней непрерывной позиции (2001), даже если более поздние сегменты уже пришли. Современные реализации TCP решают это расширением «Selective Acknowledgment» (SACK), которое дополнительно сообщает, какие поздние блоки уже есть, так что отправителю нужно повторить лишь реальный пробел, а не все остальные данные.
Тайм-аут, быстрая повторная передача и дублирующиеся ACK
Если ожидаемое подтверждение не приходит в течение тайм-аута повторной передачи (RTO), TCP считает пакет потерянным и отправляет его снова; RTO динамически подстраивается под измеренное время кругового обхода (RTT), чтобы система разумно реагировала и в быстрых локальных сетях, и на линиях с высокой задержкой (спутник, межконтинентальные линии), не повторяя ни слишком рано, ни слишком поздно. Особый случай — «дублирующиеся ACK»: если сегмент приходит к получателю вне очереди (например, сегмент 3 отсутствует, но приходит сегмент 4), получатель продолжает повторно подтверждать последнюю непрерывную позицию тем же номером. Если отправитель трижды подряд получает один и тот же номер подтверждения, он трактует это как сильный сигнал потери конкретного пакета (а не общей перегрузки) и сразу начинает повторную передачу (fast retransmit), не дожидаясь полного тайм-аута.
Роль в жизненном цикле соединения
В трёхстороннем рукопожатии ACK появляется дважды: один раз вместе с SYN-ACK во втором пакете и один раз как чистый ACK в третьем, который официально переводит соединение в состояние «ESTABLISHED». Закрытие соединения тоже идёт через ACK (в составе последовательности FIN/ACK). Почти в каждом TCP-сегменте после рукопожатия флаг ACK установлен и одновременно переносятся данные («piggybacking»).
Отладка на практике
В перехваченных пакетах (например, в Wireshark) заметно большое число дублирующихся ACK или повторных передач — прямой сигнал потерь пакетов на маршруте, часто из-за перегруженных маршрутизаторов, неисправных кабелей или нестабильного Wi-Fi. UDP понятия ACK не знает вовсе; кому нужна надёжность поверх UDP, должен реализовать собственную, обычно более лёгкую логику подтверждений на уровне приложения.
См. также: SYN, SYN-ACK, Трёхстороннее рукопожатие