Pregunta

Estoy trabajando en una solución .net que se ejecuta completamente dentro de una única red.Cuando los usuarios realizan un cambio en el sistema, quiero lanzar un anuncio y que todos los demás lo escuchen y actúen en consecuencia.¿Hay alguna manera de que podamos transmitir mensajes como este (como UDP le permitirá hacerlo) manteniendo la entrega garantizada (como TCP)?

Esto es en una red pequeña (clientes de 30 años), si eso hiciera la diferencia.

¿Fue útil?

Solución

Casi todos los juegos necesitan las propiedades de reacción rápida (y, en menor medida, las propiedades sin conexión) de UDP y la confiabilidad de TCP.Lo que hacen es construir su propio protocolo confiable sobre UDP.Esto les da la capacidad de enviar paquetes a cualquier lugar y, opcionalmente, también hacerlos confiables.

El sistema de paquetes confiable suele ser un sistema de reintento hasta que se reconoce, más simple que TCP, pero existen protocolos que van mucho más allá de lo que TCP puede ofrecer.

Tu situación suena muy simple.Probablemente usted mismo podrá crear la solución más limpia: simplemente haga que cada cliente envíe una respuesta de "Te escuché" y haga que el servidor siga intentándolo hasta que lo consiga (o se rinda).

Si desea algo más, la mayoría de las bibliotecas de protocolos personalizados están en C++, por lo que no estoy seguro de qué utilidad le serán.Sin embargo, mis conocimientos aquí tienen algunos años; tal vez ya se hayan transferido algunos protocolos.Mmm...RakNet y enet son dos bibliotecas C/C++ que me vienen a la mente.

Otros consejos

Echa un vistazo a scpp que tiene una combinación de características tcp y udp.hay una ventana implementación disponible.

Podrías usar Desparramar para hacer comunicación grupal.

@epatel: apoyo la sugerencia de SCTP (voté a favor, pero aún no puedo comentar, así que hay cosas adicionales aquí).

SCTP tiene muchas funciones y flexibilidad excelentes.Puede subdividir su conexión en múltiples transmisiones y elegir la confiabilidad de cada una y si está ordenada o no.Alternativamente, con el Parcialmente confiable extensión, puede controlar la confiabilidad por mensaje.

La transmisión no es lo que quieres.Dado que podría haber, y probablemente habrá, dispositivos conectados a esta red a los que no les importe su mensaje, debería utilizar Multicast.A diferencia de los mensajes de difusión, que deben ser enviados y procesados ​​por cada cliente de la red, los mensajes de multidifusión se entregan sólo a los clientes interesados ​​(es decir, aquellos que tienen alguna intención de recibir este tipo particular de mensaje y actuar en consecuencia).

Si luego escala este sistema para que deba enrutarse a través de una red grande, la multidifusión puede escalar a eso, mientras que la transmisión no lo hará, por lo que obtendrá un beneficio de escalabilidad que podrá apreciar más adelante.Mientras tanto, elimina gastos innecesarios en conmutadores y otros dispositivos que no necesitan ver estos mensajes de "algo cambió".

Quizás quieras investigar RFC 3208 "Especificación del protocolo de transporte confiable PGM".

Aquí está el resumen:

La multidifusión general pragmática (PGM) es un transporte de multidifusión confiable
Protocolo para aplicaciones que requieren ordenadas o desordenadas,
entrega de datos de multidifusión sin duplicado de múltiples fuentes a
múltiples receptores.PGM garantiza que un receptor en el grupo reciba todos los paquetes de datos de las transmisiones y reparaciones, o puede detectar la pérdida de paquetes de datos irrecuperables.PGM se pretende específicamente como una solución viable para aplicaciones de multidifusión con requisitos básicos de confiabilidad.Su objetivo de diseño central es la simplicidad de operación con la debida consideración por la escalabilidad y la eficiencia de la red.

Podrías utilizar un agente de mensajes, como ActivoMQ.
Publique sus mensajes en un tema y haga que los clientes registren suscripciones duraderas al tema, para que no se pierdan ningún mensaje incluso si no están en línea.

Apache Activemq es un corredor de mensajes escrito en Java junto con un cliente JMS completo.Sin embargo, Apache ActivemQ está diseñado para comunicarse a través de varios protocolos, como Stomp y OpenWire, junto con el apoyo de varios clientes específicos de idiomas diferentes.

El soporte de la plataforma del cliente incluye c# y .net

Podría implementar su propio comportamiento similar a TCP en la capa de aplicación.

Entonces, por ejemplo, enviaría la transmisión UDP, pero luego esperaría una respuesta de cada host.Si no recibió una respuesta en X segundos, envíe otra y así sucesivamente hasta alcanzar algún tipo de umbral.Si se alcanza el umbral (es decir,el anfitrión no respondió en absoluto), luego informe un error.

Sin embargo, para hacer esto, necesitaría una lista predefinida de hosts de los cuales esperar las respuestas.

Cree un servidor TCP.Haga que cada cliente se conecte.En su protocolo TCP con los clientes, cree cada paquete con un prefijo de 2 bytes del tamaño total del siguiente mensaje.

Los clientes luego llaman read(max_size=2) en el socket para determinar el tamaño del siguiente mensaje, y luego read(max_size=s) para recoger el mensaje.

Obtienes mensajes confiables, ordenados y simples.No necesita un marco de mensajería para este.

tu definitivamente quiero investigar Multidifusión general pragmática:

Mientras que TCP usa ACK para reconocer grupos de paquetes enviados (algo que sería antieconómico sobre multidifusión), PGM utiliza el concepto de Reconocimientos Negativos (NAK).

Para más buceo G, el término que estás buscando es multidifusión confiable.Échale también un vistazo a TCP de múltiples rutas.

Lo que puedes hacer es que después de la transmisión tengas el clientela iniciar las conexiones tcp.De lo contrario, sólo tiene que mantener una lista de todos los clientes e iniciar usted mismo las conexiones con cada cliente.

Creo que hay tres opciones, a grandes rasgos:

  1. En lugar de transmitir UDP, puede crear una entidad (un hilo, proceso, servidor, servicio o lo que sea que exista en su solución) que mantenga una lista de suscriptores y les envíe mensajes UDP de unidifusión.
  2. Utilice multidifusión UDP, pero tendrá que escribir algún tipo de mecanismo que se encargue de una entrega confiable (es decir, reintentos, tiempos de espera, etc.).Esto también significa que debe obtener una respuesta de sus clientes.
  3. Si no le temen a los protocolos de transporte experimentales, puede buscar aquí para sugerencias.,

Debería echar un vistazo a la especificación Norm (multidifusión confiable orientada a NACK).Puedes encontrar información sobre Norma aquí.

El protocolo de norma está diseñado para proporcionar un transporte confiable de extremo a extremo de objetos de datos a granel o transmisiones sobre servicios genéricos de enrutamiento y reenvío de multidifusión IP.Norm utiliza un mecanismo selectivo de reconocimiento negativo (NACK) para la confiabilidad del transporte y ofrece mecanismos de protocolo adicionales para realizar sesiones de multidifusión confiables con coordinación limitada "a priori" entre los remitentes y receptores

Es algo muy conocido en el mundo militar.

Especificaciones normales.

Fuente de la norma

¿Por qué crear algo desde cero si puedes usar la biblioteca?¿Especialmente para un proyecto tan pequeño?

Intenta usar Emcaster que a su vez utiliza mensajería multicast confiable (PGM), está escrito en .NET y con el código fuente completo.Obtendrá un buen motor de publicación/subscripción con filtrado de temas disponible.O puedes aprender del código cómo hacerlo y basar tu propia extensión en él.

Creo que la característica más irritante de TCP en estos escenarios es la capacidad/forma de ordenar los paquetes entrantes en su orden original: el concepto de flujo.No se puede leer un byte hasta el byte anterior a su llegada.

Si puedes vivir sin él, tienes la oportunidad de tener tu protocolo, rápido y confiable, ¡pero no para ordenar paquetes!Es simplemente imposible gestionar ambos, porque no puedes ordenar tus bytes hasta que recibas otra copia de un paquete perdido, esa es la principal desventaja.

hacer una multidifusión RDP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top