mardi 16 février 2016

Connexions TCP


TCP est un protocole orienté connexion. Contrairement à UDP par exemple, il est nécessaire d'établir une connexion avant de pouvoir échanger des données.

Cette phase a pour but d'initialiser différents paramètres comme le numéro de séquence initial (ISN), la taille maximale de segment (MSS), ou le support de certaines implémentations (SACK, Window scaling, ...).

Le drapeau SYN est utilisé lors de cette phase appelée "Three Way Handshake".

De même, une fois le transfert de données terminé, il est nécessaire de fermer la connexion entre les 2 hôtes. Le drapeau FIN est utilisé à cette fin lors de cette phase appelée "Four Way Handshake".

Comme indiqué dans l'article d'introduction sur TCP, une connexion TCP entre 2 hôtes est définie de manière unique par le couple de "socket" (terme popularisé par l'université de Berkeley).

Établissement de la connexion


Regardons de plus près l'établissement d'une connexion TCP :

Etablissement d'une connexion TCP - Comoe Networks

  1. Le client initie la communication en envoyant un segment dont le drapeau SYN est activé (couramment appelé segment SYN). Il transmet par la même occasion son ISN, qui sera le numéro de séquence de référence pour le transfert de données dans le sens client vers serveur. De même, il indique ses conditions et ses capacités dans les options.
  2. Le serveur envoie alors son segment SYN, dans lequel il confirme avoir bien reçu l'ISN du client ainsi que ses capacités. Il envoie également son ISN ainsi que ses capacités.
  3. Le client confirme avoir bien reçu le segment SYN du serveur. Le transfert de données peut commencer.
Dans la mesure où l'établissement de la connexion doit être aussi fiable que le transfert de données, le drapeau SYN compte pour un octet dans les numéros de séquence.

On peut voir ici la capture de l'établissement d'une connexion avec le logiciel d'analyse réseau de Comoe Networks.
Etablissement d'une connexion TCP - analyse réseau Comoe Networks
Établissement d'une connexion TCP

Terminaison de la connexion


N'importe quel hôte peut fermer la connexion, ce n'est pas forcément le client. Cela dépend plutôt de l'application de la couche supérieure qui utilise le service TCP.
Il est même possible d'avoir une clôture simultanée, même si dans la pratique, c'est plutôt rare.

Terminaison d'une connexion TCP - Comoe Networks
Terminaison classique d'une connexion TCP
  1. L'hôte qui souhaite indiquer la fin de l'envoi de données (dans une situation normale), le signale en envoyant un segment avec le drapeau FIN (couramment appelé segment FIN).
  2. Son correspondant envoie un segment ACK pour confirmer la réception du segment FIN.
  3. Son correspondant envoie lui aussi un segment FIN pour signaler qu'il n'a plus de données à envoyer.
  4. L'hôte envoie un segment ACK à son correspondant pour confirmer la réception de son segment FIN.
De la même façon, pour confirmer la bonne réception du segment FIN, ce dernier compte pour un octet dans les numéros de séquence.

Note : les étapes 1 et 2 n’entraînent pas obligatoirement les étapes 3 et 4 dans la foulée. Le segment FIN indique juste que son émetteur n'a plus de données à envoyer. Le destinataire de ce segment peut lui avoir encore des données à transmettre.

De la même façon, on peut suivre le déroulement de la fermeture d'une connexion TCP ci-dessous :

Fermeture d'une connexion TCP - Comoe Networks
Fermeture d'une connexion TCP


Pour l'hôte qui a initié la terminaison de la connexion, comment savoir que le correspondant a bien recu le segment de l'étape 4 ci-dessus ?

Dans la pratique, c'est impossible. C'est pourquoi il est instauré un temps d'attente durant lequel, la socket sur cet  hôte ne peut être fermée et reste dans l'état CLOSE_WAIT (sur Linux).
On peut le voir ci-dessous pour la connexion TCP/IPv6

root@LAB-NODE2:~# netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address             State     
tcp     0           136       192.168.43.1:22        192.168.43.254:42642    ESTABLISHED
tcp6   1           0           ::1:50516                    ::1:631                            CLOSE_WAIT


Nous verrons plus en détail cet aspect lorsque nous regarderons les différents états d'une connexion TCP.

Merci.

Toutes les copies écrans sont issues du logiciel d'analyse réseau de Comoe Networks.

lundi 1 février 2016

Le protocole TCP


Le standard a été défini par la RFC 793 en 1981. Il se situe dans la couche Transport du modèle OSI (niveau 4).
Il permet :
  • un transport fiable des données,
  • un multiplexage de plusieurs communications simultanées entre 2 machines,
  • un contrôle de flux afin de prévenir les congestions,
  • de les gérer si elles se produisent.
Il est « orienté connexion », car TCP nécessite qu'un certain nombre d'informations soient initialisées et maintenues au cours de la session.
En plus de la détection d'erreur, il est capable de les corriger en organisant la retransmission des segments défectueux ou manquants.

Regardons maintenant comment ces fonctionnalités sont implémentées.

En-tête TCP


Les données transportées par le protocole TCP sont précédées par un en­tête dans chaque segment.
La taille minimale de l'en­tête est de 20 octets (sans options) et au maximum 60 octets. Sa longueur nous est donnée par le champs « Header Length » qui est le nombre de mots de 32 bits de l'en­tête.

L'en­tête doit être un multiple de mots de 32 bits, même avec les options (l'option « padding » est faite pour cela).

en-tête TCP
En-tête TCP


Multiplexage


Les champs « Port Source » et « Port Destination » permettent de spécifier le canal entre les 2 machines et permet plusieurs sessions entre ces 2 machines (multiplexage).

Dans la RFC 793, il est mentionné que le couple « Adresse IP – Port » sur une machine, est appelé « socket ».
Le service est full­-duplex, c'est à dire qu'il peut y avoir un transfert de données dans les 2 sens, indépendamment de l'autre sens.

Séquencement des données


Chaque octet des données à transmettre est numéroté. Codé sur 32 bits, Le numéro de séquence (SEQ) indique la position du premier octet de donnée du segment dans le flux.
Il permet aussi de déterminer les segments dupliqués et de réordonner les données pour la couche supérieure (IP ne garantit pas de transfert ordonné).

Lorsque le drapeau SYN est activé lors de l'établissement de la connexion, le numéro de séquence initial est appelé « ISN » (Initial Sequence Number). Par mesure de sécurité, il ne peut être le chiffre zéro (0), mais il est plutôt déterminé de façon aléatoire.

Le numéro d'acquittement (ACK) permet d'indiquer à l'émetteur le prochain numéro de séquence attendu, pour les numéros inférieurs, il indique ainsi qu'il a bien reçu les données.
Dans le cas contraire, les données manquantes seront retransmises.

On peut voir ici le transfert de données et son acquittement sur le logiciel d'analyse réseau de Comoe Networks.

Exemple de progression du numéro de séquence et de son acquittement
Exemple de progression du numéro de séquence et de son acquittement

Contrôle de flux


Dans le cadre du contrôle de flux, le destinataire des données indique à l'émetteur le nombre d'octet maximum qu'il est prêt à accepter, encore appelée fenêtre de réception.

Le champ « Window » permet de définir cette valeur, le drapeau « ACK » doit être positionné pour que ce champ soit valide.

L'émetteur ne peut alors pas envoyer plus de données que cette valeur sans recevoir d'acquittement.

Cette fenêtre peut changer au cours de la session, ce qui permet aux deux hôtes de pouvoir s'adapter au contexte du ou des réseau(x) utilisé(s).
On peut le voir ici avec la variation de la fenêtre de l'hôte 10.247.96.133 (en rouge).

variation de la fenêtre (Comoe Networks)
Variation de la fenêtre au cours de la connexion

Drapeaux


Il y a actuellement 8 drapeaux (« flags ») définis dans l'en­tête TCP, nous les verrons en détail au fil de notre exploration.
Mais voici une brève présentation :

  • CWR (congestion Window Reduced) : l'émetteur a réduit son taux d'emission,
  • ECE (Explicit Congestion Echo) : Réponse à un message de congestion ECN (Explicit Congestion Notification),
  • URG (Urgent Pointer) : Le champ « Urgent Pointer » est valide. Rarement utilisé,
  • ACK : Le champ « Acknowledgement Number » est valide,
  • PSH (Push) : les données de ce segment devrait être envoyées immédiatement à la couche suppérieure,
  • RST (Reset) : l'émetteur de ce drapeau clôt la connection et n'accepte plus de données,
  • SYN (Synchronisation) : Synchronise les numéros de séquence et l'envoi de certaines options,
  • FIN : l'émetteur de ce drapeau indique qu'il n'a plus de données à envoyer.

Autres


Le champ « Urgent Pointer » dont la valeur doit être ajoutée au champ « Sequence Number », indique la fin de la zone de données urgentes dans le segment. Cette zone doit être traitée en priorité par la couche supérieure.

Afin d'augmenter la fiabilité et la détection d'erreur, un checksum internet est utilisé. Il couvre l'en­-tête TCP et les données transportées, ainsi que quelques champs de l'en-­tête IP (les 2 adresses en particulier et le numéro de protocole tcp).


Fin de cette introduction, à suivre la gestion des connexions.