Почему UDP + является программной надежной системой заказов быстрее, чем TCP?

StackOverflow https://stackoverflow.com/questions/1200901

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Мой основной вопрос: что с этим? Разве TCP не то же самое, что заказанный, надежный UDP? Что делает его настолько медленным, что людям приходится изобретать велосипед?

Это было полезно?

Решение

Общие / Специализация

<Ол>
  • TCP - это надежная система общего назначения
  • UDP + любая надежная система специального назначения.
  • Специализированные вещи, как правило, лучше, чем вещи общего назначения, если они специализированы.

    Поток / Сообщение

    <Ол>
  • TCP основан на потоке
  • UDP основан на сообщениях
  • Отправка дискретных игровых информационных карт обычно лучше, чем основанная на сообщениях парадигма. Отправка через поток возможна, но ужасно неэффективна. Если вы хотите надежно отправить огромное количество данных (передача файлов), TCP достаточно эффективен. Вот почему Bit-torrent использует UDP для управляющих сообщений и TCP для отправки данных.

    Другие советы

    Мы перешли от надежного к ненадежному в «лиге легенд» около года назад из-за ряда преимуществ, которые с тех пор подтвердились:

    1) Старая информация становится неактуальной. Если я отправляю пакет работоспособности, а он не приходит ... Мне не нужно ждать, пока этот же пакет отправится, когда я узнаю, что он изменился.

    2) Заказ иногда не нужен. Если я отправляю разные сообщения в разные системы, возможно, нет необходимости приводить эти сообщения в порядок. Я не заставляю клиента ждать сообщений в заказе.

    3) Ненадежность не резервируется с сообщениями ... т.е. ожиданием подтверждений, что означает, что вы можете разрешить пики потерь гораздо быстрее.

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

    5) Управление потоком сообщений, например, отбрасывание сообщений, которые менее актуальны, когда сеть внезапно набирает обороты. Сетевая система может не отправлять менее релевантные сообщения, если у вас есть всплеск потерь. С TCP у вас все еще будет очередь сообщений, которые пытаются отправить повторно, что может иметь более низкий приоритет.

    6) Меньший пакет заголовка ... на самом деле не нужно много говорить об этом.

    Между UDP и TCP существует гораздо больше различий, чем просто надежность и последовательность:

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

    Сравнительный анализ TCP - UDP

    Ответ, на мой взгляд, состоит из двух слов: «Контроль перегруженности».

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

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

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

    Эта небольшая статья старая, но она все еще довольно верна, когда дело доходит до игр. Это объясняет два протокола, и хаос, который эти люди пошли, пытаясь разработать многопользовательскую интернет-игру. " X-Wing vs Tie Fighter "

    Извлеченные уроки (Интернет - отстой)

    Однако есть одна оговорка: я запускаю / разрабатываю многопользовательскую игру, и я использовал обе. UDP был намного лучше для моего приложения, но многие люди не могли играть с UDP. Маршрутизаторы и тому подобное заблокировали соединения. Поэтому я перешел на «надежный» TCP. Ну ... Надежно? Я так не думаю. Вы отправляете пакет, без ошибок, вы отправляете другой, и он падает (исключение) в середине пакета. Теперь, какие пакеты сделали это? Таким образом, вы заканчиваете тем, что пишете надежный протокол на вершине протокола TCP для имитации UDP - но постоянно устанавливаете новое соединение, когда оно падает. Взять хотя бы неэффективный.

    UDP + Остановись и жди ARW = хорошо

    UDP + протокол скользящего окна = лучше

    TCP + протокол скользящего окна с переподключением? = Бесполезная посуда. (ИМХО)

    Другой побочный эффект - многопоточные приложения. TCP хорошо работает для чатов, так как каждая комната может быть отдельной нитью. Комната может вместить 60-100 человек, и она работает нормально, поскольку в ветке комнаты есть сокеты для каждого участника.

    С другой стороны, UDP лучше всего обслуживать (IMO) одним потоком, но когда вы получаете пакет, вы должны проанализировать его, чтобы выяснить, от кого он поступил (через отправленную информацию или RemoteEndPoint), а затем передать эти данные в тема чата в поточно-ориентированном виде.

    На самом деле, вы должны сделать то же самое с TCP, но только при подключении.

    Последний пункт. Помните, что TCP просто выдаст ошибку и прервет соединение в любое время, но вы можете восстановить соединение примерно через 0,5 секунды и отправить ту же информацию. Самая странная вещь, с которой я когда-либо работал.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top