mardi 15 mars 2016

Les options TCP


Les options ont plusieurs objectifs :

• Lors de l'établissement de la connexion, elles permettent de définir les capacités de la pile TCP implémentée (Selective Acknowledgement, Window Scale, ...) ainsi que les conditions de transmission (Maximum Segment Size, ...).

• Elles permettent aussi de fournir des moyens supplémentaires de correction d'erreurs (Selective Acknowledgement par exemple).

• Enfin, elles peuvent fournir des moyens supplémentaires pour améliorer la sécurité ou estimer la latence (Timestamps par exemple).

Les options sont de longueur variable et sont intégrées dans le checksum TCP. Elles se trouvent entre l'en-tête fixe et les éventuelles données.

La RFC 793 définit 3 options qui doivent être obligatoirement implémentées par toute pile TCP. Toutes les options sont répertoriées par l'IANA.

L'URL actuelle est ici. Elle peut changer, donc le mieux est d'utiliser l'outil de recherche de l'IANA avec les mots clés 'tcp parameter' (ou dans votre moteur de recherche favori).

Format des options


Il existe 2 formats pour les options :

• 1 seul octet pour l'option, qui correspond au code associé.

• un format TLV (Type/Longueur/Valeur) de longueur variable :

Type (1 octet) -Longueur (1 octet) -Données (variable)

La longueur inclut également les 2 octets pour le champ Type et le champ Longueur.

Les options standards à un seul octet


L'option « Fin d'option (End of Option List) » dont le code est 0x00. Elle n'est nécessaire que si la fin des options ne coïncide pas avec la longueur de l'en-tête. Elle se trouve uniquement à la fin de toutes les options.

L'option « Pas d'opération (No­ Operation) »  dont le code 0x01. Cette option est principalement utilisée pour aligner la longueur de l'en­tête sur des mots de 32 bits.
En effet, la longueur de l'en-­tête est donnée en mots de 32 bits.

L'option Maximum Segment Size (MSS)


Pour rappel, la taille maximale d'un datagramme (MTU) IPv4 DEVANT être accepté est de 576 octets (RFC 791).

Par conséquent, un hôte ne doit pas envoyer un segment avec une taille supérieure à 576 octets, à moins d'avoir la certitude que le destinataire acceptera de tels segments.

Dans le cas d'une fragmentation, la taille totale du datagramme réassemblé peut dépasser cette limite, mais chaque fragment doit respecter cette limite.

D'où l'intérêt de l'option MSS :

L'option « Taille maximale du segment » (Maximum Segment Size ou MSS) définit la longueur maximale des données dans un segment TCP acceptée par l'émetteur de cette option (RFC 793, 879 et 6691).

Cette option ne peut être envoyée qu'avec le drapeau SYN activé, par conséquent, uniquement lors de l'établissement de la connexion.

Son code est 0x02 et sa longueur fixe est de 4 octets (la valeur est codée sur 16 bits).

Il y a eu beaucoup de débat sur cette valeur (RFC 879, 6691, 1122) et, en particulier, sur comment la définir. Faut il prendre en compte les options qui peuvent ne pas être présentes ou non ?

Au départ, rien n'est spécifié (RFC 793). Puis, devant les incertitudes soulevées, la RFC 879 nous dit ceci :

THE TCP MAXIMUM SEGMENT SIZE IS THE IP MAXIMUM DATAGRAM SIZE MINUS FORTY

Donc, on enlève 40 octets à la MTU, sans être réellement sûr de savoir à quoi correspond ce chiffre.
Dans un souci de clarifier une bonne fois pour toute, la RFC 6691 nous donne la formule pour le calcul de cette valeur :

MSS = MTU – taille en­tête IP (sans options) – taille en­tête TCP (sans option).

Par contre, l'émetteur doit prendre en compte la taille des options pour calculer la taille du segment à envoyer.


Options TCP présentes lors de l'ouverture d'une connexion
Exemple d'options présentes lors de l'ouverture d'une connexion


Voilà pour les options définies par la RFC 793, nous verrons les autres options dans des articles dédiés.

Aucun commentaire:

Enregistrer un commentaire