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

Анатомия игровых лагов › L2 ОС и устройство клиента

Переполнение буфера приёма Socket receive buffer overflow

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

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

Если игра занята и поздно забирает пакеты из сокета (интерфейса ОС для приёма и отправки данных по сети), буфер ОС переполняется.

Почему Кадры запаздывают, и игра поздно читает сокет → Следствие Буфер приёма ОС заполняется: UDP-пакеты отбрасываются, а TCP уменьшает окно приёма и заставляет отправителя остановиться → На экране Телепортация (UDP) или перемотка (TCP)

Симптомы
Телепортация, Перемотка
Факторы
Потери, Остановка
У кого
Только у меня
Когда
При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка клиента
Команда разработки: задачи
Вынести приём в отдельный поток, подобрать размер буфера (SO_RCVBUF).
Цифры для ориентира
Буфер приёма по умолчанию, в зависимости от ОС и настроек, от десятков до сотен KB. Обновления в людном месте могут достигать сотен KB в секунду.
На графике
Растёт вслед за онлайном и нагрузкой · число UDP-пакетов, отброшенных буфером приёма, время кадра
Где смотреть
Записывать в Системном мониторе Windows Microsoft Winsock BSP\Dropped Datagrams (число UDP-пакетов, отброшенных из-за нехватки буфера приёма сокета) и UDPv4\Datagrams Received Errors вместе со временем кадра, а в игре считать пропуски в порядковых номерах полученных пакетов
Подтверждает
В людных местах или сразу после долгого кадра растёт Dropped Datagrams, и в те же моменты появляются пропуски в номерах пакетов. Потерь на линии связи в это время нет
Опровергает
Если Dropped Datagrams не растёт, а номера всё равно пропадают, это потери на маршруте
Чем проверить
Проверка на стороне игрока

Источники

  1. socket(7) — Linux manual page Linux man-pages
    SO_RCVBUF задаёт максимальный размер буфера приёма сокета, значение по умолчанию берётся из rmem_default, максимум из rmem_max (Android тоже работает на ядре Linux)
  2. SOL_SOCKET Socket Options (Winsock2.h) Microsoft
    SO_RCVBUF в Windows: буферное пространство, которое резервируется для приёма в каждом сокете
  3. RFC 9293: Transmission Control Protocol (TCP) IETF
    Поле окна TCP показывает, сколько ещё байт готов принять получатель. При 0 отправитель только шлёт пробы нулевого окна (zero window probe) и ждёт
  4. Low Latency Workloads Management and Operations Microsoft
    Dropped Datagrams и Dropped Datagrams/sec из набора счётчиков Microsoft Winsock BSP: число UDP-пакетов, отброшенных потому, что они приходили быстрее, чем приложение успевало их обрабатывать, или не хватило буфера приёма сокета
  5. Network-Related Performance Counters Microsoft
    Счётчики UDPv4 и UDPv6: Datagrams Received Errors, Microsoft Winsock BSP: Dropped Datagrams

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

Тот же слой: L2 ОС и устройство клиента

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

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