2008-09-20 1 views
79

Если у вас есть ситуация, когда TCP-соединение потенциально слишком медленное, а соединение UDP потенциально слишком ненадежно, что вы используете? Существуют различные стандартные надежные протоколы UDP, какой у вас опыт?Что вы используете, когда вам нужен надежный UDP?

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

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

Я знаю, что часто TCP является правильным выбором, но список альтернатив часто полезен, помогая прийти к такому выводу. Такие вещи, как Enet, RUDP и т. Д., Которые построены на UDP, имеют разные плюсы и минусы, вы использовали их, каковы ваши впечатления?

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

+1

Этот вопрос, как представляется, не по теме, потому что это опрос для технологий – 2014-09-23 19:00:54

+0

Те, кто думает, что TCP лучше всего во всех случаях, читайте: http://en.wikipedia.org/wiki/Bandwidth-delay_product – UDPLover 2014-11-14 14:17:02

+0

В Википедии есть хорошая [таблица сравнения различных аспектов UDP, UDP Lite, TCP, Multipath TCP, SCTP, DCCP и RUDP] (http://en.wikipedia.org/wiki/Transport_layer#Comparison_of_transport_layer_protocols). SCTP поддерживает большинство функций в этом списке. – 2015-02-26 05:16:22

ответ

25

Трудно ответить на этот вопрос без дополнительной информации о домене проблемы. Например, какой объем данных вы используете? Как часто? Какова природа данных? (например, уникален ли он, один из данных? Или это поток выборочных данных? и т. д.) На какой платформе вы работаете? (например, desktop/server/embedded) Чтобы определить, что вы подразумеваете под «слишком медленным», какой сетевой носитель вы используете?

Но в целом (очень!) Общие термины Я думаю, вам придется очень тяжело бить tcp для скорости, если только вы не можете сделать некоторые твердые предположения о данных, которые вы пытаетесь отправить.

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

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

+3

Хорошо, я настрою вопрос. Меня больше интересуют все плюсы и минусы различных надежных протоколов UDP, а не ответ «использовать TCP»;) – 2008-09-20 09:22:01

+9

@ Андрей - очень легко бить TCP в двух случаях: (1) ваше приложение обладает большей надежностью чем «все данные, всегда в порядке, без дубликатов, без чрезмерной очереди». Или (2) вы используете многоадресную рассылку. Надежный UDP очень распространен для многоадресных сред. – Tom 2008-12-14 17:29:10

+4

Кроме того, TCP ужасно страдает при использовании через соединение WAN (проблемы с длинной перевозкой). Почему, просто. TCP использует окна, где пакеты в окне должны быть ack'd. Протоколы ACK страдают из-за латентности из-за расстояния по линии. Google: WAN TCP «скорость света» – Ajaxx 2009-02-27 03:41:11

19

ENET - http://enet.bespin.org/

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

ENET дает вам возможность отправлять несколько «каналов» данных, а для данных, отправленных ненадежностью, надежностью или последовательностью. Он также включает в себя вышеупомянутый peer to peer ping, который действует как живой.

26

Что относительно SCTP.Это стандартный протокол IETF (RFC 4960)

У него есть возможность коммутации, которая может помочь в скорости.

Обновление: a comparison between TCP and SCTP показывает, что характеристики сопоставимы, если не могут использоваться два интерфейса.

Обновление: a nice introductory article.

4

Если у вас есть ситуация, когда TCP-соединение потенциально слишком медленное, а соединение UDP потенциально слишком ненадежно, что вы используете? Существуют различные стандартные надежные протоколы UDP, какой у вас опыт?

Ключевое слово в вашем предложении - «потенциально». Я думаю, вам действительно нужно доказать себе, что TCP, по сути, слишком медленный для ваших нужд, если вам нужна надежность в вашем протоколе.

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

2

Считаете ли вы, что сжатие данных?

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

9

Как указывали другие, ваш вопрос очень общий, и что-то «быстрее», чем TCP, сильно зависит от типа приложения.

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

Существует простая промежуточная площадка. Nagle's algorithm - это часть TCP, которая помогает гарантировать, что отправитель не подавит приемник большого потока данных, что приведет к перегрузке и потере пакетов.

Если вам нужен надежный, порядок доставки ТСР, а также быстрый ответ UDP, и не нужно беспокоиться о перегруженности от отправки больших потоков данных, вы можете отключить алгоритм Нэгла:

int opt = -1; 
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt))) 
    printf("Error disabling Nagle's algorithm.\n"); 
9

RUDP - Reliable User Datagram Protocol

Это обеспечивает:

  • Квитирование полученных пакетов
  • Оконных и контроль перегрузки
  • Ретрансляция потерянных пакетов
  • Overbuffering (быстрее, чем в режиме реального время потоковых)

кажется немного более настраиваемой касаемо держать alives затем ENet, но это не дает вам, как много вариантов (т.е. все данные надежны и упорядочены не только битами, которые вы решаете). Это выглядит довольно прямолинейно.

14

У нас есть клиенты из оборонной промышленности, которые используют UDT (передача данных на основе UDP) (см. http://udt.sourceforge.net/) и очень довольны им. Я вижу, что у него есть дружественная лицензия BSD.

3

Может быть RFC 5405, «Рекомендации по использованию Unicast UDP для разработчиков приложений» будут вам полезны.

4

Протокол DCCP, стандартизованный в RFC 4340, «Протокол контроля перегрузки датаграмм» может быть тем, что вы ищете.

похоже implemented in Linux.

2

RUDP. Многие серверы сокетов для игр реализуют нечто подобное.

7

Любой, кто решил, что приведенного выше списка недостаточно и что они хотят разработать свой собственный надежный UDP, обязательно должны взглянуть на спецификацию Google QUIC, поскольку это охватывает множество сложных угловых случаев и потенциальных атак с отказами в обслуживании. Я еще не играл с реализацией этого, и вам может не понадобиться и не нужно все, что он предоставляет, но документ стоит прочитать, прежде чем приступать к новому «надежному» дизайну UDP.

Хорошая прыгающая точка для QUIC - here, над блоком Chromium.

В настоящее время проектный документ QUIC находится в here.

-2

Лучший способ достичь надежности с использованием UDP является создание надежности в самой прикладной программе (например, путем добавления механизмов подтверждения и повторной передачи)