С каждой новой неудачной повторной передачей ожидание удваивается, и короткий обрыв связи превращается в долгую остановку.
Почему Связь ненадолго обрывается, и повторные передачи тоже одна за другой не доходят → Следствие Ожидание до следующей попытки каждый раз удваивается: 0,3 → 0,6 → 1,2 → 2,4 с (при пинге 100 ms) → На экране Связь пропала на 1 с, а фриз в игре длится больше 2 с. Если обрыв дольше, в итоге дисконнект
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: отвечать на хартбиты, а если их долго нет, первым закрывать соединение (сократить время до отказа через TCP_USER_TIMEOUT), восстанавливать сессию по токену, рассмотреть надёжный UDP. Клиент: часто отправлять хартбиты, а если ответы пропали, сразу переподключаться, не дожидаясь повторных передач TCP.
Цифры для ориентира
Минимальный RTO (время ожидания перед повторной передачей) в Linux равен «пинг + 200 ms», а при установке соединения он начинается с 1 секунды. С настройкой по умолчанию (tcp_retries2=15) повторные передачи могут раз за разом не проходить, но TCP отказывается от соединения только примерно через 15 минут.
На графике
Провал, затем пачка · RTO и backoff по соединениям, число срабатываний RTO
Где смотреть
Посмотреть через ss -ti у зависшего соединения rto (ожидание перед повторной передачей в ms) и backoff (число срабатываний подряд), а по серверу в целом прирост TcpExtTCPTimeouts (число срабатываний таймера повторной передачи) в nstat -az
Подтверждает
У зависшего соединения backoff 1 и больше, rto вырос до секунд, и в этот момент растёт TCPTimeouts
Опровергает
Если всё решается быстрой повторной передачей и RTO не срабатывает, остановка короткая. Тогда это «HOL-блокировка в TCP»
net/ipv4/tcp_input.c (Linux v6.12)Linux kernel В Linux RTO = сглаженный RTT + разброс RTT, а нижняя граница разброса равна tcp_rto_min (200 ms), поэтому RTO не меньше RTT+200 ms
IP SysctlLinux kernel tcp_rto_min_us по умолчанию 200 ms, начальный RTO для запроса на подключение 1 секунда, при tcp_retries2=15 до отказа проходит минимум 924,6 с (около 15 минут)
ss(8) — Linux manual pageiproute2 rto (таймер повторной передачи, ms) и backoff (число экспоненциальных удвоений) в выводе -i
net/ipv4/tcp_timer.c (Linux v6.12)Linux kernel При каждом срабатывании таймера повторной передачи увеличивается TCPTimeouts, backoff растёт на единицу, а RTO удваивается (до максимального значения)