<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="Convergence of Congestion Control from Retained State"
	 status="standards" num="9959" wg="tsvwg">
  <authors><author>N. Kuhn (Thales Alenia
  Space)</author><author>E. Stephan
  (Orange)</author><author>G. Fairhurst</author><author>R. Secchi
  (University of Aberdeen)</author><author>C. Huitema (Private
  Octopus)</author></authors>
  <rfcdate><month>May</month><year>2026</year></rfcdate>
  <date>2026-05-12</date>
<content>
  <p>Traditionnellement, les protocoles de <wikipedia name="Couche
  4">transport</wikipedia> comme <wikipedia>QUIC</wikipedia> ou <wikipedia name="Transmission Control
  Protocol">TCP</wikipedia> partaient de zéro à chaque connexion. On
  se connecte, on démarre prudemment (ne pas envoyer trop de données
  pour éviter de congestionner le réseau), puis on augmente le débit
  petit à petit. Mais c'est dommage de ne pas tenir compte des
  connexions précédentes, où on avait déjà suivi ce processus. Ne
  pourrait-on pas se souvenir des mesures précédentes pour aller plus
  vite la prochaine fois ? C'est justement ce que propose ce
  <wikipedia name="Request for comments">RFC</wikipedia>.</p>
  <p>Évidemment, si l'idée est simple, la réalisation soulève plein de
  problèmes, d'autant plus qu'on touche ici à une activité
  dangereuse : si on se trompe, on risque d'aggraver la congestion. Le
  <wikipedia name="Request for comments">RFC</wikipedia> détaille donc
  plus précisément comment réutiliser ces mesures passées, pour ne pas
  faire s'écrouler le réseau. Tout protocole de <wikipedia
  name="Couche 4">transport</wikipedia> doit utiliser un algorithme de
  contrôle de la congestion (<rfc num="2914" local="true"/>) ou bien
  s'auto-modérer (<rfc num="8085" local="true"/>). Mais concevoir un
  bon algorithme de contrôle de la congestion n'est pas trivial et,
  par exemple, le <rfc num="5783" local="false"/> notait que les
  algorithmes existants marchaient mal pour les liaisons avec un
  <wikipedia xml:lang="en" name="Bandwidth-delay
  product">BDP</wikipedia> élevé et/ou très variable, comme les
  liaisons <wikipedia name="Satellite de télécommunications">satellite</wikipedia>.</p>
  <p>Pour comprendre pourquoi, revenons un peu au fonctionnement
  typique d'un algorithme de contrôle de la congestion. Il a
  typiquement deux phases. D'abord, au début de la connexion, on envoie moins
  de données que ce qu'on pourrait, afin de ne pas congestionner le
  réseau. Puis on augmente le débit, jusqu'au moment où des
  indicateurs comme la perte de paquets ou le rythme des accusés de
  réception (<rfc num="9406" local="false"/>) signalent qu'on a
  atteint la capacité maximale pour ce flux de données. La dépasser
  (<foreign>overshoot</foreign>) congestionnerait le réseau ou, si les
  autres flux qui se partagent le réseau sont mieux élevés,
  entrainerait des diminutions de ressources pour ces autres, voire un
  écroulement du réseau sous la charge. Voilà pourquoi il faut
  démarrer lentement.</p>
  <p>Au passage, le RFC note que, bien sûr, la connexion TCP ou
  <wikipedia>QUIC</wikipedia> qui
  réutiliserait les mesures d'une précédente connexion doit s'assurer
  qu'on compare ce qui est comparable : mêmes adresses IP source et
  destination, et peut-être même DSCP (<foreign>Differentiated
  Services Code Point</foreign>, cf. <rfc num="2474"
  local="true"/>). On verra plus loin que ce n'est pas suffisant (les
  choses peuvent changer, le passé peut ne pas être un bon indicateur
  du présent), mais patientez encore un peu.</p>
  <p>La méthode de notre <wikipedia name="Request for
  comments">RFC</wikipedia> se nomme « reprise prudente »
  (<foreign>careful resume</foreign>) ou, en plus joli « partage
  temporel » (<foreign>temporal sharing</foreign>), puisqu'on reprend
  des mesures passées (mesures de la <link
  local="capacite">capacité</link>, du <wikipedia name="Round-Trip
  delay Time">RTT</wikipedia>, etc). Ces mesures pouvant ne plus être
  d'actualité (trop vieilles et/ou le chemin suivi a changé), il faut
  en effet être prudent (cf. <rfc num="9000" local="true"/> et <rfc
  num="9040" local="false"/>).</p>
  <p>Dans quels cas cette reprise (prudente) de données d'une
  connexion précédente peut être utile ?  La section 1.4 du RFC liste
  un certain nombre de cas d'usages. Entre autres, il y a le cas d'une
  application qui utilise plusieurs connexions, les connexions
  peuvent alors utiliser les données récupérées par la première
  d'entre elles. Ou bien lorsqu'une connexion a été violemment
  interrompue et repart tout de suite après. Et il y a aussi une autre
  utilisation, lorsque la <link local="latence">latence</link> du
  chemin utilisé est bien plus importante que dans une liaison
  Internet typique, ce qui est le cas des
  <wikipedia name="Satellite de télécommunications">satellites</wikipedia> lorsqu'ils ne sont pas en
  <wikipedia name="Orbite terrestre basse">orbite basse</wikipedia>. L'article « <foreign><link
  url="https://arxiv.org/abs/1810.04970">Google QUIC performance over
  a public SATCOM access </link></foreign> » note ainsi que sur une
  liaison via un <wikipedia name="Satellite géostationnaire">satellite géostationnaire</wikipedia>, avec
  l'algorithme classique, transférer 5,3 Mo prendra 9 secondes alors
  que le partage temporel, si on peut réutiliser les mesures d'une
  connexion précédente, prendra 4 secondes. (Si les 9 secondes vous
  semblent trop, compte-tenu de la capacité du lien, rappelez-vous que
  la capacité n'est pas le seul facteur limitant ; TCP, surtout au
  démarrage, n'utilise pas toute la capacité, et il met longtemps à
  converger si la latence est élevée.) Une autre présentation, à
  l'<wikipedia name="Internet Engineering Task Force">IETF</wikipedia>
  « <foreign><link
  url="https://datatracker.ietf.org/meeting/111/materials/slides-111-maprg-feedback-from-using-quics-0-rtt-bdp-extension-over-satcom-public-access-00">Feedback
  from using QUIC's 0- RTT-BDP extension over SATCOM public
  access</link></foreign> », calcule une réduction du temps de
  transfert de 62 % pour faire voyager 1 Mo. Enfin, le RFC recommande
  la lecture de la synthèse « <foreign><link
  url="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5240200">Careful
  Resumption of Internet Congestion Control from Retained Path
  State</link></foreign> ».</p>
  <p>Le récepteur des données peut avoir des informations que
  l'envoyeur n'a pas, et cela peut le pousser à vouloir désactiver la
  reprise que l'envoyeur croit prudente. Par exemple, le récepteur
  sait peut-être quelle quantité de données va être envoyée, ou bien
  il sait que le chemin sur le réseau a changé.</p>
  <p>Toujours pour compliquer les choses, il faut aussi se souvenir
  que d'autres facteurs peuvent limiter la quantité de données qu'on
  envoie, par exemple le contrôle de flux, donc les fenêtres de TCP
  (<rfc num="9293" local="true"/>, section 3.8.6) ou le système de
  crédit de <wikipedia>QUIC</wikipedia> (<rfc num="9000"
  local="true"/>, section 4).</p>
  <p>Prenant en compte tout cela, la section 1.5 du RFC résume les
  principes de la « reprise prudente » :
  <enum>
    <item>D'abord, s'assurer que les conditions n'ont pas changé
    depuis la dernière connexion ; le chemin est-il le même ? (La
    mesure du <wikipedia name="Round-Trip delay Time">RTT</wikipedia> donne une première bonne idée.) À
    l'issue de cette phase de reconnaissance, si les conditions ont
    changé, on utilise la méthode classique, on ne tient pas compte
    des mesures qui ont été sauvegardées.</item>
    <item>Ensuite, OK, on va plus vite qu'avec la méthode classique
    mais pas aussi vite que ne l'indiquent les mesures
    sauvegardées. Après tout, la reconnaissance ne permet pas toujours
    d'identifier un changement dans les conditions.</item>
    <item>Enfin, on se prépare à faire marche arrière, et à revenir à
    la méthode classique, si on s'aperçoit qu'on est en train de créer
    de la congestion. (Le RFC note qu'il faut la détecter rapidement,
    avant que les autres flots de données n'aient détecté la
    congestion et réduit leur débit.)</item>
  </enum></p>
  <p>Un peu de terminologie avant de continuer (section 2) : le
  partenaire distant (<foreign>remote endpoint</foreign>) est
  l'ensemble des informations qui identifie à qui on envoie des
  données, typiquement l'identificateur d'une interface réseau locale
  couplé à l'adresse IP de la machine avec qui on parle et peut-être
  (c'est une décision locale, et forcément très dépendante du système
  d'exploitation utilisé) des informations comme <wikipedia
  name="Differentiated Services Code Point">DSCP</wikipedia>. Si le
  partenaire distant change, on en déduit que le chemin a changé
  (l'inverse n'est pas vrai : le chemin peut changer alors que le
  partenaire distant est le même). Si on a une indication que le
  chemin a changé, on revient au mécanisme traditionnel, on n'utilise
  pas les paramètres gardés des précédentes connexions.
  </p>
  <p>Le mécanisme de notre RFC a donc plusieurs phases (section 3,
  mais regardez aussi le joli tableau de l'annexe A, qui est peut-être
  plus clair) : celle de reconnaissance, où on cherche si les
  caractéristiques du chemin correspondent à un chemin connu, puis ,
  selon son résultat, on passe à la phase dite normale, si on a
  reconnu un chemin déjà vu, ou bien à la phase non-validée (chemin
  inconnu, on démarre prudemment), puis à la phase de validation (y a
  t-il un indicateur de congestion ou bien tout est-il beau et
  propre ?), ou bien à celle de retraite (on jette les informations
  enregistrées, la situation a changé, on retourne en mode
  traditionnel), avant de passer à la phase normale. (Des exemples
  détaillés figurent dans l'annexe B.)</p>
  <p>La section 4 du RFC fournit des détails sur la mise en œuvre des
  principes de ce RFC. Par exemple, la détermination pratique d'un
  changement du chemin. Un bon indicateur est le <wikipedia
  name="Round-Trip delay Time">RTT</wikipedia>. Cette section
  conseille aussi, même en l'absence d'indications que le chemin a
  changé, de ne pas garder les paramètres sauvegardés trop longtemps :
  comme la détection d'un éventuel changement n'est pas parfaite, il
  vaut mieux avoir une durée de vie maximale pour les paramètres
  enregistrés. Le RFC suggère quelques heures, voire moins si on sait
  que le chemin est très dynamique.</p>
  <p>Enfin, l'annexe B détaille à l'octet près des exemples de
  fonctionnement de l'algorithme de reprise prudente, pour différents
  cas.</p>
  <p>Vous pouvez aussi avoir une introduction aux principes de ce RFC
  dans l'exposé d'un des auteurs à <link
  url="https://www.afnic.fr/observatoire-ressources/actualites/jcsa21-retour-sur-ledition-2021-de-la-journee-du-conseil-scientifique-de-lafnic/">la
  Journée du Conseil Scientifique de l'Afnic en 2021</link> (avec
  <link
  url="https://www.afnic.fr/wp-media/uploads/2021/09/afnic-jcsa2021_cnes_kuhn.pdf">les
  supports</link>).</p>
  <!-- Développement en https://github.com/tsvwg/careful-resume -->
  <!-- Il y a un draft pour le logging qlog : Quic Logging for
       Convergence of Congestion Control from Retained State
       draft-ietf-tsvwg-careful-resume-qlog -->
  <p>Merci à Nicolas Kuhn pour sa relecture.</p>
</content>
</rfcdesc>
