Что было бы лучше в Java для работы в сети? UDP или TCP?

Что следует использовать для MMO-игры на java. UDP или TCP? И почему? TCP представляет собой двухточечную связь и передает каждый пакет, в то время как UDP не имеет двухточечной связи и может отбрасывать пакеты, что приводит к задержке. Какой из них лучше использовать в этом сценарии?


person Dennis    schedule 08.02.2011    source источник
comment
Задержка - это не просто результат отброшенных дейтаграмм UDP. TCP также даст задержку из-за зашумленного соединения.   -  person DwB    schedule 08.02.2011


Ответы (5)


Ответ зависит не от языка, а от требований игры.

Если ваша игра может справиться с обновлениями статуса от игроков (или сервера), которые либо пропадают, либо прибывают не по порядку, тогда UDP подойдет.

Если вам нужен ответ в реальном времени с минимальной задержкой (и вышеупомянутые проблемы решены), вам также следует использовать UDP.

В противном случае следует использовать TCP.

person Alnitak    schedule 08.02.2011
comment
Поверх UDP есть слой реального времени, который используется для определенных типов систем видеоконференцсвязи, что может быть подходящим при условии, что можно сбрасывать запаздывающую / отсутствующую информацию. - person Donal Fellows; 09.02.2011
comment
@Donal - вы про RTP? Для большинства других целей это излишне сложно. - person Alnitak; 09.02.2011

Неважно, Java это или нет, TCP и UDP имеют одни и те же преимущества и недостатки, которые не зависят от языка.

Но чаще всего это сводится к одному основному вопросу проектирования: что должно произойти, когда пакет отбрасывается?

  1. Притворись, что этого не было. Это территория UDP.
  2. Подождите, пока пакет не будет отправлен повторно. Здесь следует использовать TCP.

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

person biziclop    schedule 08.02.2011
comment
UDP также может переупорядочивать пакеты, но он применяет проверку целостности (одна из причин отбрасывания пакета - его повреждение). - person Donal Fellows; 09.02.2011
comment
@Donal - многие системы неправильно генерируют контрольные суммы UDP и отправляют значение по умолчанию «0», чтобы указать это. - person Alnitak; 09.02.2011
comment
@Donal Fellows Верно, главный вопрос должен быть более общим, то есть что делать, если пакеты приходят не по порядку или вообще. Конечно, есть и другие важные аспекты, которые следует учитывать, например, брандмауэры и прокси, но в качестве отправной точки, вероятно, подойдет. - person biziclop; 09.02.2011
comment
@Alnitak: Ох! Время Facepalm. Какой смысл в гарантии целостности (даже такой дешевой, как контрольная сумма), если вы ее не используете ?! - person Donal Fellows; 09.02.2011
comment
@biziclop: Единственное, что имеет хоть малейший шанс выйти из любого места, - это старый добрый HTTP. Вероятно, через плохо управляемый и агрессивный прокси, который тоже плохо реализован. (Я бывал в подобных местах. Худшим было место, где единственная сеть была беспроводной, и то только в том случае, если у вас был ноутбук, который был в одобренном списке, и если вы использовали простой HTTP. Учитывая, что они размещали После серьезной встречи с руководителями бюджетных организаций, участвовавших в большом проекте, все было очень холодно. Я думаю, что их служба безопасности получила серьезный сигнал от этого ...) - person Donal Fellows; 09.02.2011
comment
И когда я говорю «простой HTTP», я имею в виду именно это. Нет HTTPS. Альтернативных портов нет. Прямых связей нет. Не могу вспомнить, блокировали ли они POST-сообщения. Кто-то параноик (но не в состоянии провести полный обыск каждого, кто выходит из здания), похоже, хотел предотвратить любой шанс ИСКРИТОВ !!! вылезать, но вместо этого просто удалось полностью предотвратить выполнение работы. (Для сравнения, Mordac из лент Дилберта просто разумен и с ним легко работать.) - person Donal Fellows; 09.02.2011

См. Этот вопрос:

Android-игра UDP / TCP?

person ldx    schedule 08.02.2011

Вопрос на самом деле не связан с Java. Не гарантируется, что дейтаграммы UDP достигнут пункта назначения, в отличие от дейтаграмм TCP. Последовательные дейтаграммы UDP также могут достигать места назначения не по порядку. Например, DNS основан на UDP, потому что запросы и ответы принимают только одну дейтаграмму. Если вам нужна надежность и вы не хотите осуществлять повторные попытки. TCP - ваш выбор. В настоящее время накладные расходы на вычисления минимальны, поэтому я не думаю, что от предпочтения UDP можно ожидать большого увеличения производительности.

person Alain Pannetier    schedule 08.02.2011
comment
Строго говоря, получение TCP-пакетов не гарантируется. Гарантии заключаются в том, что 1. если они этого не сделают, O / S отправителя попытается снова, 2. аналогично, если они повреждены, 3. если они все-таки прибудут, то все будет в правильном порядке. - person Alnitak; 08.02.2011
comment
Согласованный. Я, наверное, должен был сказать такие вещи. Если соединение установлено, они надежно доставлены ;-) - person Alain Pannetier; 08.02.2011

Мой опыт работы с UDP и TCP выглядит следующим образом:

  • UDP значительно быстрее. мы говорим на 2 порядка.
  • В проводных сетях потеря пакетов UDP составляет менее 1%.
  • В беспроводной сети потеря пакетов UDP может легко достигать 80%, и физическое расстояние до маршрутизатора имеет значение: вы потеряете 20% пакетов с расстояния в 30 см и 50% с расстояния 20 футов.

Так что UDP хорош для несущественных вещей. Например, если в вашей игре бегают 2 парня, и игрок A получает текущие координаты и скорость игрока B через UDP каждые 100 миллисекунд, игрок A может на некоторое время экстраполировать, не заходя слишком далеко. С другой стороны, если у игрока A фулл-хаус, а у игрока B - флеш-рояль, ситуация иная.

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

person iluxa    schedule 09.02.2011