Select the product you need help with
Problèmes de conception - envoi des segments de données de petite taille via TCP avec WinsockNuméro d'article: 214397 - Voir les produits auxquels s'applique cet article SommaireRésuméLorsque vous avez besoin d'envoyer des paquets de données de petite taille sur TCP, la conception de votre application Winsock est particulièrement important. Une conception qui ne prend pas en compte l'interaction de d'accusé de réception différé, l'algorithme Nagle et mise en mémoire tampon de Winsock affecte considérablement la performance. Cet article aborde ces problèmes, à l'aide de deux études de cas et dérive une série de recommandations pour l'envoi de paquets de données de petite taille efficacement à partir d'une application Winsock. Plus d'informationsArrière-planLorsque la pile Microsoft TCP reçoit un paquet de données, un minuteur de délai de 200 ms s'éteint. Lorsqu'un accusé de réception est envoyé par la suite, le minuteur de délai est réinitialisé et lancera un autre délai de 200 ms lorsque le paquet de données suivant est reçu. Pour accroître l'efficacité dans Internet et les applications intranet, pile Microsoft TCP utilise les critères suivants pour décider à quel moment envoyer un accusé de réception sur les paquets de données reçues :
Winsock utilise les règles suivantes pour indiquer un achèvement d'envoi à l'application (selon la façon dont l'envoi est appelé, la notification de fin peut être la fonction de renvoi d'un appel bloquant, un événement de signalisation ou en appelant une fonction de notification et ainsi de suite) :
Etude de cas 1Vue d'ensemble :Un client Winsock TCP doit envoyer des 10000 enregistrements à un serveur de ports TCP Winsock pour stocker dans une base de données. La taille des enregistrements varie de 20 octets à 100 octets de long. Pour simplifier la logique d'application, la conception est la suivante :
Performances :Au cours des tests, le développeur trouve que le client peut envoyer seulement cinq enregistrements par seconde au serveur. Les enregistrements de 10 000 total, maximum K 976 octets de données (10000 * 100 / 1 024), prend plus d'une demi-heure à envoyer au serveur.Analyse :Étant donné que le client ne définit pas l'option TCP_NODELAY, l'algorithme Nagle force la pile TCP pour attendre un accusé de réception avant qu'il puisse envoyer un autre paquet sur le réseau. Toutefois, le client a désactivé la mise en tampon Winsock en définissant l'option SO_SNDBUF à 0. Par conséquent, le 10000 envoi appelle doit être envoyé et ACK'ed individuellement. Chaque ACK est 200-ms différées car les événements suivants se produisent sur la pile TCP du serveur :
Comment faire pour améliorer :Il existe deux problèmes grâce à cette conception. Tout d'abord, il est le problème de minuteur de délai. Le client doit être en mesure d'envoyer deux paquets au serveur au sein de ms. 200 dans la mesure où le client utilise l'algorithme Nagle par défaut, il doit simplement utiliser le Winsock par défaut mise en mémoire tampon et pas la valeur 0 SO_SNDBUF. Une fois la pile TCP a fusionné une mémoire tampon plus grande que le MTU (maximum transmission unit), un paquet en taille réelle est envoyé immédiatement sans attendre l'accusé de réception à partir d'ordinateur hôte distant.Deuxièmement, cette conception appelle unique envoi pour chaque enregistrement de cette petite taille. Envoi de cette petite d'une taille n'est pas très efficace. Dans ce cas, le développeur pourriez chaque enregistrement à 100 octets du pavé et envoyer des 80 enregistrements à la fois à partir d'un client envoient l'appel. Pour laisser le serveur à savoir le nombre d'enregistrements sera envoyé au total, le client souhaiterez débutent la communication avec un en-tête en taille réelle correctif contenant le nombre d'enregistrements à suivre. Etude de cas 2Vue d'ensemble :Une application client Winsock TCP ouvre deux connexions avec une application de serveur de ports TCP Winsock fournir un service de cotations boursières. La première connexion est utilisée comme un canal de commande pour envoyer le symbole de cotation au serveur. La deuxième connexion est utilisée comme un canal de données pour recevoir la cotation boursière. Une fois les deux connexions établies, le client envoie un symbole boursier au serveur via le canal de commande et attend la cotation boursière revenir sur le canal de données. Il envoie la demande de symbole de cotation suivante au serveur uniquement après réception de la première cotation. Le client et le serveur ne définissez pas l'option SO_SNDBUF et TCP_NODELAY.Performances :Au cours des tests, le développeur trouve que le client peut obtenir uniquement les cinq Cotations par seconde.Analyse :Cette conception permet uniquement une seule demande de cotation boursière en suspens à la fois. Le premier symbole de cotation est envoyé au serveur via le canal de commande (connexion) et une réponse est envoyée immédiatement à partir du serveur au client sur le canal de données (connexion). Ensuite, le client envoie immédiatement la deuxième demande symbole boursier et l'envoi immédiat que le tampon de demande dans l'appel d'envoi est copié dans la mémoire tampon du noyau Winsock. Toutefois, la pile TCP client ne peut pas envoyer la demande à partir de sa mémoire tampon du noyau immédiatement, car la première envoyer via le canal de commande is not acknowledged encore. Après que 200-ms retarder l'horloge au canal de commande serveur expire, l'accusé de réception pour la première demande de symbole est renvoyée au client. Ensuite, la deuxième demande de devis est correctement envoyée au serveur après être retardée pour 200-ms. que le devis pour le deuxième symbole de cotation revient immédiatement via le canal de données car, à ce stade, le minuteur de délai au niveau du canal de données client a expiré. Réception d'un ACK pour la réponse de devis précédente par le serveur. (N'oubliez pas que le client pourrait ne pas envoyer une deuxième demande de cotation boursière pour 200-ms, donc ce qui laisse le temps pour le minuteur de délai sur le client pour expirer et à envoyer un accusé de réception au serveur). Par conséquent, le client obtient la deuxième réponse de devis et peut émettre une autre demande de devis, qui est soumise à une même cycle.Comment faire pour améliorer :La conception de la connexion de deux (canal) est ici inutile. Si vous utilisez une seule connexion pour la demande de cotation boursière et la réponse, l'accusé de réception pour la demande de devis peut être piggybacked sur la réponse des devis et revenez immédiatement. Pour encore améliorer les performances, le client pourrait "multiplex" plusieurs demandes de cotation boursière dans un appel envoi au serveur et le serveur peut également «multiplex"plusieurs réponses de devis en un seul appel d'envoi au client. Si la conception de deux canaux unidirectionnels est vraiment nécessaire pour une raison quelconque, les deux côtés doivent définissez l'option TCP_NODELAY afin que les petits paquets puissent être envoyées immédiatement sans avoir à attendre un accusé de réception du paquet précédent.Recommandations :Ces deux études de cas sont fabriqués, mais elles permettent de montrer certains scénarios pires. Lorsque vous concevez une application qui implique de nombreuses données petit segment envoie et recvs, vous devez prendre en compte les instructions suivantes :
RéférencesPour plus d'informations sur les retenues différées d'accusé de réception et l'algorithme Nagle, veuillez consulter le texte suivant : Braden, r. [1989], RFC 1122, Requirements for Internet Hosts--Communication Layers, Internet Engineering Task Force. PropriétésNuméro d'article: 214397 - Dernière mise à jour: lundi 11 juillet 2005 - Version: 3.1 Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
Traduction automatique IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique. La version anglaise de cet article est la suivante: 214397
(http://support.microsoft.com/kb/214397/en-us/
)
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT. | Traductions disponibles |




Retour au début








