2010-01-09 3 views
2

Un serveur de flux de données reçoit des flux de différents clients au moyen de UDP, car les clients pompent les données si rapidement, le tampon de réception est très facilement plein si le serveur passe du temps sur le traitement des données reçues, doncComment assurer un serveur UDP ne perd pas les données entrantes?

  1. aura-t-il aider que si le serveur d'alimentation multidestinataire seulement les caractéristiques qu'il a reçues aux autres serveurs sur le réseau local qui le serveur de flux de données a une seconde carte réseau se connecte à ? Chacun des autres serveurs ne prend en charge que les données à traiter et laisse les autres données aux autres serveurs .
  2. Si les données entrantes arrive encore trop vite, est-il une stratégie pour assurer de ne pas perdre de données?

Merci.

Répondre

1

Certaines stratégies pour essayer comprennent

  • assurer que le processus de réception fait très peu dans le thread de réception, il suffit de lire les données et afficher une file d'attente interne pour le traitement sur un autre thread - ce qui devrait réduire la probabilité de réception du tampon de remplissage
  • Incluez un numéro de séquence dans votre message. Si un destinataire remarque un message manqué, il peut le demander à l'éditeur. Cette demande sera très coûteuse mais rendra le cas général très rapide. Cela suppose que l'éditeur conserve une quantité raisonnable de messages publiés en mémoire (pour permettre les demandes de re) ou les persiste quelque part pour faire face à la relecture.
0

bien vous devez écrire votre propre méthode "ack". Le client renvoie le bloc jusqu'à ce que le serveur le reçoive.

+0

Et très bientôt, vous aurez une version cassée de TCP. Utilisez TCP ou acceptez les limites UDP. – bortzmeyer

1
  1. Si je comprends ce que vous demandez alors non, parce que vous recevoir des données d'envoyer ensuite à nouveau, doublant la bande passante que vous utilisez, donc ce serait probablement pas aider.

  2. La meilleure stratégie pour garantir qu'aucune perte de données serait d'utiliser TCP sur UDP. Cependant, si vous devez utiliser UDP, vous pouvez écrire un code qui numérote chaque paquet envoyé (afin que vous puissiez vous assurer qu'ils arrivent dans l'ordre), et ajouter plus de fonctionnalités qui permettent au serveur de demander un paquet manquant, par ex. 1, 2, 3, 4, mais Receiver reçoit seulement 1, 2, 4, puis demande de nouveau 3.

+0

Merci pour vos commentaires.Mais si les clients (données entrantes) et les autres serveurs sont dans deux réseaux séparés (le serveur de flux de données a deux NIC, l'un utilisé pour recevoir des flux entrants, l'autre utilisé pour transférer des données), le la bande passante ne sera pas un problème? – murphytalk

1

UDP peut être considéré comme signifiant 'Unreliable Datagram Protocol'. Donc, cela explique votre problème immédiatement: vous voulez la fiabilité, un service que le protocole sous-jacent ne fournit pas. Probablement, vous voulez également un contrôle de congestion, car le manque de tampons réseau est une source d'encombrement tout autant que le manque de bande passante.

La solution est d'utiliser autre chose que UDP, ou pour ajouter la fiabilité et le contrôle de congestion sur le dessus de UDP; accusés de réception et limitation de débit, essentiellement.

Les remplacements possibles pour UDP incluent TCP et SCTP. SCTP serait bon car il a un mode datagramme, donc vous n'avez pas besoin de convertir le protocole pour travailler avec des flux.Voir ici: http://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol

0

Si vous avez besoin de fiabilité avec UDP, alors vous devez construire votre propre par-dessus. Comme d'autres l'ont dit, vous avez besoin d'une méthode d'envoi d'un ACK d'un pair à un autre pour dire à l'autre que les données sont arrivées en toute sécurité. L'autre homologue peut alors renvoyer sélectivement des datagrammes jusqu'à ce qu'ils aient été ACKed.

J'ai une question ouverte ici: What do you use when you need reliable UDP? qui recueille diverses options pour ajouter de la fiabilité aux transferts basés sur UDP.

Questions connexes