Повторная передача запроса на подключение (SYN) SYN retransmission on connect
ID причины rt-syn · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда инфраструктуры · Сетевая инфраструктура, Команда разработки · Разработка клиента
Если запрос на подключение теряется из-за переполнения очереди подключений (backlog) или блокировки файрволом, ОС клиента отправляет его повторно через 1 с, а затем с растущими интервалами.
Почему Сразу после техработ из-за наплыва подключений переполняется очередь подключений сервера, или файрвол либо защита от DDoS выбрасывают SYN → Следствие ОС клиента повторно отправляет SYN через 1 с, затем через заданные интервалы (в старых Linux 1 с → 2 с → 4 с) → На экране После нажатия кнопки входа задержка ровно в целые секунды (1 с, 3 с), при постоянных неудачах ошибка входа или бесконечная загрузка
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда инфраструктуры · Сетевая инфраструктура, Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: увеличить аргумент backlog в listen (вместе с somaxconn), вовремя вызывать accept в игровом сервере, очередь на вход. Клиент: увеличивать интервал повторных попыток подключения (со случайным разбросом).
Команда инфраструктуры: задачи
Серверы и ОС: переполнение очереди подключений на сервере проверять по TcpExtListenOverflows и TcpExtListenDrops в nstat и по предупреждению «Possible SYN flooding» в логе, увеличить somaxconn (вместе с аргументом listen), включить SYN cookies. Сеть: ослабить ограничения SYN на файрволе и в защите от DDoS.
Цифры для ориентира
В Linux (включая Android) первая повторная передача SYN идёт через 1 с. Старые ядра дальше каждый раз удваивают интервал и отправляют повторно на 1, 3, 7, 15 с …, а ядра 6.5 и новее отправляют SYN повторно пять раз, в моменты 1, 2, 3, 4, 5 с, и только потом удваивают интервал (7, 11, 19 с …) (tcp_syn_linear_timeouts=4). На телефонах с Android после обновления ОС часто остаётся ядро, с которым устройство вышло, поэтому даже на одной версии Android поведение может отличаться от устройства к устройству. В любом случае, если все попытки неудачны, примерно через 2 минуты попытки прекращаются. В Windows в зависимости от версии и настроек интервалы растут начиная с 1 с или 3 с, а повторов 2–4, так что отказ наступает через 20–30 с (значение для конкретного ПК видно в Max SYN Retransmissions в выводе netsh int tcp show global).
На графике
Всплеск сразу после входа или техработ · число попыток подключения, число переполнений очереди подключений
Где смотреть
На сервере посмотреть TcpExtListenOverflows и TcpExtListenDrops в nstat и предупреждение «Possible SYN flooding on port» в dmesg, через ss -lnt проверить, доходит ли Recv-Q слушающего сокета (число соединений, ждущих accept) до Send-Q (лимит backlog). По захвату на стороне сервера проверить, доходят ли SYN и отвечает ли сервер SYN-ACK
Подтверждает
Во время наплыва подключений сразу после техработ растёт TcpExtListenOverflows, а Recv-Q упирается в Send-Q. В захвате SYN от одного и того же клиента приходят повторно с интервалом в секунды, а сервер не отвечает
Опровергает
Если SYN до сервера не доходят и счётчики сервера не меняются, их выбросили файрвол или защита от DDoS перед сервером: смотреть ограничения SYN и логи дропов на этом оборудовании. Если сервер отправил SYN-ACK, а подключение всё равно медленное, теряются пакеты на обратном пути
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
include/net/tcp.hLinux kernel Первый RTO TCP_TIMEOUT_INIT = 1 с (начальное значение из RFC 6298)
IP SysctlLinux kernel tcp_syn_retries по умолчанию 6, tcp_syn_linear_timeouts по умолчанию 4 (SYN RTO 1, 1, 1, 1, 1, 2, 4 …), последняя повторная передача на 67 с, отказ на 131 с, somaxconn по умолчанию 4096, tcp_syncookies по умолчанию 1
tcp: make the first N SYN RTO backoffs linearLinux kernel Коммит, сделавший начало повторных передач SYN равномерным, начиная с Linux 6.5 (значение по умолчанию 4 повторяет поведение macOS и iOS)
Android common kernelsAndroid (Google) Одновременно поддерживаются общие ядра от 5.10 до 6.18, и ядро для предыдущей платформы (например, android14-6.1) можно использовать при выпуске новых устройств на Android или при их обновлении
TcpMaxConnectRetransmissionsMicrosoft Старые значения Windows по умолчанию: 2 повторные передачи SYN, первое ожидание 3 с с удвоением, после последней ожидание ещё вдвое дольше и отказ (3+6+12=21 с)
TCP/IP connectivity issues troubleshootingMicrosoft Число повторных передач SYN зависит от ОС, смотрят его через Max SYN Retransmissions в выводе netsh int tcp show global
listen(2) — Linux manual pageLinux man-pages Аргумент backlog в listen обрезается до somaxconn (с Linux 5.4 по умолчанию 4096, раньше 128)
SNMP counterLinux kernel Когда очередь accept заполнена, SYN выбрасываются, и одновременно растут TcpExtListenOverflows и TcpExtListenDrops; счётчик TcpExtTCPSynRetrans
net/ipv4/tcp_input.cLinux kernel Сообщение в логе «Possible SYN flooding on port …»
net/ipv4/tcp_diag.cLinux kernel Для слушающего сокета Recv-Q в ss означает число соединений, ждущих accept, а Send-Q лимит backlog