한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L8 Сокеты и протоколы

HOL-блокировка в TCP Head-of-line blocking

ID причины sk-hol · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента

Открыть карточку в основной версии с иллюстрациями и экспериментами →

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

Почему Один пакет теряется → Следствие Следующие пакеты уже пришли, но ждут в буфере приёма → На экране Всё замирает, а потом разом прорывается: перемотка

Симптомы
Фриз, Перемотка
Факторы
Потери, Остановка
У кого
Только у меня
Когда
Изредка, случайно
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: передавать позиции в реальном времени по UDP, гарантированную доставку оставить только для того, без чего нельзя, разделить данные на несколько потоков (streams). Клиент: перевести сетевую часть на ту же схему, что и сервер (UDP, раздельные каналы доставки).
Цифры для ориентира
Потеря одного пакета даёт остановку минимум на время пути туда и обратно плюс ещё немного, а если потеряется и повторная передача, остановка длится от сотен ms до нескольких секунд.
На графике
Провал, затем пачка · объём приёма по соединениям, число повторных передач
Где смотреть
В захвате пакетов на стороне сервера (tcpdump, Wireshark) найти в соединении этого игрока повторно переданные пакеты и паузы вокруг них, а по серверу в целом смотреть прирост TcpRetransSegs в nstat -az
Подтверждает
Остановка начинается с повторной передачи одного пакета, а сразу после его прихода накопившиеся данные обрабатываются разом (приём держится на 0, а потом идёт пачкой)
Опровергает
К играм на UDP неприменимо. Если повторных передач нет, а остановки есть, смотреть тики сервера («Превышение бюджета тика»)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    TCP предоставляет надёжный упорядоченный байтовый поток
  2. RFC 5681: TCP Congestion Control IETF
    Потеря обнаруживается по 3 дублирующим ACK и запускается быстрая повторная передача, иначе приходится ждать таймер повторной передачи
  3. RFC 6298: Computing TCP's Retransmission Timer IETF
    Экспоненциальная задержка повтора (backoff): при каждом срабатывании таймера повторной передачи его значение удваивается
  4. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Имена счётчиков, которые показывает nstat: RetransSegs в группе Tcp (число повторно переданных сегментов)

Смотрите также

Тот же слой: L8 Сокеты и протоколы

Причины с тем же симптомом (Фриз) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами