Zoom sur TCP, le Protocole de Contrôle de Transmission

Transmission Control Protocol (TCP ou protocole de contrôle de transmissions) est un protocole de transport fiable en mode connecté.

TCP est utilisé approximativement pour 95 % de tout le trafic Internet. Les applications les plus courantes qui utilisent TCP sont HTTP/HTTPS (World Wide Web), SMTP/POP3/IMAP (messagerie) et FTP (transfert de fichiers).

Le mode connecté est l’établissement d’une session de communication entre deux parties qui veulent échanger des données. Cette session comporte un début, une fin et une validation (vérification des erreurs), classiquement un identifiant un mot de passe. Elle correspond à la couche de session du modèle OSI (située entre les couches « présentation » et « transport »).

Dans le modèle Internet, aussi appelé modèle TCP/IP, TCP est situé au-dessus de IP. Dans le modèle OSI, il correspond à la couche transport, intermédiaire entre la couche réseau et la couche session. Les applications transmettent des flux de données sur une connexion réseau. TCP découpe le flux d’octets en segments dont la taille dépend de la MTU (Unité de Transmission Maximale) de la couche de liaison de données.

Une session TCP fonctionne en trois phases :

  • l’établissement de la connexion ;
  • les transferts de données ;
  • la fin de la connexion.

 

La connexion TCP : le three way handshake

Selon le protocole de communication TCP, une connexion entre deux hôtes s’établit en trois étapes : c’est le three-way handshake. Pendant la phase d’établissement de la connexion, des paramètres comme le numéro de séquence sont initialisés afin d’assurer la transmission fiable (sans perte et dans l’ordre) des données.

En informatique, en télécommunications et dans les domaines associés, le handshaking (ou handshake ; en français, établissement d’une liaison1) est un processus automatisé de négociation qui établit les paramètres d’une communication entre deux entités avant que la communication commence.

Comme son nom l’indique, le three-way handshake se déroule en trois étapes :

  1. SYN : Le client qui désire établir une connexion avec un serveur va envoyer un premier paquet SYN (« synchronized ») au serveur. Le numéro de séquence de ce paquet est un nombre aléatoire A.
  2. SYN-ACK : Le serveur va répondre au client à l’aide d’un paquet SYN-ACK (« synchronize, acknowledge »). Le numéro du ACK est égal au numéro de séquence du paquet précédent (SYN) incrémenté de un (A + 1) tandis que le numéro de séquence du paquet SYN-ACK est un nombre aléatoire B.
  3. ACK : Pour terminer, le client va envoyer un paquet ACK au serveur qui va servir d’accusé de réception. Le numéro de séquence de ce paquet est défini selon la valeur de l’acquittement reçu précédemment (par exemple : A + 1) et le numéro du ACK est égal au numéro de séquence du paquet précédent (SYN-ACK) incrémenté de un (B + 1).

 

Le transfert de données

Pendant la phase de transferts de données, certains mécanismes clefs permettent d’assurer la robustesse et la fiabilité de TCP. En particulier, les numéros de séquence sont utilisés afin d’ordonner les segments TCP reçus et de détecter les données perdues, les sommes de contrôle permettent la détection d’erreurs, et les acquittements ainsi que les temporisations permettent la détection des segments perdus ou retardés.

La somme de contrôle ou checksum en anglais, parfois appelée « empreinte », est un nombre qu’on ajoute à un message à transmettre pour permettre au récepteur de vérifier que le message reçu est bien celui qui a été envoyé.

Grâce aux numéros de séquence et d’acquittement, les systèmes terminaux peuvent remettre les données reçues dans l’ordre à l’application destinataire.

Les numéros de séquence sont utilisés pour décompter les données dans le flux d’octets. On trouve toujours deux de ces nombres dans chaque segment TCP, qui sont le numéro de séquence et le numéro d’acquittement. Le numéro de séquence représente le propre numéro de séquence de l’émetteur TCP, tandis que le numéro d’acquittement représente le numéro de séquence du destinataire. Afin d’assurer la fiabilité de TCP, le destinataire doit acquitter les segments reçus en indiquant qu’il a reçu toutes les données du flux d’octets jusqu’à un certain numéro de séquence.

Une somme de contrôle sur 16 bits, constituée par le complément à un de la somme complémentée à un de tous les éléments d’un segment TCP (en-tête et données), est calculée par l’émetteur, et incluse dans le segment émis. Le destinataire recalcule la somme de contrôle du segment reçu, et si elle correspond à la somme de contrôle reçue, on considère que le segment a été reçu intact et sans erreur.

La perte d’un segment est gérée par TCP en utilisant un mécanisme de temporisation et de retransmission. Après l’envoi d’un segment, TCP va attendre un certain temps la réception du ACK correspondant. Un temps trop court entraîne un grand nombre de retransmissions inutiles et un temps trop long ralentit la réaction en cas de perte d’un segment.

Dans les faits, le délai avant retransmission doit être supérieur au RTT (round trip time) moyen d’un segment, c’est-à-dire au temps que prend un segment pour effectuer l’aller-retour entre le client et le serveur. Comme cette valeur peut varier dans le temps, on « prélève » des échantillons à intervalle régulier et on en calcule une moyenne pondérée

Chaque partenaire dans une connexion TCP dispose d’un tampon de réception dont la taille n’est pas illimitée. Afin d’éviter qu’un hôte ne surcharge l’autre, TCP prévoit plusieurs mécanismes de contrôle de flux. Ainsi, chaque segment TCP contient la taille disponible dans le tampon de réception de l’hôte qui l’a envoyé. En réponse, l’hôte distant va limiter la taille de la fenêtre d’envoi afin de ne pas le surcharger.

 

Fermeture de la connexion

La phase de terminaison d’une connexion utilise un handshaking en quatre temps, chaque extrémité de la connexion effectuant sa terminaison de manière indépendante. Ainsi, la fin d’une connexion nécessite une paire de segments FIN et ACK pour chaque extrémité.

 

Ports TCP

Le numéro de port est utilisé par TCP (et par UDP) pour identifier les applications, c’est-à-dire pour distinguer les différents interlocuteurs. À chaque extrémité (client/serveur) de la connexion TCP est associé un numéro de port sur 16 bits (de 1 à 65535) assigné à l’application émettrice ou réceptrice. Ces ports sont classés en trois catégories :

  • Les ports bien connus, assignés par l’IANA (Internet Assigned Numbers Authority) dans la plage 0-1023 et qui sont souvent utilisés par des applications bien connues qui fonctionnent en tant que serveur et sont en attente de connexions comme FTP (port 21), SSH (port 22), Telnet (23), SMTP (25), HTTP (80), POP3 (110) ;
  • Les ports enregistrés généralement utilisés par des applications utilisateur comme ports sources éphémères pour se connecter à un serveur, mais qui peuvent également identifier des services non enregistrés par l’IANA ;
  • Les ports dynamiques/privés qui peuvent aussi être utilisés par des applications utilisateur, mais plus rarement. Ils n’ont pas de sens en dehors d’une connexion TCP particulière.