Надежная реализация UDP - PullRequest
       53

Надежная реализация UDP

4 голосов
/ 27 января 2012

Мне нужна реализация UDP, которая отвечает следующим критериям:

  • Доступно в Linux и Mac (имеют значение только последние версии)
  • Используется из C ++
  • Заказывает пакеты
  • Гарантирует доставку пакетов
  • Не ориентируется на соединение (например, UDP)

ПРИМЕЧАНИЕ. Я НЕ хочу использовать TCP для этого.ПРИМЕЧАНИЕ. Он может быть реализован любым API-интерфейсом для сокетов, если он доступен на двух платформах и доступен для C ++.

РЕДАКТИРОВАТЬ: я рассмотрел UDT, RUDP и SCTP.Это, кажется, основные претенденты.Есть мысли?

РЕДАКТИРОВАТЬ: UDT , кажется, то, что я ищу.Является ли тот факт, что он реализован в пользовательском пространстве над ядрами UDP, огромной проблемой производительности?Или скорости все равно будут выше, чем у TCP / STCP?

РЕДАКТИРОВАТЬ (15.02.12): я предложил решение, использующее TCP и центральный сервер перенаправления.Система позволяет одному клиенту отправлять данные на сервер через постоянно открываемое TCP-соединение, которое он передает правому другому клиенту по TCP-соединению сервера второму.

Ответы [ 6 ]

2 голосов
/ 29 октября 2015

Это старый вопрос, но я видел, что никто ничего не ответил об UDT.У меня есть некоторый опыт с этим, поэтому я могу поделиться им.

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

С точки зрения производительности, я не заметил никаких проблем.На самом деле, он имеет несколько алгоритмов для максимизации пропускной способности, и вы можете получить довольно удивительные результаты (я получил> 90 МБ / с в локальной сети Ethernet 100 МБ / с).Он отлично работает и для каналов с медленной / высокой задержкой.

Конечно, он не идеален, и некоторые сценарии ошибок обрабатываются не так, как хотелось бы, но, по большей части, вы просто подключаетеэто в "и вы хорошо.

2 голосов
/ 27 января 2012

Я полагаю, что вы хотите SCTP .

1 голос
/ 01 февраля 2012

Отказ от ответственности: я работаю в компании, которая производит коммерческие инструменты для передачи данных UDP.

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

  • Какие данные вы переносите?Файлы, программа генерирует потоки данных, короткие сообщения?Килобайты, мегабайты, гигабайты или терабайты?Большинство UDP-решений ориентированы на файлы или большие потоки данных.Немногие также оптимизированы для обмена сообщениями небольшого или общего назначения.

  • Какая топология вашей сети?Клиент-сервер, одноранговый, сервер-сервер?Это повлияет на проблемы брандмауэра и может повлиять на стоимость коммерческих решений.

  • В каком сетевом окружении вы планируете развертывать?Некоторые транспортные протоколы на основе UDP подходят только для очень быстрых сетей или сетей, в которых конечные пользователи могут настраивать правильную целевую скорость.Другие оптимизированы для низкой скорости и высокой задержки (например, спутник).Некоторые хорошо работают в любой среде.

  • Сколько денег вы готовы потратить?Существуют как открытые, так и коммерческие решения.Цены на коммерческие решения сильно различаются и могут зависеть от некоторых из перечисленных факторов.

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

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

0 голосов
/ 21 июля 2012

Эта серия учебников может вас заинтересовать.

Редактировать: Ссылки для следующего урока находятся внизу страницы, а пост Надежного UDP на самом деле является третьим, но первое и второе тоже хорошие чтения.

0 голосов
/ 27 января 2012

Звучит так, будто вы просите что-то вроде RUDP .

В любом случае, это чрезвычайно сложно реализовать. Я не знаю ничего, что делает

Я также хотел бы подчеркнуть тот факт, что если это не сделано в ядре, производительность резко падает. Обычно такие вещи, как повторная сборка пакетов и т. Д., В приложении либо требуют гораздо больше буферизации, либо генерируют гораздо больше повторных попыток, если скорости передачи данных достаточно высоки (что может быть довольно скромным объемом трафика).

0 голосов
/ 27 января 2012

Возможно, вы ищете RTI-DDS .Есть C ++ API и QoS, который гарантирует доставку по UDP.Не уверен насчет поддержки Mac, но вы можете спросить их по адресу support@rti.com.

...