Размер окна TCP - это объем данных, которые отправитель отправит, прежде чем ожидать подтверждения TCP. Есть ли у получателя способ контролировать это (например, как часть рукопожатия TCP), или это может контролировать только отправитель?
Да, получатель может динамически управлять размером окна TCP на всем протяжении TCP-связи, а не только при рукопожатии, как указано в RFC 793:
Управление потоком:
TCP предоставляет получателю возможность управлять объемом данных, отправляемых отправителем. Это достигается возврат «окна» с каждым ACK с указанием диапазона допустимых порядковых номеров за пределами последнего успешно полученного сегмента. В окне указано допустимое количество октетов, которое отправитель может передать. до получения дальнейшего разрешения.
Поскольку вы добавили TCP-окно-масштабирование, масштабирование окна TCP - это просто множитель, используемый для преодоления начального ограничения в 64 КБ для максимального размера окна. Это согласовывается с использованием параметров TCP в первоначальном подтверждении TCP, как описано в RFC 7323:
Опция Window Scale согласовывает основные параметры сеанса TCP. Следовательно, он отправляется только во время первоначального рукопожатия. Кроме того, опция Window Scale будет отправлена в
<SYN,ACK>
сегмент только в том случае, если соответствующая опция была получена в первоначальном<SYN>
сегмент.....
Этот вариант МОЖЕТ быть отправлен в
<SYN>
сегмент (т.е. сегмент
с битом SYN и отключенным битом ACK). Если опция Window Scale
был получен в первоначальном<SYN>
сегмент, то этот параметр МОЖЕТ быть
отправлено в<SYN,ACK>
сегмент. Параметр Window Scale в сегменте
без бита SYN НЕОБХОДИМО игнорировать.
Таким образом, этот коэффициент масштабирования не может быть изменен позже. Это описано далее там:
Расширение масштаба окна расширяет определение окна TCP.
до 30 бит, а затем использует неявный масштабный коэффициент для переноса этого
30-битное значение в 16-битном поле окна заголовка TCP (SEG.WND в [RFC0793]). Показатель масштабного коэффициента переносится в TCP.
вариант, масштаб окна. Эта опция отправляется только в сегменте (сегмент с установленным битом SYN), поэтому масштаб окна фиксируется в каждом направлении при открытии соединения.
Вот пример крайнего и ненормального "злоупотребления" оконным управлением со стороны приемника, изобретенного для задержки сканирования, используемого для распространения червей: Linux iptables ' TARPIT
дополнительная цель, основанная на LaBrea's битумная яма (Джим МакКлерг, 2001 г. PDF):
TARPIT
Захватывает и удерживает входящие TCP-соединения, не используя локальные ресурсы для каждого соединения.
[...] играйте как слушающий сервер, но кроме отправки ACK или RST, никакие данные не отправляются. [...]
--tarpit
В этом режиме соединение со злоумышленником завершается, но ограничивает размер окна до 0, заставляя злоумышленника ждать долгое время. Пока он поддерживает состояние соединения и пытается продолжать его каждые 60–240 секунд, мы его не поддерживаем, поэтому он очень легкий. Попытки закрыть соединение игнорируются, из-за чего удаленная сторона прерывает соединение через 12-24 минуты. Этот режим установлен по умолчанию.