2009-06-24 9 views
1

J'ai fait quelques recherches sur l'algorithme de Nagle par curiosité inactive. Je comprends le concept de base derrière cela (les paquets TCP contiennent une quantité importante d'overhead en particulier quand il s'agit de petites charges utiles), mais je ne suis pas sûr d'avoir une bonne implémentation. Je lisais this article sur Wikipedia, mais je ne sais toujours pas comment cela fonctionne. Prenons l'exemple d'une connexion Telnet. La connexion est établie et je commence à taper. Disons que je tape trois caractères (cat, par exemple) et appuyez sur retour. Maintenant nous parlons cat\r\n qui est encore seulement 5 octets. Je pense que cela ne serait pas envoyé jusqu'à ce que nous mettions en file d'attente assez d'octets pour envoyer - et pourtant, il est envoyé immédiatement (du point de vue de l'utilisateur), puisque cat est immédiatement exécuté au retour de retour.Pas clair sur l'algorithme de Nagle

Je pense que j'ai un malentendu fondamental ici sur le fonctionnement de l'algorithme, en particulier en ce qui concerne le bit où "si des données non confirmées sont encore dans le tube, enqueue, sinon envoyer immédiatement".

+0

L'article parle de sessions Telnet étant un problème, donc il l'enverrait immédiatement. – cloudhead

Répondre

5

Les données sont envoyées immédiatement seulement si le serveur a déjà répondu à des messages précédents de votre part (ou c'est votre premier contact avec lui dans cette session). Ainsi, à mesure que le serveur devient de plus en plus réactif, afin d'éviter de l'écraser avec trop de paquets, les données sont mises en file d'attente jusqu'à une taille de paquet maximale avant d'être envoyées.

Ainsi, si les données sont envoyées immédiatement ou non, elles peuvent être déterminées dans le contexte des messages précédents, le cas échéant.

+0

Donc je suppose que l'algorithme de Nagle ne s'appliquera pas aux paquets SYN/ACK, alors - c'est-à-dire qu'il les envoie sans délai? – FreeMemory

+0

Vous pouvez désactiver l'algorithme nagle avec l'option TCP_NODELAY dans l'appel à setsockopt. – bill

0

Lire this post, il est assez en profondeur et clarifié beaucoup de choses pour moi.

Questions connexes