2 Le protocole TCP
TCP, qui signifie Transmission Control Protocol, Protocole de contrôle de transmission en anglais, est un protocole de la couche transport défini par les RFC 793, 1122, 1323 et aussi 2581.
Tout comme UDP, le but de TCP est d’assurer la transmission des SDU. Tout comme UDP, TCP nous offre des services de multiplexage et démultiplexage. La différence se situe fondamentalement dans ce que nous avons appelé « principe de transmission fiable »
UDP, comme nous l’avons vu, est un protocole orienté transaction, par conséquent, il ne peut garantir que les données transmises arriveront à destination. TCP, en revanche, étant un protocole orienté-connexion par le principe de la poignée de main (handshake) établit une connexion au préalable, entre les processus avant de débuter la transmission.
TCP offre des services de détection d’erreurs dans les transmissions, mais n’a malheureusement aucune propriété de « réparation » de ces données dont l’intégrité est affectée
L’état de connexion avec TCP
Nous avons dit que TCP était un protocole orienté-connexion, mais qu’est ce que ca veut dire concrètement ? Pour qu’il y’ait échange ou transmission entre deux applications utilisant TCP comme protocole de transport, il faut établir une connexion TCP. La poignée de main
(handshake), ou le genre de connexion que TCP établit est aussi appelé « three-way handshake ». Cela veut dire que la connexion se fait en trois étapes. En effet, TCP est un protocole fullduplex, ce qui implique qu’une communication bidirectionnelle et simultanée est possible dans une connexion TCP.
Etapes de connexion
Supposons que 2 processus de deux hôtes différents veulent s’échanger des informations. Il faut, bien entendu, qu’un hôte initialise la connexion (demande à l’autre hôte la permission de communiquer). Comme vous le savez, l’hôte qui initialise la connexion est le client, et celui qui accepte est le serveur.
Dans le cas où une connexion TCP est initialisée au même moment, les deux applications (ou processus) sont à la fois client et serveur.
Le client et le serveur s’échangent donc des unités de données appelées des segments TCP (TCP segments en anglais) qui sont composés bien entendu d’un entête et d’un espace de données (data area en anglais).
Nous considérons 6 paramètres extrêmement importants pour saisir la procédure d’établissement d’une connexion TCP entre un client et un serveur. Ces paramètres sont :
1.Etat du serveur : Définit dans quel état se trouve le serveur dans l’établissement de la connexion
2.Etat du Client : Définit dans quel état se trouve le client dans l’établissement de la connexion
3.Segment transmis par le client : la constitution du segment TCP constitué d’un entête et d’une donnée que les deux s’échangent le long de la procédure
4.Segment transmis par le serveur : la constitution du segment TCP constitué d’un entête et d’une donnée que les deux s’échangent le long de la procédure
5.Etat de transition du client : définit simplement un état entre deux états. :-‘ C’est maladroit de le dire ainsi, grossièrement, lorsque le serveur par exemple, passe de l’état fermé (closed) à l’état ouvert, l’état de transition ici est l’état d’écoute (Listen). En effet pour pouvoir ouvrir ou initialiser une connexion, il faut bien que le serveur écoute le port auquel il est attaché. On dit que cet état d’écoute est un état de transition.
6.Etat de transition du serveur : définit simplement un état entre deux états. :-‘ C’est maladroit de le dire ainsi, grossièrement, lorsque le serveur par exemple, passe de l’état fermé (closed) à l’état ouvert, l’état de transition ici est l’état d’écoute (Listen). En effet pour pouvoir ouvrir ou initialiser une connexion, il faut bien que le serveur écoute le port auquel il est attaché. On dit que cet état d’écoute est un état de transition.
-Le terme client se réfère à l’application ayant initialisée la demande de connexion,
-Le terme serveur se réfère à l’application réceptrice de cette demande.
Etape 1 : Pour faire une demande d’initialisation de connexion, le client envoi un segment TCP qui ne contient QUE l’entête. Il est important de noter que le premier segment TCP envoyé dans le three-way handshake n’a aucun payload, mais seulement un entête
L’entête contient un flag (drapeau) de synchronisation : Flag SYN (avec SYN diminutif de SYNchroniser). L’entête contient aussi le numéro de port TCP du serveur, ce qui est logique, car le numéro de port, est pour une application, ce que l’adresse IP est pour un hôte.
Après l’envoi de ce premier segment TCP, le client se met dans un état SYN_SENT. (SYN_SENT signifie que le segment TCP ayant le flag SYN a été envoyé).
Le serveur de son côté, est en état Listen. Il écoute sur le numéro de port, attendant une demande de connexion. Dès qu’Il reçoit le segment TCP envoyé par le client (celui qui n’a qu’un entête et un flag SYN), il envoie un segment TCP vers le client pour confirmer la
réception du flag SYN. Ce segment également n’est constitué que d’un entête portant deux flags : SYN (chronize) et ACK(nowledge). Finalement, le serveur change d’état et passe de Listen à SYN_RCVD. RCVD est le diminutif de received (reçu en anglais). Cet état confirme que le segment TCP portant le flag SYN a été reçu.
SYN ou ACK sont deux flags importants dans l’entête d’un segment TCP. Quand le client ou le serveur envoi un SYN ou ACK, ça veut dire que le bit de ce flag est allumé (mis a 1) dans l’entête.
Etape 2 et 3 : Le client reçoit le segment TCP et analyse l’entête. Il remarque qu’il contient les flags SYN et ACK, qui sont pour lui des indicateurs que le serveur a accepté d’initialiser une connexion avec lui. La connexion passe donc de Closed (fermée) à established (établie).
Il conclut la procédure en envoyant un segment TCP avec le flag ACK au serveur. Ce dernier ACK envoyé est la conclusion de la procédure et va également mettre le serveur en état de connexion établie (established state).
Maintenant que les deux (client et serveur) ont établi une connexion, cette dernière peut être utilisée pour transmettre des informations
Etant donné que dans notre scénario c’est le client qui est responsable d’avoir fait une demande de connexion, on dit que le client effectue une connexion active (active open) alors que le serveur n’a fait qu’accepter l’invitation, ce dernier effectue une connexion passive (passive open). Les deux figures suivantes montrent la procédure:


Comment TCP s'assure que les données sont bien arrivées ?
Grâce à des numéros de
séquence ! Lorsqu'une connexion TCP est initialisée, un nombre est généré : l'ISN (cela peut être un zéro ou un nombre aléatoire suivant les systèmes). Quand des données sont envoyées, ce numéro de séquence est augmenté d'autant d'octets de données qui sont envoyés.