Une norme technique nommée « RFC 9293 » a été publiée le 18 août 2022. Elle spécifie le protocole Internet TCP (Transmission Control Protocol), protocole par lequel passe la majorité des octets qui circulent sur le réseau. La précédente version de cette même norme datait de… 1981. Qu’est-ce que TCP, pourquoi est-il si important et à quoi sert cette nouvelle version de la norme ?
Oui, c’est un protocole vieux de plus de quarante ans qui traite la majorité des données envoyées sur l’Internet. Pour comprendre son rôle, il faut d’abord le situer dans l’ensemble des autres protocoles, ces règles que doivent suivre les logiciels pour communiquer. En simplifiant beaucoup, on peut dire que la communication sur l’Internet nécessite un médium physique (par exemple une fibre optique), un mécanisme permettant aux paquets de données d’aller d’un routeur à un autre jusqu’à leur destination, un moyen de corriger les imperfections du réseau et des règles spécifiques à l’application utilisée. TCP traite le troisième point : il corrige les imperfections du réseau. Le mécanisme qui permet aux paquets de données d’aller d’un routeur à un autre se nomme IP, pour Internet Protocol. Ces paquets IP, ces groupes d’octets circulant sur l’Internet, n’arrivent pas forcément à destination : par exemple, si un routeur doit envoyer des paquets sur une ligne lente, et que sa mémoire où les paquets attendent devient pleine, le routeur laisse tomber les paquets. Ce n’est pas une anomalie, c’est le fonctionnement normal de l’Internet. Mais, évidemment, l’utilisateur ne veut pas qu’à l’arrivée il manque des bouts de son fichier ! Le rôle de TCP est donc de faire en sorte que l’application reçoive toutes les données.
C’est ce qu’on nomme un protocole de transport et TCP est le plus utilisé sur l’Internet. Les deux autres les plus répandus sont UDP (User Datagram Protocol), qui n’essaie pas d’assurer la fiabilité du transport, certaines applications préférant s’en occuper elle-mêmes, et QUIC, plus récent et qui a pris une part du « marché » à TCP mais reste minoritaire. TCP est tellement crucial au bon fonctionnement de l’Internet que l’ensemble des protocoles permettant à ce réseau de fonctionner est souvent nommé « TCP/IP », du nom des deux plus importants protocoles.
Comment TCP sauve les données
IP est rapide car il ne nécessite pas que les deux machines qui communiquent, ou les routeurs intermédiaires, mémorisent ce qui se passe. On envoie le paquet à l’étape suivante et on l’oublie. Mais cette simplicité et cette rapidité se paient d’un manque de fiabilité. Qu’un parasite électrique survienne au mauvais moment et le paquet est détruit. Qu’un routeur soit surchargé et il laisse tomber les paquets. TCP, contrairement à IP, va donc mémoriser ce qui se passe. Chaque octet transmis a un numéro d’ordre, l’émetteur garde une copie des paquets envoyés, le récepteur envoie des accusés de réception (« j’ai reçu les octets jusqu’au numéro 39781 ») et, si au bout d’un temps donné, l’accusé de réception ne vient pas, TCP réémet (« j’ai envoyé jusqu’au 4025, il n’a reçu que jusqu’à l’octet 3978, je vais réémettre les octets 3979 à 4025 »). TCP fonctionne uniquement dans les machines émettrices et réceptrices, pas dans les routeurs intermédiaires, qui ne connaissent qu’IP2.
Mais il ne s’agit pas de réémettre bêtement ! Ni d’ailleurs d’envoyer le plus d’octets possible sans savoir s’ils passeront. L’Internet est un réseau partagé, et il est important de ne pas contribuer à sa congestion. TCP a donc un autre rôle : veiller en permanence à ne pas envoyer davantage d’octets que ce que le réseau (et l’application sur la machine distante) peuvent traiter. Des algorithmes, portant des noms comme BIC, Cubic, New Reno, vont se livrer à des calculs assez complexes à partir des données disponibles, pour limiter l’envoi d’octets. C’est une tâche difficile, car on souhaite préserver le réseau, qui est un bien commun, tout en maximisant les performances.
TCP ne sert pas qu’à réparer les pertes de paquet, il gère aussi d’autres comportements du réseau, comme le fait que les paquets IP n’arrivent pas forcément dans l’ordre et qu’il faut les remettre correctement avant de les transmettre à l’application.
Figure 1 : Vu par le logiciel Wireshark, une connexion TCP complète. Les trois premiers paquets ouvrent la connexion (« triple poignée de mains »). ACK est un accusé de réception.
L’ancien RFC
Les normes techniques de l’Internet sont décrites dans des documents nommés les RFC3. Le premier RFC décrivant TCP portait le numéro 7614 et avait été publié en 1980, époque où l’Internet était bien plus petit qu’aujourd’hui, mais déjà très important pour ses utilisateurs. Rapidement, le RFC 761 a été remplacé par le RFC 793, qui a duré plus de quarante ans. On voit que TCP est un protocole très ancien, en temps Internet.
Ceci dit, pendant ces quarante ans, TCP n’est pas resté figé. Les algorithmes de lutte contre la congestion se sont sans cesse perfectionnés5, des extensions à TCP sont venues enrichir son comportement sur certains points, et bien sûr les mises en œuvre de TCP se sont beaucoup améliorées. Toutefois, les extensions ajoutées compliquaient la tâche de ceux et celles qui lisaient les RFC, par exemple pour programmer une mise en œuvre de TCP. Au bout d’un moment, il fallait donc reprendre l’ancienne norme et la mettre à jour.
Le nouveau RFC
L’organisme qui produit les normes techniques de l’Internet se nomme l’IETF (Internet Engineering Task Force). Le travail de mise à jour de TCP a commencé en 2013, mais n’a officiellement démarré à l’IETF qu’en 2015. On voit que cette mise à jour a été un long et difficile travail. L’IETF fonctionne essentiellement au consensus et il y avait beaucoup de détails à régler. Et puis vous imaginez bien qu’on ne touche pas facilement à ce qui est un des protocoles les plus critiques de l’Internet.
Figure 2 : L’évolution du futur RFC, et ses 28 versions
Le cahier des charges n’était évidemment pas de changer en profondeur TCP. Notamment, il était crucial que les programmes qui mettaient en œuvre TCP en suivant le RFC 793 puissent interopérer sans problèmes avec ceux qui vont suivre le nouveau RFC. Il n’y a donc pas de « TCP version 2 », le comportement de TCP reste le même, le nouveau RFC est surtout une nouvelle rédaction, et la correction de nombreux problèmes qui se manifestent dans des cas limites.
Conclusion
TCP est indiscutablement un immense succès. Par exemple, vous avez certainement en ce moment dans votre poche un appareil qui a plusieurs connexions TCP en cours avec différentes machines sur l’Internet. Malgré le relativement rapide décollage de QUIC, TCP reste le principal protocole de transport de l’Internet. La base installée est tellement énorme, du petit objet connecté aux plus gros supercalculateurs, la disponibilité de mises en œuvre de TCP, testées et optimisées, est telle qu’il est probable que TCP restera longtemps un protocole crucial. Encore quarante ans ?
1 – Cet article est évidemment très simplifié. Dans la réalité, on n’envoie pas le numéro d’ordre de l’octet mais une valeur qui est la somme de ce numéro d’ordre et d’un nombre choisi au démarrage. De même, il existe de nombreuses optimisations de TCP qui modifient plus ou moins l’algorithme très simple présenté ici. Et l’accusé de réception contient en fait le numéro du prochain octet attendu, pas celui du dernier reçu.
2 – Là encore, l’évolution de l’Internet a compliqué les choses. Le routeur le plus proche de vous, la « box » de votre opérateur, fait des opérations plus complexes et ne se contente pas, hélas, de passer les paquets IP le plus vite possible.
3 – Cet acronyme avait autrefois une signification, mais son usage a évolué et la signification a changé. Notez d’ailleurs que c’est la même chose pour QUIC.
4 – Avant cela, IP et TCP étaient fusionnés dans un protocole unique. Les années 1980-1981 ont vu la séparation de ces deux protocoles.
5 – C’est un domaine de recherche très actif, avec de nombreux articles scientifiques publiés.