TCP або UDP для багатокористувацької гри?


18

Це питання, яке я бачу багато. Більшість людей кажуть, що UDP завжди краще для ігор в режимі реального часу, ніж TCP. Я розумію, що TCP намагається повторно надсилати пакети знову і знову, поки інша сторона їх не отримає, тоді як UDP не хвилює.

Більшість речей, які я читав, - це те, що UDP є необхідним для будь-якої гри в реальному часі, а TCP - жахливо. Але справа в тому, що, здається, більшість людей так чи інакше впроваджують певну форму TCP поверх UDP. І я також чув, що різниця між ними незначна, враховуючи те, що ми вже не в 80-х роках, і Інтернет зараз досить швидкий і надійний.

Чи моє загальне розуміння тут неправильне? Чи може хтось мені це очистити?


7
internet is now pretty fast and reliableНі це не так. Так , різко зросла пропускна здатність , але затримка все ще досить висока. При чистому TCP вам потрібно, щоб час відмітки сервера перевищував максимальну доступну затримку, якщо тільки ви не робите пакетів - що найкраще робити у клієнта через UDP. Проблема полягає в тому, що деяка інформація в грі повинна бути надійною, а інша повинна бути швидкою. Спеціальні протоколи поверх UDP дозволяють це зробити, а також купу фірмових, які надають вам все необхідне в хорошій упаковці.
Звичайний

4
Вони точно не реалізують TCP через UDP. Є деякі функції, які пропонують TCP, які бажані і які реалізовані поверх UDP. Важливим моментом використання UDP є те, що якщо ви надсилаєте пакет, що містить світовий стан у той час, t0який ніколи не отримується, то ви надсилаєте нову світову державу вчасно t1, вам не доведеться чекати, поки клієнт фактично отримає перший пакет, яка вже застаріла.
Вінсент Савард

@Ordous Я думаю, що це відповідає на моє питання :) Дякую
flooblebit

4
Також пам’ятайте, що UDP схильний до підробки IP, що може зробити ваш сервер відкритим для DDoS-атак, якщо це викликає занепокоєння. Ви можете уникнути цього, встановивши TCP-з'єднання "управління", яке надсилає IP-адресу клієнта та інші деталі на сервер, який потім приймає пакети UDP з "автентифікованої" адреси. Крім того, можливо, вам доведеться реалізувати власний рівень шифрування, оскільки для UDP немає відкритих стандартів.
ARau

@ blownie55 гарних моментів там
Naresh Kumar

Відповіді:


12

Залежить від того, якщо ви говорите про одноранговий, клієнт / сервер з користувачами, що керують сервером, або клієнт / сервер із центром обробки даних, на якому працює сервер. Тільки в останньому - найчастіше, Інтернет справді швидкий і надійний. Гарантовано, що комп'ютери ваших користувачів не будуть швидкими, і, звичайно, не будуть надійними.

UDP дозволяє вам краще контролювати таку TCP-подібну реалізацію, яку ви робите. Це дає вам більшу гнучкість виконувати невпорядкованість пакетів, відкидати пакети, які ви вважаєте непотрібними під час повторної перевірки пакетів, які ви вважаєте важливими, такі речі. Але це слід робити лише за потреби і якщо у вас є необхідний досвід.

Якщо ви можете обійтися без такої гнучкості, TCP працює досить добре і економить вам багато часу. Навіть професійні студії (на зразок тієї, в якій я працював) використовують TCP, якщо вони абсолютно не потребують UDP, і у них є люди, присвячені мережевому програмуванню.


Я б також запропонував, що "для чого" має значення - наприклад, для ігрової системи чату, я б навіть не вважав UDP. Інше, що я б врахував (принаймні для "клієнтського сервера") - це те, наскільки ефективно сервер може управляти трафіком - сучасні NIC мають багато вбудованих "розвантажувальних" речей для TCP (розбиття та об'єднання пакетів, сортування пакетів у потоки, тощо), призначені для зменшення накладних витрат процесора, і більшість з них не може працювати для UDP.
Брендан

1
Тепер може змінитися ситуація, коли QUIC ( en.wikipedia.org/wiki/QUIC ), який буде частиною HTTP / 3, який використовує UDP і шифрується за допомогою TLS за замовчуванням. Знадобиться деякий час, щоб це було широко доступне, і є на що чекати. Детальніше про деякі питання, які потрібно вирішити тут blog.cloudflare.com/the-road-to-quic
ARau

3

Було б припущення сказати, що "Інтернет зараз досить швидкий і надійний", як вказував @Ordous, і небезпечний.

Причина, чому користувацький протокол UDP + для критично важливих пакетів робить магію в більшості ігор, полягає в тому, що в деяких випадках це може бути "нормально", якщо ви втратите якийсь пакет (саме для, наприклад, вторинних некритичних подій для завершення гри) , також бувають випадки, коли "зовсім не гаразд" втрачати деякі дані, наприклад, переміщення курсору тощо. (Я не займаюся розробкою ігор для життя, тому вибачте за свої неясні приклади)

UDP не витрачає час на їх натискання знову і знову, за замовчуванням.

І, здається, багато ігор, як правило, мають пакети "добре втрачати іноді" більше, ніж "завжди потрібно доставляти безвідмовно". Отже, природне пристосування до цього завдання.

Все, що було потрібно для UDP, полягало у використанні користувальницького протоколу, який просто допомагає належним чином доставляти пакети "завжди потрібно доставляти безвідмовно", залишаючи решта даних ігор на користь мережевого з'єднання.

Тепер вирішення питання про те, який трафік складає більшість ваших даних для передачі, допоможе вам прийняти рішення краще.

Суть проти TCP полягала б у тому, що час, витрачений на повторні спроби, скоріше можна витратити на відправлення пакетів, які мають значення ЗАРАЗ.

Також є ймовірність, що, якщо під час передачі виникне якась проблема, TCP може перетворитись на більш розбитий сценарій ігрових ігор для користувача, зіпсувавши їхній досвід порівняно з UDP + Спеціальним стеком (Ця остання частина просто підказка. Я залишу це іншим експертам тут, щоб прокоментувати це. Я хотів би дізнатися про можливості цього сценарію).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.