Несовпадение MTU (пропадают только большие пакеты) MTU black hole
ID причины dc-mtu · Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка сервера
Если на промежуточном участке MTU (максимальный размер пакета за одну передачу) меньше, а уведомления о превышении размера блокируются, постоянно пропадают только большие пакеты.
Почему На участке туннеля или VPN MTU уменьшается → Следствие Уведомление о превышении размера (ICMP) блокирует файрвол, и отправитель о нём не знает → На экране Фриз и затем дисконнект только при открытии больших экранов вроде инвентаря или списка персонажей
При определённом действии, Сразу после входа или техработ
Ответственные
Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка сервера
Команда разработки: задачи
Чтобы снизить размер на стороне сервера, задать в сокете максимальный размер сегмента TCP_MAXSEG (одного дробления сообщений в игровом коде недостаточно), держать UDP-пакеты не больше 1 200 байт.
Команда инфраструктуры: задачи
Сеть: уменьшить размер TCP-пакетов на участке туннеля (MSS clamping), разрешить уведомления о превышении размера (ICMP) на файрволах и в сетевых ACL облака. Серверы и ОС: разрешить уведомления о превышении размера (ICMP) и в файрволе сервера, и в облачной группе безопасности, включить в ядре сервера определение MTU через tcp_mtu_probing=1 (последняя страховка, которая срабатывает, только когда соединение уже простояло несколько секунд).
Цифры для ориентира
Обычно 1 500 байт, после туннеля около 1 400.
На графике
Высоко только у некоторых · дисконнекты по регионам и провайдерам, ошибки больших ответов
Где смотреть
С ПК игрока с проблемой пинговать сервер с флагом запрета фрагментации (DF), меняя размер. В Windows ping /f /l 1472 SERVER_IP, в Linux ping -M do -s 1472 SERVER_IP (1 472 = MTU 1 500 минус 20 байт заголовка IP и 8 байт заголовка ICMP). Уменьшая размер, найти максимальный, который проходит, и проверить, разрешают ли группа безопасности и файрвол на стороне сервера ICMP-уведомления о превышении размера (Fragmentation Needed)
Подтверждает
Маленький пинг проходит, а пинг с DF размером 1 472 байта нет (ответа нет или приходит ошибка о необходимости фрагментации), и максимальный проходящий размер мал, около 1 400. У игроков из одного региона фриз только при открытии больших экранов
Опровергает
Если и пинг с DF размером 1 472 байта проходит, проблема с MTU пути исключается. Если не проходит даже маленький пинг, заблокирован сам ICMP, и этим способом ничего определить нельзя
Чем проверить
Проверка на стороне игрока
Источники
RFC 2923: TCP Problems with Path MTU DiscoveryIETF Если файрвол блокирует ICMP (Fragmentation Needed), определение MTU пути не срабатывает и постоянно пропадают только большие пакеты (чёрная дыра), а пинг и мелкий обмен работают, поэтому диагностировать трудно
IP SysctlLinux kernel При tcp_mtu_probing=1 определение MTU пути для TCP обычно выключено и включается, когда обнаружена чёрная дыра ICMP
ping(8) — Linux manual pageiputils -M do ставит флаг DF и не отправляет пакеты больше MTU пути, -s задаёт размер данных (по умолчанию 56 байт плюс 8 байт заголовка ICMP)
pingMicrosoft /f ставит флаг DF и помогает найти проблемы с MTU пути, /l задаёт размер данных