Кратко

  • Каждая сторона сообщает в SYN показатель для собственного окна приёма; соединение хранит две независимые шкалы.
  • При сдвиге 7 значение 65 535 после рукопожатия означает 8 388 480 байт, но в самом SYN оно никогда не масштабируется.
  • Опция расширяет диапазон объявляемого окна приёма. Она не создаёт память, не увеличивает окно перегрузки и не заменяет SACK, временные метки или PAWS.

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

RFC 1072 описал проблему в 1988 году. Экспериментальное решение сохранило прежний заголовок и добавило в SYN трёхбайтовую опцию с двоичным показателем. Последующие значения следовало читать после сдвига, сохранённого в состоянии соединения.

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

Два направления — две шкалы

Показатель, отправленный A, относится к окну приёма, которое A будет объявлять позже. B сохраняет его для полей от A. Собственный показатель B действует в обратную сторону. Разный объём памяти и разные правила не требуют симметрии.

Опция является предложением, а не приказом. Она включается, только если оба SYN содержат Window Scale. Ноль остаётся корректным предложением с множителем один. Если одна сторона ничего не предложила, оба сохранённых сдвига остаются нулевыми.

Для SYN и SYN-ACK действует исключение: их Window не масштабируется. После установления 65 535 << 7 даёт 8 388 480 байт; в SYN те же 65 535 остаются 65 535. Пакет несёт прежние биты, но предыдущее состояние назначает им другую единицу.

RFC 1323 сменил эксперимент в 1992 году. RFC 7323 заменил RFC 1323 в 2014-м и определил концептуальное 30-битное окно. Показатель ограничен 14, поэтому доступно чуть меньше 1 GiB. Большие значения трактуются как 14, чтобы сохранить безопасные сравнения в 32-битном пространстве последовательности.

Больший диапазон означает более крупный шаг. При сдвиге 7 единица поля соответствует 128 байтам. Внутренний учёт буфера остаётся точным, но объявленная граница квантуется при кодировании.

Кредит не равен разрешению сети

Окно приёма и окно перегрузки ограничивают разные права. Получатель распоряжается свободным буфером, а отправитель — объёмом, который можно доверить пути. Действует меньшее значение. Объявленное окно в восемь мегабайт не позволяет превысить congestion window в 64 килобайта.

Window Scale не показывает блоки за пропуском — это делает SACK. Он не использует временные метки для отбрасывания сегментов из предыдущего цикла нумерации — это задача PAWS. Он не оценивает RTT. Общая история высокопроизводительных расширений не превращает их в один механизм.

RFC 9293 относит Window Scale к распространённым опциям, рекомендуемым для высокой производительности, но не обязательным для базовой совместимости. Соединение способно открыться без неё и остаться у старого потолка. Успешное рукопожатие не доказывает эффективное использование канала.

Неполное свидетельство без SYN

Если захват начался после открытия, Window=32 768 не раскрывает фактический размер окна. Нужен показатель из SYN того же направления. Stateful-брандмауэр обязан хранить ту же информацию, если проверяет попадание сегмента в окно.

RFC 7323 предупреждает: удаление или изменение опции в SYN либо SYN-ACK может оставить стороны с несовместимыми параметрами. Устройство, которое не знает шкалу, не должно применять оконные правила к сырому 16-битному значению.

Историческое изменение было семантическим. TCP сохранил формат, но доверил надёжному открытию назначить два правила чтения. Число стало выражать больше только потому, что соединение помнило, как его читать.

Источники