Pregunta

Tengo que escribir un sistema de multidifusión confiable y totalmente ordenado desde cero en Python. No puedo usar ninguna biblioteca externa. Se me permite usar un secuenciador central.

Parece que hay dos enfoques inmediatos:

  1. escriba un sistema eficiente, adjuntando una ID única a cada mensaje multidifusión, tener los números de secuencia de multidifusión del secuenciador para los ID de mensaje que recibe, y el envío de ida y vuelta de ACK y NACK.
  2. escriba un sistema de inundación ineficiente, donde cada multicaster simplemente re-envía cada mensaje que recibe una vez (a menos que haya sido enviado por ese multidifusor en particular)

Se me permite usar la segunda opción, y estoy dispuesto a hacerlo.

Actualmente estoy transmitiendo mensajes UDP (lo que parece ser la única opción), pero eso significa que algunos mensajes pueden perderse. Eso significa que tengo que ser capaz de identificar de manera única cada mensaje UDP enviado, de modo que pueda reenviarse de acuerdo con el # 2. ¿Debería realmente generar números únicos (por ejemplo, utilizando la dirección del remitente y un contador) y empaquetarlos en todos y cada uno de los mensajes UDP enviados? ¿Cómo voy a hacer eso? ¿Y cómo recibo un solo mensaje UDP en Python, y no un flujo de datos (es decir, socket.recv )?

¿Fue útil?

Solución

El enfoque de inundación puede empeorar una mala situación. Si los mensajes se eliminan debido a la alta carga de la red, hacer que cada nodo reenvíe todos los mensajes solo empeorará la situación.

El mejor enfoque a tomar depende de la naturaleza de los datos que está enviando. Por ejemplo:

  1. Datos multimedia: sin reintentos, un paquete descartado es un fotograma descartado, lo que no importará cuando llegue el siguiente fotograma de todos modos.
  2. Datos de período fijo: el nodo de destinatario mantiene un temporizador que se restablece cada vez que se recibe una actualización. Si el tiempo expira, solicita la actualización faltante del nodo maestro. Los reintentos pueden ser unidifusión al nodo solicitante.

Si ninguna de estas situaciones se aplica (todos los paquetes tienen que ser recibidos por todos los nodos, y la sincronización de los paquetes es impredecible, por lo que los destinatarios no pueden detectar los paquetes perdidos por sí mismos), sus opciones incluyen:

  1. ACK explícito de cada nodo para cada paquete. El remitente reintenta (unicast) cualquier paquete que no esté ACKed.
  2. El enfoque de cuadrícula basado en TCP, donde cada nodo se repite manualmente los paquetes recibidos a los nodos vecinos, confiando en los mecanismos TCP para garantizar la entrega.

Es posible que pueda confiar en que los destinatarios noten un paquete perdido al recibir uno con un número de secuencia posterior, pero esto requiere que el remitente mantenga el paquete hasta que se haya enviado al menos un paquete adicional. Requerir ACK positivos es más confiable (y demostrable).

Otros consejos

El enfoque que adopte dependerá en gran medida de la naturaleza de los datos que envíe, la escala de su red y la cantidad de datos que envíe. En particular, dependerá de la cantidad de destinos a los que esté conectado cada uno de sus nodos.

Si está esperando que esto se amplíe a una gran cantidad de destinos para cada nodo y una gran cantidad de datos, entonces puede encontrar que la sobrecarga de agregar un ACK / NAK a cada paquete es suficiente para limitar su rendimiento , particularmente cuando agregas retransmisiones en la mezcla.

Como Frank Szczerba ha dicho que los datos multimedia tienen la ventaja de poder recuperarse de paquetes perdidos. Si tiene algún control sobre los datos que está enviando, debe intentar diseñar las cargas útiles para minimizar la susceptibilidad a los paquetes caídos.

Si los datos que está enviando no pueden tolerar paquetes descartados y , está intentando escalar a una alta utilización de su red, tal vez udp no sea el mejor protocolo para usar. Implementar una serie de proxies TCP (donde cada nodo se retransmite, unicast, a todos los demás nodos conectados, similar a su idea de inundación) sería un mecanismo más confiable.

Con todo lo dicho, ¿ha considerado el uso de multicast verdadero para esta aplicación?


Acabo de ver la " tarea " etiqueta ... estas sugerencias pueden no ser apropiadas para un problema de tarea.

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