TCP или UDP для многопользовательской игры?

18

Это вопрос, который я вижу много. Большинство людей говорят, что UDP всегда лучше для игр в реальном времени, чем TCP. Насколько я понимаю, TCP пытается пересылать пакеты снова и снова, пока другая сторона не получит их, тогда как UDP не заботится.

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

Мое общее понимание здесь неверно? Может кто-нибудь прояснить это для меня?

flooblebit
источник
7
internet is now pretty fast and reliableНет, это не так. Пропускная способность резко возросла, да, но задержка еще довольно высока. При использовании чистого TCP вам нужно, чтобы время на сервере превышало максимально возможную задержку, если вы не выполняете рассылку пакетов - что лучше всего делать на клиенте через UDP. Проблема в том, что некоторая информация в игре должна быть надежной, а другая - быстрой. Для этого предусмотрены пользовательские протоколы поверх UDP, а также множество фирменных протоколов, которые дают вам все необходимое в красивой упаковке.
Ordous
4
Они точно не реализуют TCP через UDP. TCP предлагает некоторые функции, которые желательны и реализованы поверх UDP. Основным моментом использования UDP является то, что если вы отправляете пакет, содержащий состояние мира, в то время t0, которое никогда не принимается, то вы отправляете новое состояние мира за раз t1, вам не нужно ждать, пока клиент фактически получит первый пакет, который уже устарел.
Винсент
@ Мне кажется, это отвечает на мой вопрос :) Спасибо
flooblebit
4
Также помните, что UDP подвержен спуфингу IP, что может сделать ваш сервер открытым для DDoS-атак, если это вызывает опасения. Этого можно избежать, имея «управляющее» TCP-соединение, которое отправляет IP-адрес клиента и другие данные на сервер, который затем принимает UDP-пакеты с «аутентифицированного» адреса. Также вам может потребоваться реализовать собственный уровень шифрования, так как нет открытых стандартов для этого по UDP.
ARau
@ blownie55 хорошие моменты там
Нареш Кумар

Ответы:

12

Зависит от того, говорите ли вы об одноранговой связи, клиент / сервер с пользователями, на которых работает сервер, или клиент / сервер с центром обработки данных, на котором работает сервер. Только в последнем случае Интернет действительно быстрый и надежный. Компьютеры ваших пользователей не гарантируют высокую скорость и, конечно, не будут надежными.

UDP позволяет вам лучше контролировать реализацию, подобную TCP. Это дает вам большую гибкость, чтобы выполнять пакеты не по порядку, отбрасывать пакеты, которые вы считаете ненужными, и повторять пакеты, которые вы считаете важными, такого рода вещи. Но это следует делать только в случае необходимости и при наличии необходимого опыта.

Если вы можете обойтись без этой гибкости, TCP работает достаточно хорошо и экономит вам много времени. Даже профессиональные студии (вроде той, в которой я работал) используют TCP, если им абсолютно не нужен UDP, и у них есть люди, посвященные сетевому программированию.

Кевин Фе
источник
Я также предположил бы, что «для чего» имеет значение - например, для системы внутриигрового чата, я бы даже не рассматривал UDP. Другая вещь, которую я хотел бы рассмотреть (по крайней мере, для «клиент-сервер»), - насколько эффективно сервер может обрабатывать трафик - современные сетевые адаптеры имеют много встроенных «разгрузочных» компонентов для 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 + Custom Stack (эта последняя часть просто предчувствие). это другим экспертам здесь, чтобы прокомментировать это. Хотелось бы узнать о возможностях этого сценария).

Нареш Кумар
источник