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 :
- 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.
- 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.
- Le client confirme avoir bien reçu le segment SYN du serveur. Le transfert de données peut commencer.
On peut voir ici la capture de l'établissement d'une connexion avec le logiciel d'analyse réseau de 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 classique d'une connexion TCP |
- 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).
- Son correspondant envoie un segment ACK pour confirmer la réception du segment FIN.
- Son correspondant envoie lui aussi un segment FIN pour signaler qu'il n'a plus de données à envoyer.
- L'hôte envoie un segment ACK à son correspondant pour confirmer la réception de son segment FIN.
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 |
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.
Aucun commentaire:
Enregistrer un commentaire