Тонкая настройка протокола TCP

Что такое тонкая настройка протокола TCP, какие параметры доступны и как их установить.

Что такое

Тонкая настройка протокола TCP — изменение параметров сетевого соединения, по которому Application Delivery Controller общается с клиентом и upstream-сервером.

Зачем нужна

Тонкая настройка позволяет адаптировать параметры TCP под специфику вашего трафика. Например:

  • задать лимиты подключений, которые система удерживает в очереди до начала обработки;

  • управлять объёмом памяти для приёма и отправки данных в каждом соединении;

  • ускорить освобождение ресурсов и портов после закрытия старых сессий (состояние TIME_WAIT);

  • настроить реакцию TCP на потери и переупорядочивание пакетов;

  • настроить защиту от SYN-флуда и аномального трафика;

  • настроить частоту контрольных запросов (keep-alive) и переотправку данных для зависших сессий.

Как работает

Application Delivery Controller работает в среде Linux, где за установку и поддержку TCP-сессий отвечает ядро системы. Чтобы изменить логику обработки трафика, нужно передать ядру новые параметры через утилиту sysctl.

Процесс выглядит так:

  1. вы подключаетесь к консоли сервера по SSH;

  2. передаёте ядру новое значение нужного параметра (например, увеличиваете размер очереди);

  3. ядро применяет настройки и начинает обрабатывать трафик по новым правилам;

  4. данные поступают и передаются через обновлённый сетевой стек.

Где хранятся параметры

Значения параметров задаются в конфигурационных файлах. Это либо основной файл /etc/sysctl.conf, либо отдельные файлы с расширением .conf в одном из системных каталогов:

Каталог Назначение Приоритет

/etc/sysctl.d/

Для настроек системного администратора

Высший

/run/sysctl.d/

Для временных конфигураций, создаваемых во время работы системы

Средний

/usr/lib/sysctl.d/

Для настроек, поставляемых с пакетами дистрибутива

Низший

В файлах уже содержатся параметры, необходимые для оптимальной работы Application Delivery Controller. Если параметра в файлах нет, ядро использует значение по умолчанию.

При перезагрузке системы или принудительном применении настроек, ядро обрабатывает все эти файлы по двум правилам:

  • Приоритет каталогов. Для файлов с одинаковым именем, расположенных в разных каталогах, приоритет такой: /etc/ > /run/ > /usr/lib/. Файл из более приоритетного каталога переопределяет одноимённый файл из менее приоритетного. Так файл 50-balancer.conf в /etc/sysctl.d/ переопределит файл 50-balancer.conf в /usr/lib/sysctl.d/.

  • Лексикографический порядок. Файлы с разными именами обрабатываются в алфавитном порядке. Если один параметр указан в нескольких файлах, итоговое значение берётся из файла, имя которого идёт последним по алфавиту. Так файл 99-balancer.conf переопределит 10-balancer.conf, даже если оба лежат в одном каталоге.

Как посмотреть текущие параметры

Чтобы проверить, какие настройки использует ваша система, воспользуйтесь следующими командами:

Для просмотра одного параметра

sysctl net.ipv4.tcp_sack

Для просмотра группы параметров

sysctl net.ipv4.tcp_*

Команда выводит все параметры, имена которых начинаются с указанного префикса.

Как установить параметры

Временная установка

Параметры записываются напрямую в оперативную память ядра. После перезагрузки системы значения вернутся к тем, что указаны в конфигурационном файле.

Чтобы изменить один параметр, выполните команду:

sudo sysctl -w net.ipv4.tcp_fin_timeout=30

Чтобы изменить несколько параметров одной командой, перечислите их через пробел:

sudo sysctl -w net.core.somaxconn=65535 net.ipv4.tcp_max_syn_backlog=8192

Постоянная установка

Параметры фиксируются в конфигурационном файле. Система считывает и применяет указанные значения при каждом запуске.

Внесите изменения в нужный конфигурационный файл или создайте под свои настройки отдельный файл с расширением .conf. Каждый параметр пишется в отдельной строке в формате имя = значение.

Пример настроек:

net.ipv4.tcp_max_tw_buckets = 100
net.ipv4.tcp_keepalive_time = 15
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_fin_timeout = 5

Чтобы применить параметры только из редактируемого файла, используйте команду:

sudo sysctl --load=файл.conf

Чтобы перезагрузить параметры из всех файлов и увидеть применённую иерархию, используйте:

sudo sysctl --system

Параметры sysctl

Глобальные лимиты и очереди

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.core.somaxconn

Максимальное число соединений в очереди слушающего сокета

integer

4096

От 128 до 65535

net.core.netdev_max_backlog

Число пакетов в очереди на обработку ядром до передачи в стек

integer

От 1 до 65535

Управление памятью и буферами

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.core.rmem_default

Размер буфера сокета на приём для всех протоколов

integer

От 2304 до 2147483647

net.core.wmem_default

Размер буфера сокета на отправку для всех протоколов

integer

От 4608 до 2147483647

net.core.rmem_max

Максимальный размер буфера на приём, который система может запросить через setsockopt()

integer

От 2304 до 2147483647

net.core.wmem_max

Максимальный размер буфера на отправку, который система может запросить через setsockopt()

integer

От 4608 до 2147483647

net.ipv4.tcp_rmem

Автоподстройка буфера приёма

array

4096 87380 4194304

Три целых числа (минимум, дефолт и максимум)

net.ipv4.tcp_wmem

Автоподстройка буфера отправки

array

4096 16384 4194304

Три целых числа (минимум, дефолт и максимум)

net.ipv4.tcp_mem

Лимиты памяти для всего TCP-стека в страницах (обычно 4 КБ)

array

196608 262144 393216

Три целых числа:

  • минимум, ниже которого ядро не ограничивает память;

  • порог включения «режима давления»;

  • абсолютный максимум страниц, после которого выделение памяти блокируется.

net.ipv4.tcp_max_orphans

Максимальное число осиротевших (не связанных ни с одним процессом) TCP-сокетов

integer

65536

От 16384 до 262144

net.ipv4.tcp_orphan_
retries

Число попыток закрыть соединение на стороне сервера перед его принудительным разрывом

integer

7

От 0 до 255

net.core.optmem_max

Максимальный размер буфера для служебной информации сокета (опции, фильтры)

integer

От 1 до 2147483647

net.ipv4.tcp_adv_win_
scale

Коэффициент для расчёта доли буфера сокета под TCP-окно и данные системы

integer

2

От -31 до 31

net.ipv4.tcp_app_win

Количество байт в приёмном буфере сокета, зарезервированных под TCP-окно

integer

31

От 0 до 31

net.ipv4.tcp_moderate_
rcvbuf

Автоподстройка буфера приёма под текущую скорость сети, чтобы сгладить нагрузку на память

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_base_mss

Начальное значение MSS для расчёта размера сегментов, если не удаётся определить MTU пути

integer

net.ipv4.tcp_min_snd_mss

Минимальный разрешённый MSS для отправки. Ограничивает уменьшение сегментов при работе с малыми MTU (например, в туннелях)

integer

net.ipv4.tcp_limit_
output_bytes

Максимальный объём неподтверждённых данных в очереди на отправку (борьба с Bufferbloat)

integer

4194304

net.ipv4.tcp_autocorking

Автоматическая склейка мелких сегментов в крупные для более эффективного использования сети

boolean

0 (выкл), 1 (вкл)

Очереди и состояние TIME_WAIT

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.ipv4.ip_local_port_range

Диапазон портов для исходящих соединений (например, от ADC к бэкенду)

array

32768 60999

Два целых числа (от 1024 до 65535)

net.ipv4.tcp_tw_reuse

Разрешает повторно использовать сокеты в состоянии TIME_WAIT для новых соединений, если это безопасно для протокола

integer

2

0 (выкл), 1 (вкл), 2 (только для loopback)

net.ipv4.tcp_tw_recycle

Утилизацию сокетов в состоянии TIME_WAIT

boolean

0

0 (выкл), 1 (вкл)

net.ipv4.tcp_fin_timeout

Время ожидания в состоянии FIN-WAIT-2 для «осиротевших» соединений перед их принудительным закрытием

integer

60

net.ipv4.tcp_max_tw_buckets

Максимальное число сокетов, которые могут одновременно находиться в состоянии TIME_WAIT

integer

180000

net.ipv4.tcp_max_syn_backlog

Размер очереди для соединений, которые получили SYN, но ещё не прислали ACK. Работает вместе с tcp_syncookies

integer

1024

Поведение протокола и восстановление

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.ipv4.tcp_window_scaling

Поддержка TCP-окон больше 64 КБ (RFC 1323) для работы на высокоскоростных каналах с большой задержкой

boolean

1

0 (выкл), 1 (вкл)

net.ipv4.tcp_timestamps

Добавление временных меток в каждый TCP-сегмент (RFC 1323). Обязательно для работы tcp_window_scaling

boolean

1

0 (выкл), 1 (вкл)

net.ipv4.tcp_sack

Использование селективных подтверждений (Selective Acknowledgements) для повторной отправки только потерянных сегментов

boolean

1

0 (выкл), 1 (вкл)

net.ipv4.tcp_dsack

Использование дублирующих подтверждений (Duplicate SACK) для определения ложных потерь и предотвращения лишних повторных отправок

boolean

1

0 (выкл), 1 (вкл)

net.ipv4.tcp_fastopen

Использование механизма быстрого открытия (TCP Fast Open) для передачи данных на этапе установки соединения

integer

0x1

Битовая маска: 0x1 (клиент), 0x2 (сервер), 0x4 (TFO без cookie), 0x400 (все слушатели)

net.ipv4.tcp_congestion_
control

Выбор алгоритма для контроля скорости передачи данных и реакции на потери в сети

string

cubic

cubic, bbr, reno

net.ipv4.tcp_recovery

Использование алгоритма RACK для быстрого обнаружения потерь и устойчивости к переупорядочиванию пакетов

integer

0x1

Битовая маска: 0x1 (RACK), 0x2 (статичное окно), 0x4 (без DUPACK)

net.ipv4.tcp_notsent_lowat

Порог неотправленных данных в буфере записи, по достижении которого ядро уведомляет систему через epoll

integer

net.ipv4.tcp_rfc1337

Защита от «фантомных» пакетов (RFC 1337). Игнорирует RST-пакеты в состоянии TIME_WAIT, чтобы старые копии пакетов не закрыли новое соединение

boolean

0

0 (выкл), 1 (вкл)

net.ipv4.tcp_syncookies

Защита от SYN-флуда через механизм SYN-кук при переполнении очереди tcp_max_syn_backlog

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_abort_
on_overflow

Принудительный сброс новых соединений, если система не успевает их обрабатывать

boolean

0

0 (выкл), 1 (вкл)

net.ipv4.tcp_retrans_
collapse

Эмуляция ошибки протокола для совместимости со старым железом. Повторная отправка полных пакетов без разделения

boolean

1

0 (выкл), 1 (вкл)

net.ipv4.tcp_stdurg

Использование интерпретации указателя срочности (Urgent Pointer) согласно RFC 1122 вместо режима BSD

boolean

0

0 (выкл), 1 (вкл)

net.ipv4.tcp_slow_start_
after_idle

Сброс размера окна в долгоживущих соединениях после простоя

boolean

1

0 (выкл), 1 (вкл)

net.ipv4.tcp_mtu_probing

Обнаружение MTU пути на уровне TCP

integer

0 (выкл),

1 (выкл по умолчанию, вкл при обнаружении ICMP black hole),

2 (всегда включено с использованием MSS из tcp_base_mss)

net.ipv4.tcp_child_
ehash_entries

Размер хеш-таблицы установленных соединений для дочерних сокетов

integer

0 (автоопределение) или 2^n (где n от 0 до 24)

net.ipv4.tcp_ehash_entries

Число записей в основной хеш-таблице установленных сокетов (только для чтения)

integer

net.ipv4.tcp_max_
reordering

Максимальный уровень допустимого переупорядочивания пакетов в TCP-потоке

integer

net.ipv4.tcp_frto

Алгоритм восстановления RTO в прямом направлении (F-RTO) для повышения эффективности повторной передачи

integer

0 (выкл), 1 (базовый), 2 (улучшенный)

net.ipv4.tcp_early_retrans

Лимит повторных передач на ранней стадии (Early Retransmit) в ожидании данных SACK

integer

net.ipv4.tcp_thin_linear_
timeouts

Использование линейных тайм-аутов (вместо экспоненциальных) для потоков с малым объёмом данных (менее 4 пакетов)

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_reordering

Начальный уровень допустимого переупорядочивания пакетов. Стек может динамически изменять его в пределах от этого значения до tcp_max_reordering

integer

net.ipv4.tcp_no_metrics_
save

Запрет на сохранение метрик маршрута (RTT, окно перегрузки) после закрытия соединения

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_no_ssthresh_
metrics_save

Отключает сохранение метрик порога медленного старта (ssthresh) в кэше маршрутов

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_workaround_
signed_windows

Совместимость с некорректными TCP-стеками, которые ошибочно воспринимают окно как знаковое (signed) число.

Если опция выключена, ядро считает удалённый стек исправным, даже если масштабирование не поддерживается

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_shrink_window

Уменьшение объявленного окна приёма, если система медленно считывает данные из буфера

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_reflect_tos

Копирование значения DSCP из входящего SYN-пакета в исходящие. Поддерживает одинаковый QoS в обоих направлениях

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_min_rtt_wlen

Размер окна (в сегментах) для вычисления минимального RTT. Используется в алгоритмах управления перегрузкой (например, BBR)

integer

От 0 до 86400

net.ipv4.tcp_ecn

Уведомление о перегрузке (Explicit Congestion Notification) на маршруте

integer

0 (выкл),

1 (для входящих),

2 (для исходящих),

3 (в обе стороны)

net.ipv4.tcp_ecn_fallback

Автоматическое отключение ECN для хоста, если первая попытка соединения привела к сбросу пакетов на пути

boolean

0 (выкл), 1 (вкл)

net.ipv4.tcp_probe_interval

Интервал в секундах между проверками (зондами) состояния TCP

integer

net.ipv4.tcp_probe_
threshold

Минимальный размер окна, при котором разрешена отправка проверочного зонда

integer

net.ipv4.tcp_challenge_
ack_limit

Лимит количества Challenge ACK в секунду для защиты от атак на «слепое окно» (RFC 5961)

integer

net.ipv4.tcp_invalid_
ratelimit

Интервал между отправкой дублирующих ACK в ответ на некорректные пакеты (вне окна или ошибка PAWS)

integer

net.ipv4.tcp_fastopen_
blackhole_timeout_sec

Время блокировки механизма Fast Open (TFO) после неудачной попытки соединения

integer

net.ipv4.tcp_migrate_req

Разрешение на перенос входящих запросов между слушающими сокетами для балансировки нагрузки (при использовании SO_REUSEPORT)

boolean

0

0 (выкл), 1 (вкл)

net.ipv4.tcp_l3mdev_accept

Ограничение приёма соединений рамками того VRF или сетевого пространства, в котором создан сокет

boolean

0

0 (выкл), 1 (вкл)

net.ipv4.tcp_fwmark_accept

Использование файрвольных маркеров (fwmark) для фильтрации входящих соединений

boolean

0

0 (выкл), 1 (вкл)

Оптимизация отправки

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.ipv4.tcp_tso_win_divisor

Определяет максимальную долю окна перегрузки, которую может занять один TSO-кадр

integer

net.ipv4.tcp_tso_rtt_log

Корректировка размеров пакетов TSO (Segmentation Offload) на основе минимального времени отклика (min_rtt)

integer

net.ipv4.tcp_min_tso_segs

Минимальное количество сегментов в одном кадре TSO

integer

net.ipv4.tcp_pacing_ca_ratio

Коэффициент контроля темпа отправки (pacing) для поиска пропускной способности в фазе предотвращения перегрузки

integer

net.ipv4.tcp_pacing_ss_ratio

Коэффициент контроля темпа отправки в режиме медленного старта для безопасного тестирования высоких скоростей

integer

Информационные параметры

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.ipv4.tcp_available_
congestion_control

Список всех алгоритмов управления перегрузкой, которые загружены и доступны в системе

string

net.ipv4.tcp_allowed_
congestion_control

Список алгоритмов управления перегрузкой, которые разрешено использовать непривилегированным процессам (обычно совпадает с available)

string

net.ipv4.tcp_available_ulp

Список доступных протоколов верхнего уровня (ULP), таких как tls, mptcp

string

Таймеры Keep-Alive и повторные попытки

Параметр Описание Тип Значение по умолчанию Допустимое значение

net.ipv4.tcp_keepalive_time

Время неактивности в секундах, после которого отправляется первая проверка Keep-Alive

integer

7200 сек (2 часа)

net.ipv4.tcp_keepalive_probes

Число проверок Keep-Alive без ответа, после которого соединение считается разорванным

integer

9

net.ipv4.tcp_keepalive_intvl

Интервал между повторными проверками Keep-Alive, если на предыдущую не пришёл ответ

integer

75

net.ipv4.tcp_syn_retries

Количество попыток отправки SYN-пакета при установлении нового соединения

integer

5

< 255

net.ipv4.tcp_synack_retries

Максимальное число попыток повторной отправки SYN-ACK в ответ на входящий SYN-запрос

integer

5

< 255

net.ipv4.tcp_retries1

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

integer

3

net.ipv4.tcp_retries2

Лимит попыток повторной передачи данных, до превышения которого соединение считается разорванным

integer

15