TCP многоадресная и многопоточность - PullRequest
4 голосов
/ 16 марта 2010

Мне нужно найти клиентов, которые могут надежно передавать данные другим клиентам. Это означает, что я буду использовать TCP для надежного соединения между клиентами в многоадресной группе. Разве это не соответствует n ^ 2 количеству соединений? Это кажется немного глупым для меня. Не будет / не должен ли быть способ облегчить многоадресную рассылку с надежностью?

РЕДАКТИРОВАТЬ: UNIX / C

РЕДАКТИРОВАТЬ: я не уточнил, как многопоточность входит в игру. но если бы я должен был открыть n ^ 2 соединений, я подумал, что я бы многопоточность, и это даже сложнее, чем хотелось бы.

Ответы [ 7 ]

4 голосов
/ 18 марта 2010

Существует несколько надежных многоадресных решений.

Я пробовал первые два.

Норма проста, работает как стандартная многоадресная рассылка udp, но включает в себя nacks ... отлично, если вам не нужно больше. Есть некоторые реализации, которые также поддерживают адаптацию полосы пропускания и другие улучшения.

DDS - это шаг вперед. Это действительно здорово (я знаю реализацию RTI, и она прекрасно работает) и имеет много возможностей, а также очень хороший дизайн. Он основан на надежности и отказоустойчивости и имеет открытую реализацию .

Кстати, как минимум DDS и NORM не требуют n ^ 2 соединений. Они работают как многоадресная рассылка.

2 голосов
/ 18 марта 2010

Вам нужно взглянуть на 0MQ , которая является высокоскоростной системой обмена сообщениями, которая имеет одну из своих способностей - надежную многоадресную рассылку с использованием Pragmatic General Multicast (PGM) с использованием OpenPGM .

Недавно на lwn.net была статья об этом:

0MQ: новый подход к обмену сообщениями

2 голосов
/ 16 марта 2010

В зависимости от вашей целевой платформы ....

Вы можете взглянуть на Прагматическая общая многоадресная рассылка . Это, как я понимаю, то, что используют Microsoft MSMQ и Tibco Rendezvous, и к ним можно получить доступ через Winsock (см .: http://msdn.microsoft.com/en-us/library/ms740125(VS.85).aspx).

1 голос
/ 16 марта 2010

многоадресная рассылка и TCP являются взаимоисключающими.

Внедрение надежной доставки через UDP - это просто. Никто не делает это с 1980-х годов, и это невозможно сделать так же хорошо, как любой дешевый стек TCP, с точки зрения производительности и BW. Исправление: иногда это делается вручную, но только на экзотических транспортных средствах, таких как чрезвычайно длинные или узкие трубы.

N ^ 2 соединения не очень глупые. Соединение с поддержкой активности 1 Гц стоит недорого. Сколько стоит трафик. Это то, на чем должен сосредоточиться ваш дизайн.

0 голосов
/ 16 марта 2010

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

Если вам действительно нужна сеть, вам придется иметь дело либо с большим количеством соединений, либо с обеспечением доставки самостоятельно. Прежде чем идти по этому пути, убедитесь, что все ваши требования.

0 голосов
/ 16 марта 2010

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

Поскольку мы никогда не могли надежно гарантировать «достаточно быстрые» клиенты, мы внедрили наш собственный протокол надежности поверх многоадресной рассылки UDP. Реализация не является полностью универсальной, когда дело доходит до динамического соединения / разъединения, но она может работать для вас. Вы можете найти реализацию здесь:

http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/lib/net/rspConnection.h?view=markup http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/lib/net/rspConnection.cpp?view=markup

0 голосов
/ 16 марта 2010

Уверен, что есть более эффективный способ - вы продолжаете использовать UDB, и надежно пересылаете отправку самостоятельно. Не тривиально, хотя. Но, по крайней мере, вам нужно только сохранить отправленные пакеты ОДИН РАЗ на сайте отправителя.

...