3.1. Démarrage Lent et Évitement de Congestion
Les algorithmes de démarrage lent et d'évitement de congestion DOIVENT (MUST) être utilisés par un expéditeur TCP pour contrôler la quantité de données en attente injectées dans le réseau.
Variables d'État
Pour implémenter ces algorithmes, deux variables sont ajoutées à l'état par connexion TCP:
- Fenêtre de Congestion (cwnd): Une limite côté expéditeur sur la quantité de données que l'expéditeur peut transmettre dans le réseau avant de recevoir un accusé de réception (ACK)
- Fenêtre Annoncée par le Récepteur (rwnd): Une limite côté récepteur sur la quantité de données en attente
Le minimum de cwnd et rwnd régit la transmission de données.
Une autre variable d'état, le seuil de démarrage lent (ssthresh), est utilisée pour déterminer si l'algorithme de démarrage lent ou d'évitement de congestion est utilisé pour contrôler la transmission de données, comme discuté ci-dessous.
Objectif du Démarrage Lent
Commencer la transmission dans un réseau avec des conditions inconnues nécessite que TCP sonde lentement le réseau pour déterminer la capacité disponible, afin d'éviter de congestionner le réseau avec une rafale de données inappropriément grande. L'algorithme de démarrage lent est utilisé à cet effet:
- Au début d'un transfert
- Après la réparation d'une perte détectée par le temporisateur de retransmission
Le démarrage lent sert également à démarrer "l'horloge ACK" utilisée par l'expéditeur TCP pour libérer des données dans le réseau dans les algorithmes de démarrage lent, d'évitement de congestion et de récupération de perte.
Fenêtre Initiale (IW)
IW, la valeur initiale de cwnd, DOIT (MUST) être définie en utilisant les directives suivantes comme limite supérieure:
Si SMSS > 2190 octets:
IW = 2 * SMSS octets et NE DOIT PAS être plus de 2 segments
Si (SMSS > 1095 octets) et (SMSS <= 2190 octets):
IW = 3 * SMSS octets et NE DOIT PAS être plus de 3 segments
Si SMSS <= 1095 octets:
IW = 4 * SMSS octets et NE DOIT PAS être plus de 4 segments
Comme spécifié dans [RFC3390], le SYN/ACK et l'accusé de réception du SYN/ACK NE DOIVENT PAS (MUST NOT) augmenter la taille de la fenêtre de congestion. De plus, si le SYN ou SYN/ACK est perdu, la fenêtre initiale utilisée par un expéditeur après un SYN correctement transmis DOIT (MUST) être un segment contenant au plus SMSS octets.
Une justification détaillée et une discussion du réglage IW sont fournies dans [RFC3390].
Valeur Initiale de ssthresh
La valeur initiale de ssthresh DEVRAIT (SHOULD) être définie arbitrairement élevée (par exemple, à la taille de la plus grande fenêtre annoncée possible), mais ssthresh DOIT (MUST) être réduit en réponse à la congestion.
Définir ssthresh aussi haut que possible permet aux conditions du réseau, plutôt qu'à une limite d'hôte arbitraire, de dicter le taux d'envoi.
Sélection d'Algorithme
- L'algorithme de démarrage lent est utilisé quand
cwnd < ssthresh - L'algorithme d'évitement de congestion est utilisé quand
cwnd > ssthresh - Quand
cwndetssthreshsont égaux, l'expéditeur peut utiliser soit le démarrage lent soit l'évitement de congestion
Algorithme de Démarrage Lent
Pendant le démarrage lent, un TCP incrémente cwnd d'au plus SMSS octets pour chaque ACK reçu qui acquitte cumulativement de nouvelles données. Le démarrage lent se termine lorsque:
- cwnd dépasse ssthresh (ou, optionnellement, lorsqu'il l'atteint, comme noté ci-dessus), ou
- Lorsque la congestion est observée
Augmentation Recommandée de cwnd
Bien que traditionnellement les implémentations TCP aient augmenté cwnd de précisément SMSS octets lors de la réception d'un ACK couvrant de nouvelles données, nous RECOMMANDONS (RECOMMEND) que les implémentations TCP augmentent cwnd, selon:
cwnd += min (N, SMSS) (équation 2)
où N est le nombre d'octets précédemment non acquittés acquittés dans l'ACK entrant.
Cet ajustement fait partie du comptage d'octets approprié (Appropriate Byte Counting) [RFC3465] et fournit une robustesse contre les récepteurs mal comportés qui peuvent tenter d'inciter un expéditeur à gonfler artificiellement cwnd en utilisant un mécanisme connu sous le nom de "division d'ACK" [SCWA99].
Algorithme d'Évitement de Congestion
Pendant l'évitement de congestion, cwnd est incrémenté d'environ 1 segment de taille complète par temps d'aller-retour (RTT). L'évitement de congestion continue jusqu'à ce que la congestion soit détectée.
Directives pour l'Incrémentation de cwnd
Les directives de base pour incrémenter cwnd pendant l'évitement de congestion sont:
- PEUT (MAY) incrémenter cwnd de SMSS octets
- DEVRAIT (SHOULD) incrémenter cwnd selon l'équation (2) une fois par RTT
- NE DOIT PAS (MUST NOT) incrémenter cwnd de plus de SMSS octets
Implémentation Recommandée
La méthode RECOMMANDÉE (RECOMMENDED) pour augmenter cwnd pendant l'évitement de congestion est de compter le nombre d'octets qui ont été acquittés par des ACK pour de nouvelles données. Lorsque le nombre d'octets acquittés atteint cwnd, alors cwnd peut être incrémenté jusqu'à SMSS octets.
Notez que pendant l'évitement de congestion, cwnd NE DOIT PAS (MUST NOT) être augmenté de plus de SMSS octets par RTT.
Formule Alternative
Une autre formule courante qu'un TCP PEUT (MAY) utiliser pour mettre à jour cwnd pendant l'évitement de congestion est donnée dans l'équation (3):
cwnd += SMSS*SMSS/cwnd (équation 3)
Réponse à la Perte
Lorsqu'un expéditeur TCP détecte une perte de segment en utilisant le temporisateur de retransmission et que le segment donné n'a pas encore été renvoyé par le temporisateur de retransmission, la valeur de ssthresh DOIT (MUST) être définie à pas plus que la valeur donnée dans l'équation (4):
ssthresh = max (FlightSize / 2, 2*SMSS) (équation 4)
où, comme discuté ci-dessus, FlightSize est la quantité de données en attente dans le réseau.
De plus, lors d'un timeout (comme spécifié dans [RFC2988]) cwnd DOIT (MUST) être défini à pas plus que la fenêtre de perte, LW, qui est égale à 1 segment de taille complète (indépendamment de la valeur d'IW).
Par conséquent, après avoir retransmis le segment abandonné, l'expéditeur TCP utilise l'algorithme de démarrage lent pour augmenter la fenêtre de 1 segment de taille complète à la nouvelle valeur de ssthresh, à ce moment l'évitement de congestion reprend.