Les paquets Winsock UDP sont-ils supprimés?
Nous avons un client/serveur de système de communication sur le port UDP le programme d'installation de windows. Le problème auquel nous sommes confrontés est que lorsque le débit augmente, les paquets sont supprimées. Nous pensons que cela est dû à l'UDP tampon de réception qui est constamment interrogé causant la mémoire tampon pour être bloqué et l'abandon de toute les paquets entrants. Est-il possible que la lecture de ce tampon sera la cause de la réception des paquets être abandonné? Si oui, quelles sont les options pour corriger cela? Le système est écrit en C. s'il vous Plaît laissez-moi savoir si cela est trop vague et je peux essayer de donner plus d'infos. Merci!
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
La valeur par défaut socket taille de la mémoire tampon dans Windows sockets est de 8 ko, ou 8192 octets. Utiliser le setsockopt fonction de Windows pour augmenter la taille de la mémoire tampon (reportez-vous à la SO_RCVBUF option).
Mais au-delà, l'augmentation de la taille de votre tampon de réception ne fera que retarder le temps jusqu'à ce que les paquets obtenir chuté à nouveau si vous ne lisez pas les paquets assez rapide.
Vous voulez généralement que deux threads pour ce genre de situation.
Le premier thread existe uniquement au service de la prise de courant. En d'autres termes, le thread seul but est de lire un paquet de la prise, l'ajouter à une sorte de bien-synchronisé structure de données partagées, signal qu'un paquet a été reçu, puis de lire le prochain paquet.
Le deuxième thread existe pour traiter les paquets reçus. Elle est inactive jusqu'à ce que le premier thread signaux d'un paquet a été reçu. Il tire alors le paquet de l'correctement synchronisé structure de données partagées et des processus. Elle attend ensuite pour être signalé de nouveau.
Comme un test, essayez de court-circuit le traitement complet de vos paquets et il suffit d'écrire un message sur la console (ou un fichier) chaque fois qu'un paquet a été reçu. Si vous pouvez réussir à le faire sans supprimer les paquets, puis la rupture de votre fonctionnalité dans une "réception" du fil et un "traitement" thread va aider.
Oui, la pile est autorisé à déposer des paquets silencieuse, même lorsque ses tampons trop plein. Cela fait partie de la nature de l'UDP, l'un des bits de la fiabilité que vous donnez quand vous passez de TCP. Vous pouvez soit réinventer TCP — mal — en ajoutant logique de nouvelle tentative, paquets d'accusé de réception, et de telle, ou vous pouvez passer à quelque chose comme SCTP.
Il existe des moyens pour augmenter la pile de la taille de la mémoire tampon, mais c'est largement à côté de la question. Si vous n'êtes pas lire assez rapidement pour garder de l'espace tampon d'ores et déjà disponibles, faisant de la mémoire tampon de taille est seulement de mettre le temps qu'il vous faut à manquer d'espace tampon. La bonne solution est de faire de grands tampons à l'intérieur de votre propre code, et de transférer des données à partir de la pile de tampons dans votre programme tampon ASAP, où il peut s'attendre à être traitée pour être arbitrairement long temps.
Les paquets peuvent être supprimées si elles arrivez plus vite que vous le lisez.
Une option consiste à modifier le protocole de réseau: utilisation de TCP, ou de mettre en œuvre certaines d'accusé de réception de + de "contrôle de flux" en utilisant UDP.
Sinon vous avez besoin de voir pourquoi vous n'êtes pas la lecture rapide/assez souvent.
Si le CPU est à 100% utilitized ensuite, vous devez faire moins de travail par paquet, ou d'obtenir un CPU plus rapide (ou utiliser le multithreading et de plus de Processeurs si vous ne l'êtes pas déjà).
Si le CPU n'est pas à 100%, alors peut-être ce qui se passe est:
Un remède pour ce serait de changer l'enfilage.
Une autre possibilité est de faire plusieurs lectures simultanées de la prise de courant (chacune de vos lectures fournit un tampon dans lequel un paquet UDP peut être reçu).
Une autre possibilité est de voir si il y a un (O/S) configuration de l'option d'augmenter le nombre de paquets UDP qui de la pile réseau est prêt à tampon jusqu'à ce que vous essayez de les lire.
Première étape, d'augmenter le récepteur taille de la mémoire tampon, Windows assez bien accorde à tous la taille raisonnable des demandes.
Si cela ne fonctionne pas, votre consommer code semble avoir assez lente domaines. Je voudrais utiliser le filetage, par exemple, avec les pthreads et d'utiliser un producteur schéma de consommation pour mettre le datagramme entrant dans une file d'attente sur un autre thread, puis consommer à partir de là, de sorte que votre recevoir des appels à ne pas bloquer et de le tampon n'est pas plein
3ème étape, modifier votre niveau d'application du protocole, pour permettre groupées des paquets et des lots de paquets à l'expéditeur pour réduire l'entête UDP frais généraux à partir de l'envoi d'un grand nombre de petits paquets.
4ème étape vérifier votre réseau d'engins, interrupteurs, etc. pouvez vous donner de sortie détaillé sur leurs statistiques de fréquentation, les dépassements de la mémoire tampon, etc. - si c'est dans la question d'obtenir plus rapidement des interrupteurs ou éventuellement basculer un défectueux d'un
... juste pour info, je suis en cours d'exécution UDP multicast trafic sur notre backend en permanence à avg. ~30Mbit/s avec des pointes à un 70Mbit/s et mon taux d'abandon est nu néant
Pas sûr à ce sujet, mais sur windows, il n'est pas possible d'interroger la prise et provoquer un paquet à la baisse. Windows recueille les paquets séparément à partir de votre bureau de vote et il ne cause pas de gouttes.
je suis en supposant que votre utilisation de select() pour interroger le socket ? Autant que je sache , ne peut pas provoquer une chute.
Les paquets peuvent être perdus en raison d'une augmentation sans rapport avec le trafic réseau n'importe où le long de la route, ou des tampons de réception. Pour atténuer ce problème, vous pouvez augmenter la taille du tampon de réception dans Winsock.
Essentiellement, UDP est un protocole non fiable dans le sens que la livraison de paquets n'est pas garantie et aucune erreur n'est renvoyée à l'expéditeur sur l'échec de livraison. Si vous êtes inquiet au sujet de la perte de paquets, il serait préférable de mettre en œuvre d'accusé de réception de paquets dans votre protocole de communication, ou de le porter à un plus fiable protocole comme TCP. Il n'y a pas vraiment de moyens fiables pour prévenir UDP perte de paquets.