2009-06-19 14 views
3

En lisant l'article this, j'ai un doute. J'ai compris que tout en transférant de petites données, l'algorithme de Nagle est activé par défaut qui fusionne les petits paquets. Cela entraîne la mise en cache de certaines données avant la transmission. Je crois que Winsock Kernel Buffer est l'endroit où la mise en cache se produit. Corrigez-moi si je me trompe. Cela signifie-t-il que si le tampon du noyau Winsock est mis à zéro avec l'option SO_SNDBUF, l'algorithme de Nagle sera-t-il désactivé?Doute concernant Winsock Kernel Buffer et algorithme Nagle

Sinon, où WINSOCK cache-t-il les petites données?

Répondre

5

L'article KB vous vous référez donne vos réponses de cette manière ...

Pour optimiser les performances à la couche d'application, copies Winsock tampons de données de l'application envoient des appels vers un tampon du noyau Winsock. Ensuite, la pile utilise ses propres heuristiques (comme l'algorithme de Nagle) pour déterminer quand mettre le paquet sur le réseau.

et, la mise en TCP_NODELAY ou SO_SNDBUF = 0 permet de désactiver l'algorithme de Nagle comme ci-dessous,

L'option de socket TCP_NODELAY est appliqué pour désactiver l'algorithme de Nagle de sorte que les petits paquets de données sont délivrés à la hôte distant sans délai.

Vous pouvez modifier la quantité de mémoire tampon du noyau Winsock allouée au socket à l'aide de l'option SO_SNDBUF (8K par défaut). Si nécessaire, Winsock peut tamponner significativement plus que la taille de la mémoire tampon SO_SNDBUF. Dans la plupart des cas, l'achèvement d'envoi dans l'application indique seulement que le tampon de données dans un appel d'envoi d'application est copié dans le tampon du noyau Winsock et n'indique pas que les données ont atteint le support réseau. La seule exception est lorsque vous désactivez la mise en mémoire tampon Winsock en définissant SO_SNDBUF sur 0.


La lecture de votre commentaire ci-dessous, je me rends compte que vous pourriez être confus parce que la mise en TCP_NODELAY ou le réglage SO_SNDBUF = 0 les deux semblent faire la même chose. Si tel est le cas, veuillez noter que Nagle est applicable uniquement sur les flux TCP (qui segmentent les données en paquets), alors que SO_SNDBUF est également applicable aux sockets UDP.

La définition de SO_SNDBUF à zéro arrête explicitement toute mise en mémoire tampon de sortie et une tentative d'envoi immédiat est tentée pour chaque 'écriture' sur le socket (au moins dans les implémentations de socket normales).

La définition de TCP_NODELAY arrêtera explicitement l'algorithme Nagle sur les sockets TCP, bien que le tampon d'envoi puisse être disponible et utilisé pour un envoi différé (après que le succès de l'envoi ait été reconnu à l'application).

+0

Ce n'est toujours pas clair. Il dit utiliser TCP_NODELAY pour le désactiver. La dernière instruction en surbrillance indique que la notification d'achèvement de l'envoi est retardée jusqu'à ce que les données soient réellement envoyées. Pas à propos de la désactivation de l'algorithme de Nagle. – Canopus

+0

La 'seule exception' lorsqu'une fin d'envoi indique également que les données ont atteint le support réseau est lorsque SO_SNDBUF est défini sur 0. Cela signifie que dans l'application, si vous souhaitez confirmer la livraison des données au réseau, vous pouvez également définir SO_SNDBUF à 0. Cela va forcer l'envoi immédiat à câbler. – nik

0

SO_SNDBUF mis à 0 ne force PAS un envoi immédiat sur le réseau.

0

La définition de SO_SNDBUF sur zéro et non désactive implicitement nagle; l'état nagle maintenu par le WSK est indépendant de l'emplacement du tampon. C'est votre responsabilité de garder les tampons que vous postez valides jusqu'à ce que le transport le consomme.