Трансляция как UDP с надежностью TCP - PullRequest
20 голосов
/ 28 августа 2008

Я работаю над решением .net, которое работает полностью внутри одной сети. Когда пользователи вносят изменения в систему, я хочу запустить объявление, чтобы все остальные услышали его и действовали соответственно. Есть ли способ, которым мы можем транслировать подобные сообщения (как позволит вам UDP) при сохранении гарантированной доставки (как TCP)?

Это в небольшой сети (30 клиентов), если это будет иметь значение.

Ответы [ 16 ]

15 голосов
/ 28 августа 2008

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

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

Ваша ситуация звучит очень просто. Вы, вероятно, сможете сделать самое чистое решение самостоятельно - просто сделайте так, чтобы каждый клиент отправлял ответ «Я слышал вас», и сервер продолжал пытаться, пока не получит его (или не сдастся).

Если вы хотите чего-то большего, большинство пользовательских библиотек протоколов находятся на C ++, поэтому я не уверен, насколько они будут вам полезны. Тем не менее, мои знания здесь уже несколько лет - возможно, некоторые протоколы уже перенесены. Хм ... RakNet и enet - две библиотеки C / C ++, которые приходят на ум.

10 голосов
/ 28 августа 2008

Взгляните на sctp , который имеет комбинацию функций tcp и udp. Доступна реализация windows .

7 голосов
/ 28 августа 2008

Вы можете использовать Spread для групповой связи.

3 голосов
/ 11 сентября 2008

@ epatel - я поддерживаю предложение SCTP (я проголосовал, но пока не могу комментировать, поэтому дополнительные материалы здесь).

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

2 голосов
/ 20 января 2010

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

Apache ActiveMQ - брокер сообщений написано на Java вместе с полным JMS клиент. Однако Apache ActiveMQ является предназначен для общения по номеру протоколов, таких как Stomp и OpenWire вместе с поддержкой количество различных языков клиенты.

Поддержка клиентской платформы включает в себя c # и .net

2 голосов
/ 23 ноября 2008

Возможно, вы захотите ознакомиться с RFC 3208 «Спецификация надежного транспортного протокола PGM».

Вот реферат:

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

2 голосов
/ 17 сентября 2008

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

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

1 голос
/ 12 февраля 2015

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

В то время как TCP использует ACK для подтверждения групп отправленных пакетов (что было бы неэкономичным по сравнению с многоадресной передачей ), PGM использует концепцию отрицательных подтверждений (NAK).

Для дальнейшего G-дайвинг , термин, который вы ищете, это надежная многоадресная рассылка . Также взгляните на Многолучевой TCP .

1 голос
/ 20 января 2010

Создать TCP-сервер. Пусть каждый клиент подключится. В вашем протоколе TCP с клиентами создайте каждый пакет с 2-байтовым префиксом общего размера следующего сообщения.

Клиенты затем вызывают read(max_size=2) в сокете, чтобы определить размер следующего сообщения, а затем read(max_size=s), чтобы собрать сообщение.

Вы получаете надежные, упорядоченные сообщения, просто. Для этого вам не нужна система обмена сообщениями.

1 голос
/ 28 августа 2008

Вы можете реализовать свое собственное TCP-подобное поведение на уровне приложений.

Так, например, вы отправляете широковещательную рассылку UDP, но затем ожидаете ответного ответа от каждого хоста. Если вы не получили ответ в течение X секунд, отправьте другой и так далее, пока не достигнете какого-либо порога. Если пороговое значение достигнуто (то есть хост не отвечает вообще), сообщите об ошибке.

Чтобы сделать это, вам понадобится предварительно определенный список хостов, чтобы ожидать ответа от.

...