У меня есть вопрос по поводу UDP. Для контекста, я работаю над игрой в реальном времени.
Я довольно много читал о различиях между UDP и TCP, и мне кажется, что я их хорошо понимаю, но есть одна статья, которая никогда не была правильной, и это надежность и, в частности, признание . Я понимаю, что UDP не обеспечивает надежности по умолчанию (то есть пакеты могут быть отброшены или доставлены не по порядку). Когда требуется некоторая надежность, решение, которое я видел (что имеет концептуальный смысл), заключается в использовании подтверждений (т. Е. Сервер отправляет пакет клиенту, а когда клиент получает это сообщение, он отправляет подтверждение на сервер) ,
Что происходит, когда подтверждение сбрасывается?
В приведенном выше примере (один сервер отправляет пакет одному клиенту), сервер обрабатывает потенциальную потерю пакетов, повторно отправляя пакеты каждый кадр, пока не будут получены подтверждения для этих пакетов. Вы все еще можете столкнуться с проблемами пропускной способности или неупорядоченными сообщениями, но только с точки зрения потери пакетов сервер покрыт.
Однако, если клиент отправляет подтверждение, которое никогда не приходит, у сервера не останется иного выбора, кроме как в конечном итоге прекратить отправку этого сообщения, что может прервать игру, если потребуется информация, содержащаяся в этом пакете. Вы можете использовать аналогичный подход к серверу (т.е. продолжать отправлять подтверждения, пока вы не получите подтверждение для подтверждения?), Но при таком подходе вы будете циклически возвращаться назад и вперед навсегда (поскольку вам потребуется подтверждение для подтверждения для подтверждения и так далее).
Я чувствую, что моя основная логика здесь верна, что оставляет мне два варианта.
- Отправьте один пакет подтверждения и надейтесь на лучшее.
- Отправьте несколько пакетов подтверждения (возможно, 3-4) и надейтесь на лучшее, предполагая, что не все они будут отброшены.
Есть ли ответ на эту проблему? Я что-то принципиально неправильно понимаю? Есть ли какая-то гарантия использования UDP, о которой я не знаю? Я не решаюсь продвигаться вперед со слишком большим количеством сетевого кода, пока не почувствую себя комфортно, если моя логика будет здравой.