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