http://www.bortzmeyer.org/7567.html
----------------------------
Auteur(s) du RFC: F. Baker (Cisco Systems), G. Fairhurst
(University of Aberdeen)
----------------------------
L'AQM ("Active Queue Management") désigne l'ensemble des techniques
utilisées par un routeur pour gérer les files d'attente de paquets
attendant de partir. La technique triviale est de faire passer les
paquets en FIFO et de refuser de nouveaux paquets quand la file
d'attente est pleine. Mais il existe plein d'autres techniques
possibles, qui forment l'AQM. Ce nouveau RFC résume les recommandations
de l'IETF sur l'AQM. Notamment, il n'y a plus de méthode privilégiée,
comme l'était RED précédemment (dans l'ancien RFC 2309).
Petit rappel sur IP d'abord (section 1 du RFC) : IP (RFC 791 ou RFC
2460) est un protocole sans état (chaque paquet est routé
indépendamment des autres) et donc sans connexion. Cela rend les
routeurs bien plus efficaces (ils n'ont pas besoin d'avoir de mémoire),
cela permet de changer de route facilement, cela permet de survivre à
la perte ou au redémarrage d'un routeur. L'extrême robustesse de
l'Internet le montre tous les jours. En revanche, une des faiblesses de
ce mécanisme sans connexion est sa sensibilité aux fortes charges : si
un routeur congestionné commence à perdre des paquets car ses liens de
sortie sont saturés, les machines vont réemettre, envoyant davantage de
paquets, aggravant la situation et ainsi de suite jusqu'à la fusion du
réseau (le fameux "Internet meltdown", cf. RFC 896 et RFC 970). Ce
phénomène a été plusieurs fois observés dans les années 1980 sur le
cœur de l'Internet. Il est depuis confiné aux marges de l'Internet, par
l'applications de meilleures techniques dans les routeurs, mais il
menace en permanence de réapparaitre.
Le RFC 2309, publié en 1998, est le dernier qui fasse le point sur le
problème de la congestion et ses conséquences. Sa principale
recommandation concrète était de déployer massivement une technique de
gestion des files d'attente, RED (« "Internet routers should implement
some active queue management [...] The default mechanism for managing
queue lengths to meet these goals in FIFO queues is Random Early
Detection (RED). Unless a developer has reasons to provide another
equivalent mechanism, we recommend that RED be used." ») Mais, depuis
1998, l'Internet a évolué, notamment par la demande plus forte de
limitation de la latence <http://www.bortzmeyer.org/latence.html>. La
recommandation du RFC 2309 ne semble plus aussi opportune. (Et RED
s'est avéré difficile à configurer en pratique.)
Tout le travail n'est pas à faire du côté des routeurs. Le problème de
la congestion et le risque de fusion sont tellement sérieux, surtout
depuis les grandes pannes des années 1980, que beaucoup d'efforts ont
été dépensés pour les traiter. C'est ainsi que Van Jacobson a développé
les règles (« "Congestion Avoidance and Control
<http://ee.lbl.gov/papers/congavoid.pdf>" » dans le SIGCOMM "Symposium
proceedings on Communications architectures and protocols" en 1988) que
doit suivre TCP pour éviter que ce dernier n'aggrave la congestion : en
cas de perte de paquets, TCP ne doit pas réémettre bêtement comme un
porc mais au contraire se calmer, arrêter d'envoyer des paquets à la
vitesse maximale, pour donner une chance aux files d'attente des
routeurs de se vider. Ces règles sont aujourd'hui documentées dans le
RFC 5681. Elles s'appliquent aux machines terminales de l'Internet,
alors que notre RFC 7567 concerne les routeurs, qui ont aussi leur rôle
à jouer. Les machines terminales ne peuvent pas tout, d'autant plus que
toutes ne sont pas bien élevées : il y a des programmes mal écrits ou
malveillants qui sont connectés au réseau, cf. la section 5. Des
travaux sont en cours pour gérer le cas de machines qui ne réagissent
pas à la congestion et continuent à émettre au maximum (cf. RFC 6789).
Mais le risque d'écroulement du réseau sous l'effet de la congestion
n'est pas le seul. Il faut aussi penser à la latence
<http://www.bortzmeyer.org/latence.html>. Si on augmente la taille des
files d'attente dans les routeurs, pour diminuer le risque d'avoir à
jeter des paquets, on augmente aussi la latence, car vider ces files
prendra du temps. (L'augmentation excessive de la taille des files
d'attentes est connue sous le nom de "bufferbloat", voir aussi la
section 2.3.)
La section 2 décrit en détail le problème de la gestion des files
d'attente dans un routeur de l'Internet. La méthode traditionnelle, la
plus simple, est connue sous le nom de "tail drop" : la queue a une
taille finie, lorsqu'elle est pleine, on arrête d'accepter des paquets,
point. Cela veut dire que les premiers paquets jetés sont les derniers
arrivés. Cette méthode est simple à programmer mais elle a plusieurs
inconvénients :
* "Tail drop" ne signale la congestion aux machines terminales (en
jetant les paquets) que lorsque la file d'attente est pleine. Si la
file reste en permanence à 50-80 % pleine, aucun paquet ne sera jeté,
les machines terminales continueront à émettre au même rythme, alors
que le fait que la file soit plus qu'à moité pleine aura un effet
négatif sur la latence.
* Cette technique ne garantit pas l'égalité des différents flots de
communication : dans certains cas, un seul flot peut monopoliser la
queue.
* Elle a aussi la propriété qu'elle tend à synchroniser les différentes
machines qui partagent le même goulet d'étranglement (Floyd, S. et V.
Jacobsen, « "The Synchronization of Periodic Routing Messages
<http://ee.lbl.gov/papers/sync_94.pdf>" »).
On pourrait réduire certains de ces problèmes (notamment le premier) en
réduisant la taille de la file d'attente. Mais celle-ci est
indispensable dans le cas d'augmentation brusque de trafic : le ruthme
d'arrivée des paquets n'est pas constant, il y a des moments où tout le
monde parle en même temps (Leland, W., Taqqu, M., Willinger, W., et D.
Wilson, « "On the Self-Similar Nature of Ethernet Traffic (Extended
Version) <http://eeweb.poly.edu/el933/papers/Willinger.pdf>" »,
"IEEE/ACM Transactions on Networking"), et les files d'attente sont là
pour lisser ces soubresauts. Idéalement, on voudrait une queue vide en
temps normal, qui ne se remplisse que pendant les pics de trafic.
L'algorithme "tail drop" a l'inconvénient de créer souvent des queues
pleines en permanence, au détriment de la latence.
Mais il y a d'autres algorithmes. Le "random drop on full" jette,
lorsque la file est pleine, non pas le dernier paquet mais un paquet au
hasard. Cela évite la monopolisation de la file par un seul flot de
données mais cela ne résoud pas le problème des files toujours pleines.
Même chose pour le "head drop" qui consiste à jeter le premier paquet
et non pas le dernier. La bonne solution est donc de ne *pas* attendre
que la file soit pleine pour agir. C'est cette idée qui est à la base
de l'AQM. En jetant des paquets avant que la file ne soit remplie (ou
bien en les marquant avec ECN, cf. RFC 3168), on va dire indirectement
aux machines terminales de ralentir, et on évitera ainsi les files
complètement pleines, sauf en cas de brusque pic de trafic.
AQM est donc un concept *proactif*. Il permet de :
* Jeter moins de paquets,
* Réduire l'occupation des files d'attente, et donc la latence, pour le
plus grand plaisir des applications interactives,
* Éviter la monopolisation par un seul flot,
* Réduire la synchronisation (par l'usage de choix aléatoires).
Tout cela est très bien si les applications utilisent toutes TCP,
protocole habitué à réagir à la congestion (en diminuant son débit), et
qui protège l'Internet contre les abus. Tant qu'il n'y a que TCP, avec
des algorithmes conformes aux recommandations du RFC 5681, tout le
monde partage le réseau en bonne intelligence et sans catastrophe, et
chacun obtient une part égale de la capacité
<http://www.bortzmeyer.org/capacity.html>.
Mais il n'y a pas que TCP dans l'Internet, certains applications
utilisent, par exemple, UDP (conseil personnel au passage : le
programmeur débutant qui ne connait pas bien les problèmes de
congestion devrait n'utiliser que TCP ou un équivalent comme SCTP, afin
d'éviter d'écrouler le réseau). On peut classer les flots de données
non-TCP en trois catégories :
* Flots amicaux avec TCP : ce sont ceux qui utilisent des algorithmes
de contrôle de la congestion qui, en pratique, leur donnent un débit
proche de celui d'un flot TCP (RFC 5348). Par exemple, ce sont des
flots UDP envoyés par des applications dont les auteurs ont lu et
appliqué le RFC 5405.
* Flots qui ne réagissent pas à la congestion : ce sont ceux qui
continuent à envoyer des paquets sans tenir compte des pertes ou des
signalements ECN. Ce sont les « méchants ». Certaines applications de
transport de la voix ou de la vidéo sont dans cette catégorie. Jusqu'à
présent, la solution anti-congestion à l'IETF avait toujours été
d'améliorer les applications. Comme on ne peut pas espérer que 100 %
des applications soient bien élevées, il faudra un jour développer des
solutions pour gérer ceux qui abusent.
* Flots qui réagissent, mais pas aussi bien que TCP : ils ont un
mécanisme de réaction à la congestion mais ce mécanisme est trop peu
réactif, et ces flots prennent donc une part disproportionnée du
trafic. Cela peut être le résultat d'une maladresse du programmeur
(voir mon conseil plus haut : utilisez TCP, sauf si vous êtes vraiment
très fort en contrôle de congestion). Mais cela peut être aussi
délibéré, pour s'assurer une plus grosse part du gâteau. Par exemple,
certaines mises en œuvre de TCP étaient plus agressives que la normale,
peut-être pour que le vendeur puisse proclamer que son TCP était « plus
rapide ». On est dans une problématique très proche de celle de
nombreux problèmes écologiques : si peu de gens trichent, les tricheurs
et les égoïstes ont un gros avantage. Mais s'ils entrainent les autres,
une spirale de la triche se développe, jusqu'au point où c'est l'enfer
pour tout le monde. Pour l'Internet, une telle spirale pourrait aller
jusqu'au cas où il n'y aurait plus de réaction à la congestion du tout,
chacun poussant ses octets au maximum, sans tenir compte de l'intérêt
collectif.
La section 4 de notre RFC résume les recommandations actuelles :
* Il faut faire de l'AQM,
* Ce serait bien de ne pas seulement jeter les paquets mais aussi de
pouvoir faire de l'ECN,
* L'administrateur système ou réseaux ne devrait pas avoir à faire de
"tuning", tout devrait s'ajuster automatiquement,
* L'AQM doit répondre à la congestion effective, pas à ce que le
routeur croit savoir sur l'application ou sur le protocole de transport
(c'est également impératif pour la neutralité de l'Internet),
* Le problème des flots délibérement égoïstes est très important, et
nécessite davantage de recherche.
Le reste de la section 4 détaille chacune de ces recommandations.
Par exemple, la seconde vient du fait qu'il n'y avait au début qu'un
seul moyen pour un routeur de signaler la congestion : jeter des
paquets (ce qui était de toute façon nécessaire : quand il n'y a plus
de place, il n'y a plus de place). L'ajout d'ECN, dans le RFC 3168, et
les spécifications de son usage (voir par exemple le RFC 6679) ont
ajouté un deuxième moyen, qui permet de réagir avant qu'on perde des
paquets. (Le RFC note que retarder les paquets, ce que fait la file
d'attente, peut aussi être vu comme un signal : l'augmentation du RTT
va mener TCP à ajuster son débit.)
La recommandation comme quoi le "tuning" (par le biais de paramètres
numériques qu'il faudrait ajuster pour obtenir l'effet idéal) ne doit
*pas* être obligatoire est discutée en section 4.3. Elle vient de
l'expérience ce certaines mises en œuvre d'AQM où le pauvre
administrateur du routeur devait absolument fixer certains paramètres,
alors qu'il manque de temps et qu'il n'est pas forcément expert en
congestion. En environnement de production, il n'est pas réaliste
d'espérer que le dit administrateur passe ses nuits à faire du
"tuning" ; l'algorithme doit avoir des paramètres par défaut
raisonnables et, pour le reste, doit s'ajuster tout seul, en tenant
compte d'informations comme la capacité des interfaces du routeur, et
de variables mesurées en cours de route comme la durée moyenne de
séjour des paquets dans la file d'attente ou le pourcentage de paquets
jetés. (Un des problèmes de RED est justement la difficulté à s'ajuster
automatiquement.)
Cela n'interdit pas au programmeur de fournir des mécanismes permettant
le "tuning" manuel (ainsi que des outils pour aider l'administrateur à
prendre ses décisions) mais ces mécanismes ne doivent pas être
indispensables.
Pour la recommandation d'objectivité (décider en fonction de ce qu'on
observe, pas de ce qu'on suppose), il est utile de relire le RFC 7141.
Par exemple, il ne faut pas tenir compte de la taille des paquets. De
même, il ne faut pas supposer que toutes les applications utilisent
TCP.
Enfin, sur la recommendation de continuer les recherches, la section
4.7 fournit un programme aux chercheurs qui se demandent sur quel sujet
travailler : il reste encore beaucoup de travail.
La section 1.4 de notre RFC décrit les changements depuis le RFC 2309.
Ls deux plus importants sont :
* La taille d'une file d'attente n'est plus forcément évaluée
uniquement en octets. Elle peut l'être en temps passé par le paquet
dans la queue.
* L'algorithme RED n'est plus le seul recommandé pour gérer les files
d'attente.
---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/