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

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

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

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

Ответ 1

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

  • TCP - это надежная система общего назначения.
  • UDP + все, что является надежной надежной системой.

Специализированные вещи обычно лучше, чем вещи общего назначения для того, что они специализируются.

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

  • TCP основан на потоке.
  • UDP основан на сообщениях

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Ответ на мой взгляд на два слова: "Контроль перегрузок".

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

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

Ответ 5

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

Ответ 6

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

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

Есть одно предостережение, хотя я запускаю/разрабатываю многопользовательскую игру, и я использовал оба. UDP был намного лучше для моего приложения, но многие люди не могли играть с UDP. Маршрутизаторы и такие блокировали подключения. Поэтому я перешел на "надежный" TCP. Ну... Надежный? Я так не думаю. Вы отправляете пакет, никаких ошибок, вы отправляете другой, и он падает (исключение) в середине пакета. Теперь какие пакеты сделали это? Таким образом, вы в конечном итоге пишете надежный протокол ON TOP OF tcp, чтобы имитировать UDP, но постоянно устанавливайте новое соединение при его сбое. Возьмите о неэффективности.

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

Протокол UDP + Sliding Window = лучше

Протокол TCP + Sliding Window с повторным подключением? = Бесполезная посуда. (ИМХО)

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

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

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

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