Algorithme de Nagle

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

L'algorithme de Nagle est un algorithme important pour le fonctionnement de TCP défini par John Nagle dans la RFC 896 (RFC 896).

L'objectif de cet algorithme est d'améliorer l'efficacité du protocole en réduisant le nombre de paquets nécessaires à un transfert. En effet, les paquets TCP/IP étant dotés d'un en-tête de 40 octets, l'efficacité des plus petits paquets est extrêmement limitée : par exemple, 1 octet unique de données envoyé dans un paquet TCP, représente finalement un paquet de 41 octets. Le rendement est alors de 2,4 %. Cette situation a lieu par exemple lors de l'utilisation de Telnet, où chaque appui sur une touche entraîne généralement l'envoi immédiat du caractère correspondant. Beaucoup de données seront alors envoyées pour peu de données utiles. Si on envoie au contraire, par exemple, 20 caractères de données dans le même paquet, le rendement passe à 33 %.

Pour optimiser les échanges de données et éviter ainsi la congestion éventuelle du réseau due à une telle situation, l'application de l'algorithme de Nagle va provoquer l'empilement des nouvelles données à envoyer dans un tampon (buffer) tant que les précédentes données envoyées n'ont pas été confirmées (acquittement) ou tant que ce buffer n'est pas plein. Cet algorithme évite donc que des paquets dont la charge utile est très faible ne soient envoyés à la file.

On peut résumer son fonctionnement ainsi :

  1. Le premier octet reçu par TCP est envoyé immédiatement ;
  2. Tant que l'accusé de réception n'a pas été reçu, les octets à envoyer sont stockés dans un tampon. Après l'acquittement du premier octet, les données du tampon sont envoyées en un seul paquet (si la taille du tampon atteint la taille maximale d'un paquet, l'envoi des données a lieu) ;
  3. On stocke de nouveau les données dans le tampon en attendant l'acquittement.

Généralement, les implémentations TCP permettent la désactivation de l'algorithme de Nagle (correspondant typiquement à l'option TCP_NODELAY).

Liens externes[modifier | modifier le code]