Роутер удаляет из таблицы NAT неактивные соединения, по которым какое-то время не было пакетов. Это частая причина дисконнекта в тот момент, когда игрок после простоя снова начинает двигаться.
Почему Роутер записывает соединение «домашнее устройство ↔ внешний сервер» в таблицу NAT (таблицу трансляции адресов) → Следствие Если пакетов какое-то время нет, запись удаляется (для UDP обычно через 30–120 секунд) → На экране Пакеты сервера больше не попадают в домашнюю сеть, дисконнект
Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Клиент: отправлять хартбиты с интервалом не больше половины самого короткого таймаута простоя (запись NAT для UDP гарантированно обновляют только исходящие из дома пакеты, поэтому отправляет клиент), при обрыве автоматически переподключаться. Сервер: отвечать на хартбиты, а если их долго нет, первым закрывать соединение. Если запись NAT удалилась и внешний адрес и порт сменились, узнавать того же игрока по токену сессии (идентификатору, полученному при входе) и продолжать сессию.
На графике
Массовый обрыв соединений · число обрывов (таймаут хартбита), время простоя перед обрывом
Где смотреть
Собрать причины обрывов на сервере и время от последнего пакета по соединению до обрыва (время простоя) и посмотреть их распределение. В тесте увеличивать интервал между UDP-пакетами до 30, 60 и 120 секунд и найти интервал, при котором ответы перестают приходить
Подтверждает
Рвутся только простаивавшие соединения, и время простоя скапливается сразу за определённым значением в диапазоне 30–120 секунд. Если сделать интервал хартбита короче, обрывы пропадают
Опровергает
Если рвётся и во время активной игры, дело в подключении или маршруте. Если короткие значения скапливаются только у определённого мобильного оператора, это «Общий IP провайдера (CGNAT)»