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)
Flot de données
Connexion et déconnexion
Bufferisation et contrôle de flot
Flot non structuré
Connexion Full-Duplex
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.
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.
Ouverture passive par le serveur en attente de connexions
Ouverture active par le client
Le client envoie un segment de synchronisation (SYN) contenant son numéro de séquence initial (ex:700)
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.
Le client reçoit le (SYN/ACK) et renvoie un (ACK) de 401.
Le client notifie l'ouverture de la connexion.
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.
Le serveur demande la clôture de connexion
Il y a envoi d'un message FIN informant le partenaire qu'il n'enverra plus de données . (niveau TCP)
Le message FIN est acquitté (niveau TCP) ACK
Le client apprend que le serveur a fermé sa connexion
Le client demande la clôture de la connexion
Il y a envoi d'un message FIN.
Il y a acquittement du message FIN par un ACK
Le serveur apprend que la connexion est fermée
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 |
|||||||||||||||
... |
Numéro de séquqnce spécifie le numéro de séquence du premier octet de données.
Numéro d'acquittment spécifie le numéro de séquence du prochain octet attendu.
Taille est la taille de l'entête du segment en nombre de mots de 32 bits.
Window donne la taille de la fenêtre de réception. S'il y a perte d'un segment, il n'y a pas de moyen pour, éventuellement, acquitter les segment suivants.
Code détermine le type du segment et son contenu. Les valeurs possibles sont :
0x20 URG contient un message urgent.
0x10 ACK contient un acquittement
0x08 PSH indication que la transmission a été forcée
0x04 RST indicateur de réinitialisation de la connexion
0x02 SYN indication de début de communication
0x01 FIN indicateur de fin d'envoie de l'emetteur
Pointeur urgent indique l'offset du caractère urgent dans données si le code URG est présent.
Options permet, entre autre, de négocier la taille des segments envoyés, en fonction de la capacité mémoire de la machine réceptrice et éventuellement de la MTU des réseaux traversés.
Checksum est calculée comme pour UDP en ajoutant une pseudo-entête.
0 |
8 |
16 |
24 |
---|---|---|---|
Adresse IP source |
|||
Adresse IP destination |
|||
0 |
Protocole (IP=6) |
Taille totale |
Algorithme de Karn et Jacobson
Jacobson : calcul de proche en proche s'il n'y a pas de timeout
Karn : timeout augmenté par facteur multiplicatif en cas de timeout.
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
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.