Doute concernant l’algorithme Winsock Kernel Buffer et Nagle

En lisant cet article, 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, ce qui fusionne les petits paquets. Cela se traduit par la mise en cache de certaines données avant leur transmission. Je crois que Winsock Kernel Buffer est l’endroit où la mise en cache se produit. Corrigez-moi si je me trompe.

Est-ce que cela signifie que si le tampon de kernel Winsock est mis à zéro avec l’option SO_SNDBUF, l’algorithme Nagle sera-t-il désactivé?

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

L’article de la base de connaissances auquel vous faites référence vous donne vos réponses de cette manière …

Pour optimiser les performances au niveau de la couche application, Winsock copie les tampons de données à partir des appels d’envoi d’application vers un tampon de kernel Winsock . Ensuite, la stack utilise ses propres heuristiques (telles que l’algorithme Nagle) pour déterminer quand placer le paquet sur le câble.

et, en définissant TCP_NODELAY ou SO_SNDBUF = 0, l’algorithme Nagle sera désactivé comme ci-dessous,

L’ option de socket TCP_NODELAY est appliquée pour désactiver l’algorithme Nagle afin que les petits paquets de données soient livrés sans délai à l’hôte distant.

Vous pouvez modifier la quantité de mémoire tampon du kernel Winsock allouée au socket à l’aide de l’option SO_SNDBUF (8 Ko par défaut). Si nécessaire, Winsock peut mettre en mémoire tampon beaucoup plus que la taille de la mémoire tampon SO_SNDBUF. Dans la plupart des cas, l’achèvement de l’envoi dans l’application indique uniquement que le tampon de données d’un appel d’envoi d’application est copié dans le tampon du kernel 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 .


En lisant votre commentaire ci-dessous, je me rends compte que vous pourriez être confus car la configuration de TCP_NODELAY ou la définition de SO_SNDBUF = 0 semblent faire la même chose. Si tel est le cas, veuillez noter que Nagle ne s’applique que sur les stream TCP (qui segmentent les données en paquets), tandis que SO_SNDBUF est également applicable aux sockets UDP.

Définir SO_SNDBUF à zéro arrête explicitement toute la mise en mémoire tampon de la sortie et une diffusion immédiate est tentée pour chaque «écriture» sur le socket (au moins dans les implémentations de socket normales).

Le paramétrage 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 l’envoi différé (après que l’envoi soit reconnu par l’application).

SO_SNDBUF défini sur 0 ne force pas l’envoi immédiat sur le câble.

Définir SO_SNDBUF à zéro ne désactivera pas implicitement nagle; l’état de la balise maintenu par la WSK est indépendant de l’emplacement du tampon. Il est de votre responsabilité de conserver les tampons que vous publiez valables jusqu’à ce que le transport les consum.