TCP (Transmission Control Protocol)
1. Introduction à TCP
Le protocole TCP (Transmission Control Protocol) est l'un des protocoles majeurs de la suite TCP/IP utilisée pour l'échange de données sur Internet.
Il se situe au niveau transport dans le modèle TCP/IP et vise à fournir :
- Un service fiable (delivery garanti).
- Un contrôle de flux (flow control).
- Un contrôle de congestion (congestion control).
- Des connexions orientées (connexion logicielle entre deux machines avant l'échange de données).
Dans le modèle OSI, TCP se trouve au niveau 4 (transport).
2. Caractéristiques principales de TCP
- Orienté connexion : Avant tout échange de données, TCP exige qu'une connexion (virtuelle) soit établie entre les deux hôtes.
- Fiable : TCP utilise des numéros de séquence (Sequence Numbers) et des acquittements (Acknowledgments) pour garantir la remise des segments.
- Contrôle de flux : Le destinataire peut ajuster la quantité de données que l'émetteur est autorisé à envoyer (grâce aux champs "Window Size" dans l'en-tête TCP).
- Contrôle de congestion : Des algorithmes comme Slow Start, Congestion Avoidance, Fast Retransmit et Fast Recovery sont utilisés pour contrôler la congestion réseau.
- Segmenté et réassemblé : Les données sont découpées en segments (paquets TCP), numérotés, et réassemblés à la réception dans l'ordre correct.
- Full Duplex : Les données peuvent circuler dans les deux sens simultanément (émission/réception).
3. Le segment TCP : structure et champs importants
Un segment TCP est l'unité de données échangée entre deux hôtes au niveau transport. Les champs les plus importants de l'en-tête TCP (20 octets minimum) sont :
- Source Port (16 bits) : Port source (numéro de port sur la machine qui envoie).
- Destination Port (16 bits) : Port de destination (numéro de port sur la machine qui reçoit).
- Sequence Number (32 bits) : Numéro de séquence du segment, identifiant la position du segment dans le flux de données.
- Acknowledgment Number (32 bits) : Acquittement (confirmation) : indique le prochain numéro de séquence attendu.
- Data Offset (4 bits) : Indique la longueur de l'en-tête TCP.
- Reserved (3 bits) : Réservé pour un usage futur (normalement à 0).
- Flags (9 bits au total) : Bits de contrôle, dont les plus connus sont :
- SYN : Synchronize (utilisé lors de la demande d'établissement de la connexion).
- ACK : Acknowledgment (confirmation).
- FIN : Final (demande de fermeture de la connexion).
- RST : Reset (réinitialisation de la connexion).
- PSH : Push (demande de "pousser" les données vers l'application sans attendre).
- URG : Urgent (indique que certaines données sont urgentes).
- Window Size (16 bits) : Taille de la fenêtre TCP pour le contrôle de flux.
- Checksum (16 bits) : Permet de vérifier l'intégrité du segment.
- Urgent Pointer (16 bits) : Indique le dernier octet urgent, lorsque URG est à 1.
- Options (variable) : Permet d'ajouter des informations supplémentaires (par exemple la taille maximale de segment, MSS).
4. Établissement de la connexion : Three-Way Handshake
4.1 Principe général
Avant que deux machines (par exemple un client et un serveur) puissent échanger des données via TCP, elles doivent établir une connexion. On parle de handshake en trois temps (Three-Way Handshake). Les trois segments échangés contiennent des indicateurs (flags) spécifiques : SYN et ACK.
Étape 1 : SYN
Le client envoie au serveur un segment contenant :
- Le flag SYN = 1 pour indiquer qu'il souhaite établir une connexion.
- Un Sequence Number (généralement un nombre initial pseudo-aléatoire).
- Pas encore d'Acknowledgment Number pertinent à ce stade.
- D'autres paramètres (Window Size, MSS, etc.).
À ce moment, le client se trouve en état SYN_SENT (il attend une réponse du serveur).
Étape 2 : SYN + ACK
Le serveur, qui reçoit la requête SYN, envoie en retour un segment :
- Avec le flag SYN = 1 pour confirmer sa volonté de communiquer.
- Avec le flag ACK = 1 pour acquitter la réception du SYN du client.
- Le Acknowledgment Number est égal au Sequence Number du client + 1. (Le +1 indique qu'on acquitte la séquence initiale et qu'on attend le prochain numéro de séquence du client).
- Le serveur choisit également son propre Sequence Number initial.
Le serveur passe en état SYN_RECEIVED, il attend la finalisation de l'acquittement par le client.
Étape 3 : ACK
Le client, après avoir reçu le segment SYN+ACK, répond :
- Avec le flag ACK = 1 pour acquitter le SYN du serveur.
- Le Acknowledgment Number est égal au Sequence Number du serveur + 1.
- Le client reprend ou continue son Sequence Number.
Une fois ce dernier ACK reçu et validé par le serveur, la connexion est considérée établie. Le client est en état ESTABLISHED, de même que le serveur.
4.2 Récapitulatif schématisé
- Client → Serveur : [SYN, Seq = x]
- Serveur → Client : [SYN, ACK, Seq = y, Ack = x+1]
- Client → Serveur : [ACK, Seq = x+1, Ack = y+1]
État final : La connexion est établie (ESTABLISHED) des deux côtés.
5. Transfert de données
Une fois la connexion établie, chaque hôte peut envoyer des segments de données. Les points clés :
- Numéros de séquence et acquittements : Chaque segment contient un numéro de séquence (Sequence Number). À la réception, on renvoie un acquittement (Acknowledgment Number) indiquant le prochain numéro de séquence attendu.
- Fenêtre glissante (Sliding Window) : La taille de la fenêtre (Window Size) permet de gérer la quantité de données "en vol" qui n'ont pas encore été acquittées.
- Contrôle de flux et de congestion :
- Contrôle de flux : Ajuste la taille de la fenêtre en fonction de la capacité de réception du destinataire.
- Contrôle de congestion : Les algorithmes (Slow Start, Congestion Avoidance, etc.) cherchent à éviter la saturation du réseau en ajustant la vitesse d'envoi.
6. Fermeture de la connexion : Four-Way Handshake
La fermeture d'une connexion TCP est légèrement différente et se fait généralement en quatre échanges (bien qu'il existe un cas simplifié à trois échanges si les deux envois FIN/ACK arrivent en même temps).
- FIN : L'hôte A (client ou serveur) envoie un segment avec le drapeau FIN pour indiquer qu'il a fini d'envoyer des données.
- ACK : L'hôte B acquitte la réception de FIN avec un ACK. (B est toujours en mesure d'envoyer des données s'il en a besoin).
- FIN : Lorsque B termine à son tour l'envoi de données, il envoie un segment avec le drapeau FIN.
- ACK : A acquitte la réception du FIN de B avec un ACK.
Après ce dernier ACK, la connexion est totalement fermée des deux côtés.
En résumé
Le protocole TCP se caractérise par :
- Son mode orienté connexion grâce au Three-Way Handshake.
- Sa fiabilité (numéros de séquence, acquittements, retransmissions).
- Son contrôle de flux et de congestion intégrés.
Tous ces mécanismes permettent d'assurer un transfert de données fiable et sécurisé entre applications sur un réseau IP.
En résumé :
- Établissement de la connexion : 3 segments échangés (SYN, SYN+ACK, ACK).
- Échange de données : Fenêtre glissante, acquittements, retransmissions si besoin.
- Fermeture de la connexion : 4 segments (FIN, ACK, FIN, ACK) dans le scénario classique.
C'est grâce à cette fiabilité de bout en bout que TCP est utilisé pour des applications sensibles aux pertes (HTTP, FTP, SMTP, etc.).
Pour des applications en temps réel ou tolérantes à la perte (par exemple la voix sur IP, la vidéo en streaming), on préférera parfois UDP, qui ne fournit pas la même fiabilité ni le même contrôle de flux.