# Les réseaux informatiques/La couche transport : UDP et TCP

Les protocoles de la couche transport les plus connus sont les protocoles TCP et UDP. Le protocole UDP est le plus simple des deux, alors que TCP est celui qui a le plus de fonctionnalités.

## Les fonctions de la couche transport

Les fonctions de la couche transport sont multiples, mais les fonctions principales sont au nombre de deux :
* Découper des données, de taille variable, en paquets de taille fixe.
* Identifier les programmes destinataire/émetteur de la donnée.

### La segmentation

D'ordinaire, les ordinateurs s'échangent des données de taille variable et non-bornée : des fichiers, des pages web, des images, etc. Cependant, on a vu que le matériel réseau ne gère que des paquets de données, qui ont une taille maximale. Pour résoudre cette incompatibilité apparente, on est obligé de les découper en paquets de taille fixe, qui ne peuvent pas dépasser une taille maximale (le MTU). Dans le jargon du réseau, ces paquets de taille fixe de couche transport sont appelées des datagrammes ou des segments.
Lors de l'envoi d'une donnée sur le réseau, l'équipement réseau doit segmenter les datagrammes en paquets et les envoyer sur le réseau individuellement. Un problème avec cette solution est que les segments/datagrammes sont envoyés séparément et qu'ils peuvent arriver dans le désordre. UDP et TCP gèrent ce problème différemment. UDP ignore totalement l'ordre des datagrammes et ne cherche pas à les remettre dans l'ordre à la réception. Cela marche bien pour certaines données, comme la transmission de la téléphonie par IP, ou un flux vidéo. De son côté, TCP dispose de mécanismes pour remettre les segments dans l'ordre d'envoi et reconstituer fidèlement la donnée transmise.

### L'identification des processus émetteur/récepteur

Quand un ordinateur reçoit un paquet, il doit savoir à quel programme est destiné ce paquet : est-il destiné au navigateur web, à un jeu vidéo, ou au service de mise à jour de l'OS ? Pour cela, on définit ce qu'on appelle des ports logiciels : ce sont de simples numéros, que chaque application va réserver en émettant des données. Pour comprendre ce qu'est un port logiciel, on peut faire une analogie avec le courrier. Quand quelqu'un envoie une lettre, il ne précise pas seulement l'adresse postale, mais aussi la personne à laquelle elle est destinée, au cas où plusieurs personnes vivent à la même adresse. Dans le domaine du réseau, la lettre est un paquet réseau, le destinataire et l'émetteur de la lettre sont des programmes/processus, l'adresse postale est équivalente à l'adresse IP et le nom du destinataire est le port logiciel.
Les numéros de ports actuels font deux octets (16 bits), ce qui donne 65536 ports différents. L'IANA, l'organisme qui gére les noms de domaine, classe ces ports en trois types, illustrés dans le tableau ci-dessous.
| Ports dédiés | 0 à 1023 | Ports réservés à des fonctions bien précises. 21: File Transfer Protocol (FTP) 22: Secure Shell (SSH) 25: Simple Mail Transfer Protocol (SMTP) 53: Domain Name System (DNS) service 80: Hypertext Transfer Protocol (HTTP) 110: Post Office Protocol (POP3) 143: Internet Message Access Protocol (IMAP) 443: HTTP Secure (HTTPS) |
| Ports réservés | 1024 à 49151 | Ports réservés à des applications propriétaires. |
| Ports dynamiques | 49152 à 65535 | Ports libres, non-réservés, utilisables à la demande. |
Les pare-feu permettent d'interdire la communication sur certains ports et de filtrer les segments/datagrammes selon le numéro de port. Ils laissent passer les segments/datagrammes sur les ports logiciels autorisés, mais ils détruisent les segments/datagrammes envoyés/reçus sur les ports interdits. Cela permet d'éviter la réception ou l'envoi de segments/datagrammes dangereux, ou du moins non-souhaités. Par exemple, on peut configurer un pare-feu pour n'autoriser que les ports 80, 25, 110, 143 et 443 : seule la consultation de sites web et de mail sera possible. En général, les ports dynamiques font partie de ceux filtrés en priorité.

## Le protocole UDP

UDP se contente du minimum syndical qu'on attend d'un protocole de couche transport : il gère les ports logiciels, mais ne vérifie pas que la donnée est bien arrivée à bon port, pas plus qu'il ne remet les datagrammes dans leur ordre d'envoi. Il est donc très adapté dans les situations où on se moque que les données arrivent dans l'ordre et où les pertes de données sont acceptables. Typiquement, un flux vidéo, un podcast, des jeux vidéos en ligne sont des utilisations les plus courantes de UDP.
UDP se contente d'ajouter un en-tête particulièrement simple aux datagrammes. Cet en-tête contient diverses informations, toutes codées sur deux octets. Il a une taille fixe, de 64 bits, soit 8 octets, quel que soit le paquet. On y trouve naturellement le port de l'application émettrice ainsi que le port de destination, deux informations essentielles pour tout protocole de la couche transport. L'en-tête contient aussi la longueur totale du paquet, en-tête compris, et des octets de contrôle d'erreur optionnels.
| Port Source (16 bits) | Port Destination (16 bits) |
| Longueur (16 bits) | Somme de contrôle (16 bits) |
| Données (longueur variable) ||
La seule subtilité de ce protocole tient dans le calcul de la somme de contrôle, que nous n'aborderons pas ici. Nous allons simplement dire que ce calcul se base sur l'en-tête IP, chose qui est en contradiction avec l'indépendance des couches ! Heureusement, UDP et IP sont pris en charge par le système d'exploitation, ce qui réduit quelque peu les problèmes engendrés par cette méthode de calcul.

## Le protocole TCP

Le protocole TCP peut être vu comme un UDP sous stéroïdes. Non seulement il utilise des ports logiciels, mais il ajoute aussi des fonctionnalités qu'UDP n'a pas. Parmi ces fonctionnalités, on trouve la gestion des connexions, les accusés de réception et la détection des pertes de données et la gestion de l'ordre de réception. Ces fonctionnalités sont indispensables pour de nombreuses applications, comme les navigateurs web, le transfert de mails, et bien d'autres. Il n'est donc pas étonnant que TCP soit le protocole de couche transport le plus utilisé, loin devant UDP.

### Le séquencement des paquets

Comme dit plus haut, TCP doit remettre les segments dans l'ordre pour reconstituer la donnée transmise. Le moyen le plus simple pour cela est de réutiliser la technique de la fenêtre glissante vue il y a quelques chapitres. Pour rappel, cette méthode demande que les paquets soient numérotés selon leur ordre d'envoi. Si un datagramme est découpé en N paquets, on peut simplement numéroter chaque paquet suivant son ordre dans la donnée initiale : le premier paquet sera le paquet numéro 1, le second paquet le numéro 2, etc. Ce numéro est transmis avec le paquet en question, à côté des numéros de ports logiciels.
Lors de la réception, l'ordinateur doit regrouper plusieurs paquets en un seul datagramme. Pour cela, il va accumuler les paquets reçus dans une portion de mémoire, la fenêtre TCP. Cette fenêtre permet d'utiliser des mécanismes pour détecter ou empêcher les pertes de données. Seulement, la fenêtre a une taille limitée, qui est comprise entre 2 et 65536 octets. Sans précaution particulière, il est possible que la fenêtre TCP devienne pleine, notamment lors de transferts de datagrammes imposants. Pour limiter la catastrophe, le récepteur peut émettre un paquet qui indique à l'émetteur la place disponible dans sa fenêtre. Pour cela, les paquets TCP contiennent un champ nommé Window, qui indique combien d'octets peuvent encore être envoyés avant que la fenêtre soit totalement remplie (autrement dit, la place libre en octets dans la fenêtre).
Les accusés de réception permettent de savoir si un paquet envoyé a bien été reçu. Lorsque le serveur reçoit un paquet, il envoie à l'émetteur un paquet ACK qui indique qu'il a bien reçu le paquet en question. Ces accusés de réception permettent de savoir si une donnée a été perdue lors de son transfert, que celle-ci n'est pas arrivée à destination à temps et a disparu. De telles pertes de données arrivent assez souvent, pour des raisons diverses. Chaque accusé de réception contient un numéro de séquence, qui indique que tous les paquets situés avant ce numéro de séquence ont été reçus : il permet donc d'accuser la réception de plusieurs paquets en même temps. Précisément, la fenêtre TCP commence au premier paquet non-acquitté, et contient tous les paquets suivants (acquittés ou non). La fenêtre TCP contient donc des paquets acquittés, des paquets non acquittés, et de l'espace vide.
Avec les accusés de réception, on sait qu'une donnée a disparu si on n'a pas reçu d'accusé de réception après un certain temps. Si une donnée est déclarée comme perdue, il suffit de la renvoyer en espérant que cette fois sera la bonne. Reste que la durée avant qu'on considère qu'un paquet est perdu varie suivant les circonstances. Tout dépend en réalité du serveur, de sa distance, du temps mis à transférer les données, et d'autres paramètres. Une donnée trop courte entraînera beaucoup de renvois de données inutiles, alors qu'une donnée trop longue fera attendre le client inutilement. Déterminer la durée idéale se fait par divers algorithmes logiciels, intégré dans le système d'exploitation.

### Les connexions TCP

TCP est un protocole qui est dit en mode connecté. Ce qui signifie que tout transfert de donnée doit être précédé d’une négociation entre l'émetteur et le récepteur, cette négociation étant appelée une connexion. La connexion doit être ouverte pour que l'échange de donnée ait lieu et elle doit être fermée pour que l'échange de donnée cesse. La connexion s'effectue en trois étapes :
* le client initie la connexion au serveur en envoyant un paquet spécial (SYN) ;
* le serveur répond qu'il autorise la connexion avec un autre paquet spécial (SYN-ACK) ;
* le client envoie un accusé de réception au serveur.
Lors de la phase d'envoi de données, l'émetteur envoie des paquets de type DATA, et le serveur répond par des accusés de réception.
La déconnexion s'effectue en quatre étapes. Dans les grandes lignes, le serveur et le client doivent se déconnecter chacun de leur côté. Chaque demande de déconnexion d'un ordinateur est autorisée par un accusé de réception. Pour se déconnecter, ils doivent envoyer un paquet spécial nommé FIN. Dans les grandes lignes, voici comment a lieu la déconnexion :
* un ordinateur envoie une demande de déconnexion ;
* l'autre ordinateur reçoit celle-ci et renvoie l'ACK qui va avec ;
* ce dernier envoie lui aussi une demande de déconnexion ;
* et son comparse reçoit celle-ci et renvoie l'ACK qui va avec.

### Les segments TCP

Un segment TCP est composé d'un en-tête TCP suivi par le paquet de données de la couche application/session/présentation. Il a une taille variable, en raison de la présence d'un champ Options de taille variable à sa toute fin. Sa taille est systématiquement un multiple de 32 bits. Sa taille minimum est de 20 octets (absence de champ Options), et sa taille maximum est de 60 octets (champ Options le plus rempli possible).
Tout segment TCP commence naturellement par les ports source et destination.
Les deux champs suivants servent pour la gestion de la fenêtre glissante.
* Le numéro de séquence dit quel le numéro du segment envoyé.
* Le numéro d'accusé de réception sert dans les réponses ACK du récepteur : il indique quel est le numéro du segment accusé.
Le champ suivant donne la taille de l'en-tête, exprimée en mots de 32 bits. Il est nécessaire car l'en-tête TCP a une taille variable. Ce champ a une taille de 4 bits, de qui fait 16 valeurs différentes. allant de 0 à 15. Sachant que la taille de l'en-tête est exprimée en mots de 32 bits/4 octets, cela fait un en-tête qui fait entre 0 et 60 octets (15 * 4). Mais les valeurs inférieures à 5 sont interdites, ce qui fait un minimum de 5*4 = 20 octets. On retrouve les valeurs mentionnées au début de cette section.
Les indicateurs qui suivent sont des bits qui indiquent le type du paquet, son utilité. Ils servent notamment à dire si le paquet est un paquet SYN, un paquet ACK (accusé de réception), etc. Il est composé des 8 bits suivants :
* CWR : bit en lien avec la gestion de la congestion réseau ;
* ECE ('Explicit Congestion Notification) : idem ;
* URG : indique que le segment est de type urgent ;
* ACK : indique que le segment est un accusé de réception ;
* PSH : lié à la fonction PUSH ;
* RST : réinitialise la connexion ;
* SYN : indique que le segment est de type SYN (demande de connexion) ;
* FIN : fermeture de connexion, l'émetteur n'a plus rien à envoyer.
Le champ window size indique la taille de la fenêtre glissante, à savoir le nombre de segments pouvant être reçus sans accusés de réception.
Le reste des champs est une somme de contrôle, un champ qui indique que certaines données sont urgentes à traiter, et quelques bits de bourrage ou d'options.