Кратко

  • Накопительный ACK утверждает, что все байты перед его номером приняты. Один ранний пробел останавливает границу, даже если последующие сегменты уже лежат в очереди.
  • SACK после согласования перечисляет границы несмежных блоков. Значение базового ACK не меняется, а решение о повторах не переходит к получателю.
  • Сообщение ограничено и может быть отозвано. Отправитель хранит данные, соблюдает окно перегрузки и освобождает буфер только после накопительного подтверждения.

Семь прибывших сегментов за одним отсутствующим

Получатель ждёт байт 5000. Сегмент с ним потерян, зато следующие семь образовали непрерывный диапазон от 5500 до 9000. Номер ACK всё равно равен 5000. Он не отрицает поздние поступления, а отказывается заверять непрерывность там, где есть пробел.

Для надёжного потока это правильный ответ. Для восстановления он беден. Серия одинаковых ACK не говорит отправителю, исчез только первый сегмент или повреждение шире. Полный повтор тратит полосу на уже доставленные копии. Поиск одной потери за каждый круг особенно дорог на длинном пути.

RFC 793 определил ACK X как подтверждение всех октетов ниже X; сам X — следующий ожидаемый номер. Сильное обещание позволяет в итоге очистить буфер. По той же причине оно не может превратить разрозненное наличие в завершённый префикс.

Сначала спецификация, потом новый подход

RFC 1072 в 1988 году предложил два параметра. SACK-Permitted в SYN согласовывал возможность, а позднее SACK описывал разрозненные блоки в очереди получателя. Старая сторона могла игнорировать расширение и продолжать накопительные ACK.

Этот формат не получил общего развёртывания. RFC 2018 связывает задержку с разногласиями о сочетании SACK и масштабирования окна. Опубликованный документ ещё не означал, что работающий код совместим. Предложению понадобилась новая форма.

Версия 1996 года сохранила согласование в SYN, но дала каждому блоку полные 32-битные левую и правую границы. Левая указывает первый имеющийся байт, правая — номер сразу после последнего. ACK 5000 и SACK [5500, 9000) теперь могут идти вместе: один фиксирует обязательство, второй — наблюдение за пробелом.

В сорок байт не помещается вся очередь

Для параметров TCP доступно сорок байт. SACK использует два байта на тип и длину и восемь на блок. Без соседей помещаются четыре блока, с timestamps обычно три. Раздробленная очередь может содержать гораздо больше островов.

Поэтому первым сообщается блок, изменённый последним прибытием, а недавние блоки повторяются. Обратные ACK тоже теряются. Несколько сообщений позволяют отправителю накопить собственную карту.

Общий протокол не требует одинаковой структуры памяти и не выгружает всю очередь получателя. Он стандартизует лишь две координаты. Разные реализации сохраняют свободу, соглашаясь о минимальном языке фактов.

Совет не становится окончательной квитанцией

RFC 2018 называет SACK advisory. Получатель вправе позднее удалить ранее объявленные данные — совершить reneging. Отправитель может временно не повторять помеченный диапазон, но не должен уничтожать свою копию, пока накопительный ACK не перейдёт через него.

После тайм-аута прежним меткам нельзя безусловно доверять: восстановление возвращается к левой границе. Такой запасной путь не даёт мгновенному наблюдению превратиться в необратимое доказательство.

Очередью повторов управляет отправитель. Он объединяет блоки, оценивает пробелы и выбирает следующий сегмент. RFC 6675 позднее описал отправительский scoreboard и консервативную оценку данных, ещё находящихся в сети. Получатель предоставляет перспективу, но не получает рычаг передачи.

Точное знание не увеличивает право на полосу

SACK не отменяет контроль перегрузки. RFC 2018 требует сохранить его правила: одного ACK о нарушении порядка недостаточно, объём во время восстановления ограничен, а congestion window уменьшается при подходящих признаках.

Это отличает тему от краха 1986 года. Окно перегрузки решает, сколько разрешено отправлять. SACK уточняет, какие байты следует отправить в пределах разрешённого. Карта ямы не расширяет дорогу.

D-SACK в 2000 году позволил сообщать дубликаты. Отправитель может предположить переупорядочение, потерю ACK, репликацию или ранний таймер. RFC 2883 не предписывает единственного ответа и замечает, что сведения получателя не обязательно достоверны. Диагностика стала богаче, командование не сменилось.

Источники и пределы доказательств

Накопительная семантика задана RFC 793, раннее предложение — RFC 1072, пересмотренный формат — RFC 2018. RFC 2883 определяет D-SACK, RFC 5681 сохраняет границы перегрузки, RFC 6247 фиксирует исторический статус старого предложения, а RFC 6675 описывает консервативное восстановление.

Документы доказывают формат, обязанности и ограничения, но не единую дату внедрения и не одинаковый выигрыш на каждом пути. Блок SACK не устанавливает место и причину конкретной потери и не удостоверяет получателя.