Résumé

  • RFC 3465 proposait Appropriate Byte Counting : augmenter la fenêtre de congestion selon les octets jusque-là non acquittés que couvre un ACK, plutôt que selon le nombre de messages ACK reçus.
  • Cette preuve restait bornée. En slow start, L limitait le crédit accordé par un seul ACK; il ne pouvait dépasser deux SMSS et devait revenir à un SMSS après expiration du temporisateur, lorsqu’un acquittement cumulatif pouvait inclure une ancienne progression.

Le nombre de reçus n’était pas le progrès

Le TCP traditionnel utilisait le message ACK comme occasion d’agrandir cwnd. L’approximation semblait naturelle lorsqu’un récepteur confirmait chaque segment et qu’aucun ACK ne disparaissait. Mais les ACK retardés réduisaient de moitié le nombre de ces occasions, tandis qu’un récepteur malveillant pouvait découper la confirmation d’un segment en plusieurs petits messages. Les mêmes octets livrés produisaient alors des fenêtres différentes.

Publié comme document expérimental en février 2003, le RFC 3465 a déplacé le compte vers les octets. Son texte brut, sa notice RFC Editor, sa fiche Datatracker, son historique, ses références, ses citations et la recherche d’errata délimitent le dossier public. La proposition modifiait la croissance définie par le RFC 2581, remplacé plus tard sur la voie normative par le RFC 5681.

Les ACK retardés autorisés par le RFC 1122 pouvaient couvrir deux segments complets. Un émetteur qui comptait les messages grandissait alors plus lentement, comme si l’absence d’un message signifiait l’absence de progrès. La perte d’un ACK avait un effet semblable, même si le suivant confirmait cumulativement les mêmes octets.

À l’inverse, l’attaque dite ACK division multipliait les messages. Le récepteur confirmait successivement de petites fractions du même segment. Si chaque ACK donnait une hausse fixe de fenêtre, une seule quantité de données pouvait fabriquer plusieurs autorisations d’émettre. Le défaut venait du choix de l’unité comptée.

Un registre d’octets au niveau de l’émetteur

En congestion avoidance, ABC conservait bytes_acked dans le bloc de contrôle TCP. Seuls les octets nouvellement acquittés s’ajoutaient. Lorsque le total atteignait la valeur courante de cwnd, l’émetteur retranchait cette valeur du registre puis ajoutait un SMSS à la fenêtre. La cible restait approximativement un segment par aller-retour, indépendamment du découpage des ACK.

En slow start, la hausse pouvait suivre le nombre d’octets nouvellement acquittés par le message reçu, dans la limite L. Avec L=1*SMSS, le comportement n’était pas plus agressif que le mécanisme antérieur; le RFC recommandait cette forme. Il autorisait L=2*SMSS à titre expérimental pour compenser un ACK couvrant deux segments, mais interdisait une limite supérieure.

Cette limite empêchait un grand ACK cumulatif ou un stretch ACK de libérer une rafale arbitraire. La variante à deux SMSS pouvait néanmoins accroître les micro-rafales et rapprocher le slow start d’un doublement par RTT. Les simulations limitées rapportées par le document montraient davantage de pertes dans certains cas; elles n’établissaient ni déploiement général ni équité universelle. Le RFC conseillait le SACK du RFC 2018. La validation de fenêtre du RFC 2861 traitait un problème voisin : le crédit inutilisé accumulé par une application peu active.

Après expiration, tous les octets n’étaient pas récents

Après un retransmission timeout, un acquittement cumulatif pouvait franchir une séquence déjà reçue avant le dernier aller-retour. Ces octets devenaient nouveaux pour le registre de l’émetteur, mais ils ne prouvaient pas tous une capacité libérée dans la période présente. RFC 3465 imposait donc L=1*SMSS pendant la reprise en slow start après RTO.

Le RFC 2988, puis son successeur RFC 6298, fournissaient le contexte du temporisateur. La leçon n’était pas que l’ACK cumulatif était faux. Sa portée temporelle dépassait simplement le sondage courant.

Les mécanismes voisins gardaient d’autres fonctions. Limited Transmit du RFC 3042 autorisait sous conditions l’envoi de données nouvelles avant le troisième ACK dupliqué; il ne tenait pas le registre ABC. Le RFC 3449 étudiait chemins asymétriques, filtrage et reconstruction d’ACK; il ne redéfinissait pas le crédit de l’émetteur. Le catalogue du RFC 2525 rappelle les écarts d’implémentation possibles, sans prouver l’adoption d’ABC.

La discipline ultérieure des couches de réalité de Heng Lu sépare le message ACK, les nouveaux octets confirmés, le crédit admis et les paquets effectivement émis. Sa priorité accordée au code en exécution conduit à examiner accumulateur, limite, état de reprise et rafale. Ce sont des outils éditoriaux ultérieurs, non une intention privée attribuée à l’auteur.

RFC 3465 a rendu le compte plus difficile à manipuler sans prétendre que tout octet confirmé révélait une capacité fraîche. Les reçus pouvaient être divisés ou regroupés; la progression sous-jacente devait conserver le même poids.

Sources