Next: Les applications.
Up: Les protocoles TCP et
Previous: Le protocole UDP.
Contrairement à UDP, TCP est un protocole qui procure un service de flux
d'octets orienté connexion et fiable.
Les données transmises par TCP sont encapsulées dans des datagrammes IP
en y fixant la valeur du protocole à 6.
Le terme orienté connexion signifie que les applications dialoguant
à travers TCP sont considérées l'une comme un serveur , l'autre
comme un client , et qu'elles doivent établir une connexion avant de
pouvoir dialoguer (comme dans le cas de l'utilisation du téléphone).
Les ordinateurs vérifient donc préalablement que le transfert est autorisé,
que les deux machines sont prêtes en s'échangeant des messages spécifiques.
Une fois que tous les détails ont été précisés, les applications sont
informées qu'une connexion a été établie et qu'elles peuvent commencer
leurs échanges d'informations.
Il y a donc exactement deux extrémités communiquant l'une avec l'autre
sur une connexion TCP
.
Cette connexion est bidirectionnelle simultanée (full duplex )
et composée de deux flots de données indépendants et de sens contraire.
Il est cependant possible d'inclure dans l'en-tête de segments TCP d'une
communication de A vers B des informations relatives à la communication
de B vers A.
Cette technique de superposition (piggybacking ) permet de réduire
le trafic sur le réseau.
Tout au long de la connexion, TCP échange un flux d'octets
sans qu'il soit possible de séparer par une marque quelconque
certaines données.
Le contenu des octets n'est pas du tout interprété par TCP, c'est donc
aux applications d'extrêmité de savoir gérer la structure du flot de
données.
Si elles sont trop volumineuses, les données à transmettre pour une
application sont fractionnées en fragments dont la taille est jugée
optimale par TCP.
A l'inverse, TCP peut regrouper des données d'une application pour ne
former qu'un seul datagramme de taille convenable de manière à ne pas
charger inutilement le réseau.
Cette unité d'information émise est appelée segment comme
déjà présenté dans la figure 2.6.
Certaines applications demandent que les données soient émises
immédiatement, même si le tampon n'est pas plein.
Pour cela, elles utilisent le principe du push pour forcer le
transfert.
Les données sont alors émises avec un bit marquant cela pour que
la couche TCP réceptrice du segment remette immédiatement les
données à l'application concernée.
La fiabilité fournie par TCP consiste à remettre des
datagrammes, sans perte, ni duplication, alors même qu'il utilise IP qui
lui est un protocole de remise non fiable.
Ceci est réalisé à l'aide de la technique générale de l'accusé de
réception (ACK ) présentée de manière simplifiée dans la
figure 2.24
Figure:
Échanges de segments TCP.
 |
Chaque segment est émis avec un numéro qui va servir au récepteur
pour envoyer un accusé de réception.
Ainsi l'émetteur sait si l'information qu'il voulait transmettre est
bien parvenue à destination.
De plus, à chaque envoi de segment, l'émetteur arme une temporisation
qui lui sert de délai d'attente de l'accusé de réception correspondant
à ce segment.
Lorsque la temporisation expire sans qu'il n'ait reçu de ACK,
l'émetteur considère que le segment s'est perdu
et il le
réexpédie.
Mais il se peut que la temporisation expire alors que le segment
a été transmis sans problème, par exemple suite à un engorgement de réseau
ou à une perte de l'accusé de réception correspondant.
Dans ce cas, l'émetteur réémet un segment alors que c'est inutile.
Mais le récepteur garde trace des numéros de segments reçus, donc il
est apte à faire la distinction et peut éliminer les doublons.
La figure 2.25 donne le format d'un segment TCP qui sert
aux trois fonctionnalités de TCP : établir une connexion, transférer
des données et libérer une connexion.
Figure 2.25:
Format du segment TCP.
 |
L'en-tête, sans option, d'un segment TCP a une taille totale de 20 octets et
se compose des champs suivants.
- Le port source et le port destination identifient
les applications émettrice et réceptrice.
En les associant avec les numéros IP source et destination du
datagramme IP qui transporte un segment TCP on identifie de manière
unique chaque connexion
.
- Le numéro de séquence
donne la position du segment dans le flux de données
envoyées par l'émetteur; c'est-à-dire la place dans ce flux du
premier octet de données transmis dans ce segment.
- Le numéro d'accusé de réception contient en fait le numéro
de séquence suivant que le récepteur s'attend à recevoir; c'est-à-dire
le numéro de séquence du dernier octet reçu avec succès plus 1.
De manière précise, TCP n'acquitte pas un à un chaque segment qu'il reçoit,
mais acquitte l'ensemble du flot de données jusqu'à l'octet k-1 en
envoyant un acquittement de valeur k.
Par exemple, dans une transmission de 3 segments de A vers B, si les
octets de 1 à 1024 sont reçus correctement, alors B envoie un ACK avec
la valeur 1025.
Puis, si le segment suivant contenant les octets de 1025 à 2048 se perd
et que B reçoit d'abord correctement le segment des octets de 2049 à 3072,
B n'enverra pas d'accusé de réception positif pour ce troisième segment.
Ce n'est que lorsque B recevra le deuxième segment, qu'il pourra
envoyer un ACK avec la valeur 3073, que A interprétera comme l'acquittement
des deux derniers segments qu'il a envoyés.
On appelle cela un acquittement cumulatif.
- La longueur d'en-tête contient sur 4 bits la taille de
l'en-tête, y compris les options présentes, codée en multiple de 4 octets.
Ainsi une en-tête peut avoir une taille variant de 20 octets (aucune
option) à 60 octets (maximum d'options).
- Le champ réservé comporte 6 bits réservés à un usage ultérieur.
- Les 6 champs bits de code qui suivent permettent de spécifier
le rôle et le contenu du segment TCP pour pouvoir interpréter correctement
certains champs de l'en-tête.
La signification de chaque bit, quand il est fixé à 1 est la suivante.
- URG , le pointeur de données urgentes est valide.
- ACK , le champ d'accusé de réception est valide.
- PSH , ce segment requiert un push .
- RST , réinitialiser la connexion.
- SYN , synchroniser les numéros de séquence pour initialiser
une connexion.
- FIN , l'émetteur a atteint la fin de son flot de données.
- La taille de fenêtre est un champ de 16 bits qui sert au
contrôle de flux selon la méthode de la fenêtre glissante.
Il indique le nombre d'octets (moins de 65535) que le récepteur est
prêt à accepter.
Ainsi l'émetteur augmente ou diminue son flux de données en fonction
de la valeur de cette fenêtre qu'il reçoit.
- Le checksum est un total de contrôle sur 16 bits utilisé
pour vérifier la validité de l'en-tête et des données transmises.
Il est obligatoirement calculé par l'émetteur et vérifié par le récepteur.
Le calcul utilise une pseudo-entête analogue à celle d'UDP (voir la
section 2.6.1).
- Le pointeur d'urgence est un offset positif qui, ajouté
au numéro de séquence du segment, indique le numéro du dernier octet
de donnée urgente.
Il faut également que le bit URG soit positionné à 1 pour indiquer
des données urgentes que le récepteur TCP doit passer le plus rapidement
possible à l'application associée à la connexion.
- L'option la plus couramment utilisée est celle de la
taille maximale du segment TCP qu'une extrémité de la connexion
souhaite recevoir. Ainsi, lors de l'établissement de la connexion
il est possible d'optimiser le transfert de deux manières.
Sur un réseau à haut débit, il s'agit de remplir au mieux les paquets, par
exemple en fixant une taille qui soit telle que le datagramme IP ait la taille
du MTU du réseau.
Sinon, sur un réseau à petit MTU, il faut éviter d'envoyer des grands
datagrammes IP qui seront fragmentés, car la fragmentation augmente la
probabilité de pertes de messages.
L'établissement et la terminaison d'une connexion suit le
diagramme d'échanges de la figure 2.26.
Figure:
Établissemnet et terminaison d'une connexion TCP.
 |
L'extrémité demandant l'ouverture de la connexion, est le client .
Il émet un segment SYN (où le bit SYN est fixé à 1) spécifiant le
numéro de port du serveur avec lequel il veut se connecter.
Il expédie également un numéro de séquence initial N.
Cette phase est appelée ouverture active et <<consomme>> un numéro de
séquence.
Le serveur répond en envoyant un segment dont les bits ACK et SYN
sont fixés à 1.
Ainsi, dans un même segment il acquitte le premier segment reçu avec
une valeur de ACK=N+1 et il indique un numéro de séquence initial.
Cette phase est appelée ouverture passive.
Le client TCP doit évidemment acquitter ce deuxième segment en renvoyant
un segment avec ACK=P+1
.
La terminaison d'une connexion peut être demandée par n'importe quelle
extrémité et se compose de deux demi-fermetures puisque des
flots de données peuvent s'écouler simultanément dans les deux sens.
L'extrémité qui demande la fermeture (le client dans l'exemple de la
figure 2.26 émet un segment où le bit FIN est fixé
à 1 et où le numéro de séquence vaut N'.
Le récepteur du segment l'acquitte en retournant un ACK=N'+1 et
informe l'application de la demi-fermeture de la connexion.
À partir de là, les données ne peuvent plus transiter que dans un
sens (de l'extrémité ayant accepté la fermeture vers l'extrémité l'ayant
demandée), et dans l'autre seuls des accusés de réception sont transmis.
Quand l'autre extrémité veut fermer sa demi-connexion, elle agit de même
que précédemment ce qui entraîne la terminaison complète de la connexion.
Le transfert de données de TCP est de deux types : le
transfert interactif dans lequel chaque segment transporte
très peu d'octets, voire un seul, et le transfert en masse où
chaque segment transporte un maximum d'octets.
Cette distinction est confortée par une étude de 1991 qui indique que
la moitié des paquets TCP contient des données en masse (ftp, mail,
news, ...) et l'autre moitié des données
interactives
(telnet, rlogin, ...).
Mais, 90% des octets transmis proviennent de données en masse et 10%
seulement de données interactives car il apparaît que 90% des paquets
de telnet et rlogin comportent moins de 10 octets.
Un exemple de transfert interactif est celui généré par la commande
rlogin lancée depuis un client vers un serveur.
Dans ce cas de figure, tous les caractères tapés par l'utilisateur sur
le client sont envoyés vers le serveur en utilisant un caractère par
segment, et ils sont ensuite renvoyés en sens inverse par le serveur
pour un écho sur l'écran du client.
Tous les segments échangés dans ce cas là ont leur bit PSH fixé
à 1.
Or, tout segment doit être acquitté dans un sens comme dans l'autre; ce
qui devrait amener au diagramme d'échanges illustré dans le a) de la
figure 2.27.
Figure:
Échange de données interactif.
 |
En fait, TCP gère ce type d'échange avec la procédure
d'acquittement retardé qui consiste à envoyer l'acquittement en
l'incluant dans un segment qui transporte également des données comme
illustré dans le b) de la figure 2.27.
Pour cela l'acquittement est généralement retardé de 200ms dans le but
d'attendre d'éventuelles données à transmettre.
Cependant, dans ce contexte la frappe de la commande date sur
le client provoquerait quand même l'échange de 15 datagrammes IP de 41
octets
, pour transporter à chaque fois seulement 1
octet utile.
Ce type de situation est peu gênant sur un LAN mais devient
très vite préjudiciable au bon fonctionnement d'un WAN.
Une solution à ce problème est l'algorithme de Nagle (RFC 896)
qui spécifie qu'une connexion TCP ne peut avoir seulement un petit segment
non encore acquitté.
Ainsi, si un réseau a un fort débit et n'est pas du tout chargé la
procédure sera celle du b) de la figure 2.27.
Par contre, dès que le temps de transfert est non négligeable, les
acquittements vont arriver plus lentement que la frappe des caractères
par l'utilisateur du poste client.
Dans ce cas, la couche TCP du client va accumuler de petits volumes de
données (quelques caractères) et les envoyer dans le même segment TCP
diminuant ainsi considérablement le nombre d'échanges comme illustré
dans le c) de la figure 2.27.
Dans les cas où de petits messages doivent être remis sans délai
(mouvement de souris dans le cas d'un serveur X) l'algorithme de Nagle
doit être invalidé pour donner une impression de temps réel.
Dans le cas d'un transfert de données en masse, TCP utilise la technique
de la fenêtre glissante pour contrôler le flux des échanges.
Ceci est primordial quand un micro ordinateur communique
avec un gros ordinateur, sinon le tampon d'entrée du micro sera très
vite saturé.
Ceci consiste en un contrôle de flux de bout en bout .
Mais il s'agit aussi de réguler le trafic en fonction de la charge
des routeurs et du débit des réseaux traversés.
On rappelle que l'ensemble d'un flux de données unidirectionnel d'une
machine A vers une machine B
est constitué d'une séquence d'octets tous numérotés individuellement.
La fenêtre glissante va consister à fixer quels sont les octets
appartenant à ce flux que A peut émettre comme c'est illustré dans la
figure 2.28.
Figure:
Fenêtre glissante de TCP.
 |
Dans cet exemple la fenêtre couvre les octets de 4 à 9, car la taille
de la fenêtre courante est 6 et que tous les octets jusqu'au troisième
inclus ont été émis et acquittés.
Figure:
Exemple d'évolution de fenêtre glissante.
 |
A tout instant TCP calcule sa fenêtre utilisable qui est constituée
des octets présents dans la fenêtre et non encore envoyés.
Ces octets sont généralement immédiatement transmis.
Pour le flot de A vers B, la taille de la fenêtre est contrôlée par B qui
envoie dans chacun de ses accusés de réception la taille de la fenêtre
qu'il désire voir utiliser.
Si la demande exprime une augmentation, A déplace le bord droit de sa
fenêtre courante et émet immédiatement les octets qui viennent d'y entrer.
Si la demande exprime une diminution, il est déconseillé de déplacer
réellement le bord droit de la fenêtre vers la gauche.
Ce rétrécissement est opéré lors des glissements de la fenêtre vers la droite
avec l'arrivée des accusés de réception.
La figure 2.29 illustre
les échanges
de segments entre un émetteur A et un récepteur B et
l'évolution de la fenêtre glissante de A suivant les indications de B.
Next: Les applications.
Up: Les protocoles TCP et
Previous: Le protocole UDP.
Pascal Nicolas Université d'Angers
mardi, 2 novembre 1999, 09:20:50 MET