Le protocole TCP


Transmission Control Protocol

Service de transport en mode connecté au-dessus d'une couche réseau non fiable en commutation par paquets.

Implémentation assez complexe.

Utilisé dans les cas où il est nécessaire d'avoir une communication sûre entre applications.

Utilisation de la notion de port pour communiquer entre applications (ports TCP distincts des ports UDP)

telnet 23
ftp 20,21
smtp 25

Cinq caractéristiques du service TCP

  1. Flot de données

    Le récepteur reçoit exactement la séquence d'octets envoyée par le processus source.
  2. Connexion et déconnexion

    Avant tout envoi de données, il y a un échange de segments afin de mettre en place la connexion. De même la déconnexion est négociée.

  3. Bufferisation et contrôle de flot

    Les données envoyées et reçues sont bufferisées afin d'améliorer la communication.

  4. Flot non structuré

    Nécessité d'un protocole de présentation pour structurer les données tensmisent.

  5. Connexion Full-Duplex

    Communication dans les deux sens. Informations de contrôle + données

Le service de fiabilité

Acquittement positif avec retransmission (acknowledgement ACK)

L'émetteur bufferise tous les segments qu'il envoie et attend un acquittement avant de les effacer. Il démarre également une alarme qui, si elle expire avant l'arrivée d'un acquittement, entraîne la retransmission des données du segment.

Chaque octet émis à un numéro de séquence.

Le numéro d'un segment est le numéro du premier octet qu'il contient.

Un acquittement contient un numéro de séquence strictement supérieur à tous les octets déjà reçus.

Ainsi un acquitte tous les segments qui ont un numéro de séquence inférieur.

L'acquittement d'un paquet allant de A vers B peut être véhiculer par un paquet allant de B vers A. Cette technique est appelée piggybacking.






Fenêtre coulissante (sliding window)

Amélioration des performances : ne pas attendre d'avoir reçu l'acquittement du segment émis pour en envoyer un nouveau.

Nécessité de connaître la taille de la fenêtre de réception (place encore libre dans le buffer) pour ne pas émettre des données pour rien.

Signalisation de la taille de la fenêtre par segment TCP (éventuellement piggybacking)

Fenêtre d'émission déduite de la taille de la fenêtre de réception et du numéro d'acquittement (prochain octet attendu).

Un mécanisme de fenêtres coulissantes par sens de communication.

En comportement normal :

SEND_UNA : coulisse en fonction des acquittements qui arrivent et SEND_WNDW diminue

SEND_NEXT : coulisse en fonction des segments émis

RECV_NEXT : coulisse en fonction des segments reçus et RECV_WNDW diminue

RECV_WNDW : augmente lorsque l'application récupère les données reçues

SEND_WNDW : augmente quand l'émetteur est informé que RECV_WNDW a augmentée


Si SEND_NEXT - SEND_UNA == SEND_WNDW alors émission stoppée.


La taille du buffer d'émission n'est pas a priori corrélée à la taille de la fenêtre d'émission. Il sert à bufferiser les données qui ne peuvent pas être émisses.





Scénario de connexion (three-way handshake)

  1. Ouverture passive par le serveur en attente de connexions

  2. Ouverture active par le client

  3. Le client envoie un segment de synchronisation (SYN) contenant son numéro de séquence initial (ex:700)

  4. Le serveur reçoit le (SYN) et renvoie au client un segment de synchronisation contenant son numéro de séquence initial (ex : 400) et un (ACK) de 701 signifiant que le premier numéro de segment devrait être 701.

  5. Le client reçoit le (SYN/ACK) et renvoie un (ACK) de 401.

  6. Le client notifie l'ouverture de la connexion.

  7. Le serveur reçoit (ACK) et notifie l'ouverture de la connexion.


Le seul segment qui contient le numéro d'acquittement à zéro est le premier SYN lors de la connexion.


Scénario de déconnexion (three-way handshake)

  1. Le serveur demande la clôture de connexion

  2. Il y a envoi d'un message FIN informant le partenaire qu'il n'enverra plus de données . (niveau TCP)

  3. Le message FIN est acquitté (niveau TCP) ACK

  4. Le client apprend que le serveur a fermé sa connexion

  5. Le client demande la clôture de la connexion

  6. Il y a envoi d'un message FIN.

  7. Il y a acquittement du message FIN par un ACK

  8. Le serveur apprend que la connexion est fermée



Format des segments TCP

0

4

10

16

24

Port source

Port destination

Numéro de séquence

Numéro d'acquittement

Taille

Réservé

Code

Window

Checksum

Pointeur urgent

Options

Bourrage

Données

...

0

8

16

24

Adresse IP source

Adresse IP destination

0

Protocole (IP=6)

Taille totale


La valeur du timeout

Algorithme de Karn et Jacobson

Utilisation du temps aller-retour en particulier lors de la connexion.

Jacobson : calcul de proche en proche s'il n'y a pas de timeout

Karn : timeout augmenté par facteur multiplicatif en cas de timeout.


Nagle Algorithm

L'envoyeur doit éviter d'envoyer de petits segments

Il est recommandé d'envoyer les données, soit quand la taille maximum du segment est atteinte, soit quand une partie du buffer de réception est pleine.

Nagle propose de ne pas envoyer tant que l'on attend un ACK

Congestion

En cas de congestion (réception d'un message ICMP) on utilise une fenêtre de congestion plus petite que la fenêtre d'émission. Celle-ci augmente au fur et à mesure de la réception des ACK.


États TCP des points de communication