Обычной практикой является использование RUDP (надежный UDP). Он добавляет надежный механизм поверх UDP, обеспечивающий гораздо меньшую задержку, чем TCP, и гарантирующий точность.
На приведенной ниже диаграмме показано, как надежная доставка данных реализуется в онлайн-играх для получения в конечном итоге синхронизированных состояний.
![крупный план текста и логотипа на белом фоне крупный план текста и логотипа на белом фоне](https://resize.yandex.net/mailservice?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2Fw_458%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%252Fpublic%252Fimages%252Fc228016b-e81e-41e4-95ed-c0e434e2cde8_1500x1536.jpeg&proxy=yes&key=e1b9992a6aeea9d44b4f9fbe9b69fa82)
Предположим, в симуляторе шутера происходит большая драка. Символы A, B и C последовательно открывают огонь. Как игровой сервер передает состояния с игрового сервера на игровой клиент?
- Шаги 1 и 2 — Персонаж А открывает огонь. Пакет (packet 0) отправляется клиенту. Клиент подтверждает сервер.
- Шаг 3 — Персонаж B открывает огонь. Пакет теряется во время передачи.
- Шаги 4 и 5 — Персонаж C открывает огонь. Пакет (пакет 2) отправляется клиенту. Поскольку последним успешно доставленным пакетом является пакет 0, клиент знает, что пакет 1 потерян, поэтому пакет 2 буферизуется на стороне клиента. Клиент подтверждает серверу получение пакета 2.
- Шаги 6 и 7 — Сервер некоторое время не получает ack для пакета 1, поэтому он повторно отправляет пакет 1. Когда клиент получает пакет 1, все последующие пакеты вступают в силу, поэтому пакеты 1 и 2 становятся “доставленными”. Затем клиент подтверждает серверу получение пакета 1. На данный момент никакие пакеты не буферизуются.