Опция масштабирования окна TCP — это опция для увеличения размера окна приема , разрешенного в протоколе управления передачей, сверх его прежнего максимального значения в 65 535 байт. Эта опция TCP, наряду с несколькими другими, определена в RFC 7323, который касается длинных толстых сетей (LFN).
Пропускная способность TCP-связи ограничена двумя окнами: окном перегрузки и окном приема. Окно перегрузки пытается не превышать пропускную способность сети ( управление перегрузкой ); окно приема пытается не превышать пропускную способность получателя по обработке данных ( управление потоком ). Получатель может быть перегружен данными, если, например, он очень занят (например, веб-сервер). Каждый сегмент TCP содержит текущее значение окна приема. Если, например, отправитель получает подтверждение, которое подтверждает байт 4000 и указывает окно приема 10000 (байт), отправитель не будет отправлять пакеты после байта 14000, даже если окно перегрузки это позволяет.
Опция масштабирования окна TCP необходима для эффективной передачи данных, когда произведение полосы пропускания на задержку (BDP) больше 64 КБ [1] . Например, если линия передачи T1 1,5 Мбит/с использовалась по спутниковой связи с временем приема-передачи (RTT) 513 миллисекунд, произведение полосы пропускания на задержку составляет бит или около 96 187 байт. Использование максимального размера буфера 64 КБ [1] позволяет заполнить буфер только до (65 535 / 96 187) = 68% от теоретической максимальной скорости 1,5 Мбит/с, или 1,02 Мбит/с.
Используя опцию масштабирования окна, размер окна приема может быть увеличен до максимального значения байт или около 1 ГиБ. [2] Это делается путем указания двухбайтового счетчика сдвига в поле параметров заголовка. Истинный размер окна приема сдвигается влево на значение счетчика сдвига. Для значения счетчика сдвига может использоваться максимальное значение 14. Это позволит одному TCP-соединению передавать данные по примеру спутникового канала со скоростью 1,5 Мбит/с, используя всю доступную полосу пропускания.
По сути, в течение одного периода времени кругового обхода может быть передано не более одного полного окна передачи. Опция масштабирования окна позволяет одному TCP-соединению полностью использовать LFN с BDP до 1 ГБ, например, соединение 10 Гбит/с со временем кругового обхода 800 мс.
Поскольку некоторые брандмауэры не реализуют TCP Window Scaling должным образом, это может привести к тому, что интернет-соединение пользователя будет периодически давать сбои в течение нескольких минут, а затем снова начнет работать без причины. Также существует проблема, если брандмауэр не поддерживает расширения TCP. [3]
Масштабирование окна TCP реализовано в Windows , начиная с Windows 2000. [4] [5] Оно включено по умолчанию в Windows Vista / Server 2008 и более поздних версиях, но может быть отключено вручную при необходимости. [6] Windows Vista и Windows 7 имеют фиксированный буфер приема TCP по умолчанию в 64 КБ, масштабируемый до 16 МБ с помощью «автонастройки», что ограничивает ручную настройку TCP в длинных толстых сетях . [7]
Ядра Linux (начиная с 2.6.8, август 2004) по умолчанию включают TCP Window Scaling. Параметры конфигурации находятся в файловой системе /proc , см. псевдофайл /proc/sys/net/ipv4/tcp_window_scaling и его компаньоны /proc/sys/net/ipv4/tcp_rmem и /proc/sys/net/ipv4/tcp_wmem (подробнее: , раздел sysctl). [8]man tcp
Масштабирование можно отключить, выполнив следующую команду.
$ sudo sysctl -w "net.ipv4.tcp_window_scaling=0"
Чтобы сохранить изменения после перезапуска, включите строку «net.ipv4.tcp_window_scaling=0» в /etc/sysctl.conf (или /etc/sysctl.d/99-sysctl.conf для systemd 207).
По умолчанию для FreeBSD , OpenBSD , NetBSD и Mac OS X включено масштабирование окна (и другие функции, связанные с RFC 1323).
Чтобы проверить их статус, пользователь может проверить значение переменной " net.inet.tcp.rfc1323 " с помощью команды sysctl :
$ sysctl net.inet.tcp.rfc1323
Значение 1 (вывод "net.inet.tcp.rfc1323=1") означает, что масштабирование включено, 0 означает «отключено». Если включено, его можно отключить, выполнив команду:
$ sudo sysctl -w net.inet.tcp.rfc1323 = 0
Эта настройка теряется при перезапуске системы. Чтобы убедиться, что она установлена во время загрузки, добавьте следующую строку в /etc/sysctl.conf :net.inet.tcp.rfc1323=0
Однако в macOS 10.14 эта команда выдает ошибку
sysctl: неизвестный oid 'net.inet.tcp.rfc1323'