Aller au contenu principal

2. TCP Window Scale Option (Option d'échelle de fenêtre TCP)

2. TCP Window Scale Option (Option d'échelle de fenêtre TCP)

2.1 Introduction

L'extension d'échelle de fenêtre élargit la définition de la fenêtre TCP à 32 bits, puis utilise un facteur d'échelle pour transporter cette valeur de 32 bits dans le champ Window de 16 bits de l'en-tête TCP (SEG.WND dans RFC-793). Le facteur d'échelle est transporté dans une nouvelle option TCP, Window Scale. Cette option n'est envoyée que dans un segment SYN (un segment avec le bit SYN activé), donc l'échelle de fenêtre est fixée dans chaque direction lorsqu'une connexion est ouverte. (Un autre choix de conception serait de spécifier l'échelle de fenêtre dans chaque segment TCP. Il serait incorrect d'envoyer une option d'échelle de fenêtre uniquement lorsque le facteur d'échelle change, car une option TCP dans un segment d'accusé de réception ne sera pas livrée de manière fiable (à moins que l'ACK ne soit transporté avec des données dans l'autre direction). Fixer l'échelle lorsque la connexion est ouverte a l'avantage d'une surcharge plus faible mais l'inconvénient que le facteur d'échelle ne peut pas être modifié pendant la connexion.)

La fenêtre de réception maximale, et donc le facteur d'échelle, est déterminée par l'espace tampon de réception maximal. Dans une implémentation moderne typique, cet espace tampon maximal est défini par défaut mais peut être remplacé par un programme utilisateur avant l'ouverture d'une connexion TCP. Cela détermine le facteur d'échelle, et donc aucune nouvelle interface utilisateur n'est nécessaire pour l'échelle de fenêtre.

2.2 Window Scale Option (Option d'échelle de fenêtre)

L'option Window Scale de trois octets peut être envoyée dans un segment SYN par un TCP. Elle a deux objectifs: (1) indiquer que le TCP est prêt à effectuer à la fois l'échelle de fenêtre d'envoi et de réception, et (2) communiquer un facteur d'échelle à appliquer à sa fenêtre de réception. Ainsi, un TCP qui est prêt à mettre à l'échelle les fenêtres devrait envoyer l'option, même si son propre facteur d'échelle est 1. Le facteur d'échelle est limité à une puissance de deux et codé logarithmiquement, il peut donc être implémenté par des opérations de décalage binaire.

TCP Window Scale Option (WSopt):

Kind: 3 Length: 3 bytes

+---------+---------+---------+
| Kind=3 |Length=3 |shift.cnt|
+---------+---------+---------+

Cette option est une offre, pas une promesse; les deux côtés doivent envoyer des options Window Scale dans leurs segments SYN pour activer l'échelle de fenêtre dans les deux directions. Si l'échelle de fenêtre est activée, alors le TCP qui a envoyé cette option décalera vers la droite ses valeurs de fenêtre de réception réelles de 'shift.cnt' bits pour la transmission dans SEG.WND. La valeur 'shift.cnt' peut être zéro (offrant de mettre à l'échelle, tout en appliquant un facteur d'échelle de 1 à la fenêtre de réception).

Cette option peut être envoyée dans un segment `<SYN>` initial (c'est-à-dire un segment avec le bit SYN activé et le bit ACK désactivé). Elle peut également être envoyée dans un segment `<SYN,ACK>`, mais seulement si une option Window Scale a été reçue dans le segment `<SYN>` initial. Une option Window Scale dans un segment sans bit SYN devrait être ignorée.

Le champ Window dans un segment SYN (c'est-à-dire un segment `<SYN>` ou `<SYN,ACK>`) lui-même n'est jamais mis à l'échelle.

2.3 Using the Window Scale Option (Utilisation de l'option d'échelle de fenêtre)

Une implémentation modèle de l'échelle de fenêtre est la suivante, en utilisant la notation de RFC-793 [Postel81]:

  • Toutes les fenêtres sont traitées comme des quantités de 32 bits pour le stockage dans le bloc de contrôle de connexion et pour les calculs locaux. Cela inclut les valeurs de fenêtre d'envoi (SND.WND) et de fenêtre de réception (RCV.WND), ainsi que la fenêtre de congestion.

  • L'état de connexion est augmenté de deux compteurs de décalage de fenêtre, Snd.Wind.Scale et Rcv.Wind.Scale, à appliquer respectivement aux champs de fenêtre entrants et sortants.

  • Si un TCP reçoit un segment `<SYN>` contenant une option Window Scale, il envoie sa propre option Window Scale dans le segment `<SYN,ACK>`.

  • L'option Window Scale est envoyée avec shift.cnt = R, où R est la valeur que le TCP aimerait utiliser pour sa fenêtre de réception.

  • Lors de la réception d'un segment SYN avec une option Window Scale contenant shift.cnt = S, un TCP définit Snd.Wind.Scale à S et définit Rcv.Wind.Scale à R; sinon, il définit à la fois Snd.Wind.Scale et Rcv.Wind.Scale à zéro.

  • Le champ fenêtre (SEG.WND) dans l'en-tête de chaque segment entrant, à l'exception des segments SYN, est décalé vers la gauche de Snd.Wind.Scale bits avant de mettre à jour SND.WND:

    SND.WND = SEG.WND &lt;&lt; Snd.Wind.Scale

    (en supposant que les autres conditions de RFC793 sont satisfaites, et en utilisant la notation "C" "<<" pour le décalage gauche).

  • Le champ fenêtre (SEG.WND) de chaque segment sortant, à l'exception des segments SYN, est décalé vers la droite de Rcv.Wind.Scale bits:

    SEG.WND = RCV.WND >> Rcv.Wind.Scale.

TCP détermine si un segment de données est "ancien" ou "nouveau" en testant si son numéro de séquence est dans les 231 octets du bord gauche de la fenêtre, et si ce n'est pas le cas, en écartant les données comme "anciennes". Pour s'assurer que les nouvelles données ne sont jamais considérées à tort comme anciennes et vice-versa, le bord gauche de la fenêtre de l'expéditeur doit être au plus à 231 du bord droit de la fenêtre du récepteur. De même avec le bord droit de l'expéditeur et le bord gauche du récepteur. Puisque les bords droit et gauche de la fenêtre de l'expéditeur ou du récepteur diffèrent de la taille de la fenêtre, et puisque les fenêtres de l'expéditeur et du récepteur peuvent être déphasées d'au plus la taille de la fenêtre, les contraintes ci-dessus impliquent que 2 * la taille de fenêtre maximale doit être inférieure à 2**31, ou

max window &lt; 2**30

Puisque la fenêtre maximale est 2S (où S est le compteur de décalage d'échelle) multipliée par au plus 216 - 1 (la fenêtre maximale non mise à l'échelle), la fenêtre maximale est garantie d'être &lt; 230 si S &lt;= 14. Ainsi, le compteur de décalage doit être limité à 14 (ce qui permet des fenêtres de 230 = 1 Go). Si une option Window Scale est reçue avec une valeur shift.cnt dépassant 14, le TCP devrait enregistrer l'erreur mais utiliser 14 au lieu de la valeur spécifiée.

Le facteur d'échelle s'applique uniquement au champ Window tel que transmis dans l'en-tête TCP; chaque TCP utilisant des fenêtres étendues maintiendra les valeurs de fenêtre localement en tant que nombres de 32 bits. Par exemple, la "fenêtre de congestion" calculée par Slow Start et Congestion Avoidance n'est pas affectée par le facteur d'échelle, de sorte que l'échelle de fenêtre n'introduira pas de quantification dans la fenêtre de congestion.