Если у вас есть ситуация, когда TCP-соединение потенциально слишком медленное, а UDP-соединение потенциально слишком ненадежно, что вы используете? Существуют различные стандартные надежные протоколы UDP. Какой у вас опыт работы с ними?
Обсудите, пожалуйста, один протокол для каждого ответа, и если кто-то уже упомянул тот, который вы используете, рассмотрите возможность проголосовать за него и, при необходимости, использовать комментарий для уточнения.
Здесь меня интересуют различные варианты, из которых TCP находится на одном конце шкалы, а UDP - на другом. Доступны различные надежные параметры UDP, каждая из которых привносит некоторые элементы TCP в UDP.
Я знаю, что часто TCP является правильным выбором, но наличие списка альтернатив часто помогает прийти к такому выводу. Такие вещи, как Enet, RUDP и т. Д., Которые построены на UDP, имеют различные плюсы и минусы, вы использовали их, каков ваш опыт?
Во избежание сомнений, дополнительной информации нет, это гипотетический вопрос, и я надеялся, что он вызовет список ответов, в которых подробно описаны различные варианты и альтернативы, доступные тем, кто должен принять решение.
источник
Ответы:
На этот вопрос сложно ответить без дополнительной информации по предмету проблемы. Например, какой объем данных вы используете? Как часто? Каков характер данных? (например, это уникальные, одноразовые данные? Или это поток образцов данных? и т. д.) Для какой платформы вы разрабатываете? (например, настольный компьютер / сервер / встроенный) Чтобы определить, что вы имеете в виду под словом «слишком медленный», какой сетевой носитель вы используете?
Но в (очень!) Общих чертах я думаю, вам придется очень постараться, чтобы превзойти tcp по скорости, если только вы не сможете сделать какие-то жесткие предположения относительно данных, которые вы пытаетесь отправить.
Например, если данные, которые вы пытаетесь отправить, таковы, что вы можете допустить потерю одного пакета (например, данные с регулярной выборкой, где частота дискретизации во много раз выше, чем ширина полосы сигнала), вы, вероятно, можете пожертвовать некоторой надежностью передачи, убедившись, что вы можете обнаружить повреждение данных (например, с помощью хорошего CRC)
Но если вы не можете терпеть потерю одного пакета, вам придется начать внедрять методы обеспечения надежности, которые уже есть у tcp. И, не прикладывая разумного объема работы, вы можете обнаружить, что начинаете встраивать эти элементы в решение для пользовательского пространства со всеми присущими ему проблемами скорости.
источник
Насчет SCTP . Это стандартный протокол IETF (RFC 4960).
Он имеет возможность разбиения на части, что может помочь в увеличении скорости.
Обновление: сравнение TCP и SCTP показывает, что производительность сопоставима, если не могут использоваться два интерфейса.
Обновление: приятная вводная статья .
источник
ENET - http://enet.bespin.org/
Я работал с ENET как с надежным протоколом UDP и написал версию, совместимую с асинхронными сокетами, для моего клиента, который использует ее на своих серверах. Он работает довольно хорошо, но мне не нравятся накладные расходы, которые одноранговый ping добавляет к незанятым соединениям; когда у вас много соединений, регулярный пинг всех из них - это очень напряженная работа.
ENET дает вам возможность отправлять несколько «каналов» данных, при этом отправленные данные должны быть ненадежными, надежными или последовательными. Он также включает вышеупомянутый одноранговый эхо-запрос, который действует как проверка активности.
источник
У нас есть клиенты из оборонной промышленности, которые используют UDT (передача данных на основе UDP) (см. Http://udt.sourceforge.net/ ) и очень им довольны. Я вижу, что у него тоже есть дружественная лицензия BSD.
источник
RUDP - надежный протокол дейтаграмм пользователя
Это обеспечивает:
Кажется, что он немного более настраиваемый в отношении сохранения активности, чем ENet, но он не дает вам столько вариантов (т.е. все данные надежны и упорядочены, а не только биты, которые, по вашему мнению, должны быть). Это выглядит довольно легко реализовать.
источник
Как отмечали другие, ваш вопрос очень общий, и является ли что-то «быстрее», чем TCP, во многом зависит от типа приложения.
TCP обычно настолько быстр, насколько это возможно для надежной передачи данных от одного хоста к другому. Однако, если ваше приложение выполняет множество небольших всплесков трафика и ожидает ответов, UDP может быть более подходящим для минимизации задержки.
Есть легкая золотая середина. Алгоритм Нэгла - это часть TCP, которая помогает гарантировать, что отправитель не перегружает получателя большого потока данных, что приводит к перегрузке и потере пакетов.
Если вам нужна надежная и упорядоченная доставка TCP, а также быстрый ответ UDP, и вам не нужно беспокоиться о перегрузке из-за отправки больших потоков данных, вы можете отключить алгоритм Нэгла:
источник
Любой, кто решит, что приведенного выше списка недостаточно и что они хотят разработать свой СОБСТВЕННЫЙ надежный UDP, обязательно должен взглянуть на спецификацию Google QUIC, поскольку она охватывает множество сложных угловых случаев и потенциальные атаки отказа в обслуживании. Я еще не играл с реализацией этого, и вы можете не хотеть или нуждаться во всем, что он предоставляет, но документ стоит прочитать, прежде чем приступать к новой «надежной» конструкции UDP.
Хорошая отправная точка для QUIC находится здесь , в блоге Chromium.
Текущий проектный документ QUIC можно найти здесь .
источник
Ключевое слово в вашем предложении - «потенциально». Я думаю, вам действительно нужно доказать себе, что TCP на самом деле слишком медленный для ваших нужд, если вам нужна надежность в вашем протоколе.
Если вы хотите получить надежность от UDP, вы в основном собираетесь повторно реализовать некоторые функции TCP поверх UDP, что, вероятно, замедлит работу, чем просто использование TCP в первую очередь.
источник
Протокол DCCP, стандартизированный в RFC 4340 , «Протокол управления перегрузкой дейтаграмм» может быть тем, что вы ищете.
Вроде реализовано в Linux .
источник
Может быть RFC 5405 , «Руководство по использованию Unicast UDP для приложений дизайнеров» будет полезно для вас.
источник
Вы рассматривали возможность сжатия данных?
Как указано выше, нам не хватает информации о точном характере вашей проблемы, но сжатие данных для их передачи может помочь.
источник
RUDP . Многие серверы сокетов для игр реализуют нечто подобное.
источник
Лучший способ добиться надежности с помощью UDP - повысить надежность самой прикладной программы (например, путем добавления механизмов подтверждения и повторной передачи).
источник