Les numéros de séquence et les accusés de réception (ACK) dans le protocole TCP (Transmission Control Protocol) jouent un rôle central pour garantir une communication fiable, ordonnée et sans perte entre deux hôtes. Voici leur fonction détaillée, étape par étape :

Numéros de séquence (Sequence Numbers)

Rôle principal
Ordonnancement des données : Chaque octet envoyé dans un segment TCP est numéroté avec un numéro de séquence. Cela permet au récepteur de :
Reconstituer les données dans l'ordre correct, même si les segments arrivent dans le désordre (dû aux routes réseau variables).
Détecter les duplicatas (segments reçus plusieurs fois à cause de retransmissions).
Détection des pertes : Si un segment est perdu, le récepteur identifie le « trou » dans la séquence et signale implicitement la perte (ACK inchangé, ou blocs SACK).

Mécanisme
Le numéro de séquence d'un segment est le numéro du premier octet de ses données.
Exemple : si un segment transporte les octets 1000 à 1499, son numéro de séquence est 1000.
Le numéro de séquence initial (ISN, Initial Sequence Number) est choisi de manière imprévisible pour éviter les confusions avec des connexions précédentes et les attaques par « sequence prediction ».

Exemple
Si l'hôte A envoie trois segments de 1000 octets commençant aux numéros de séquence 1000, 2000 et 3000, et que le segment SEQ=2000 est perdu :
Le récepteur (B) reçoit 1000 et 3000, détecte l'absence des octets 2000–2999 et continue à répondre ACK=2000 (prochain octet attendu), sans acquitter les octets 3000–3999.
A retransmet le segment SEQ=2000 après expiration du RTO ou après réception de plusieurs ACK duplicatas ACK=2000.

Accusés de réception (ACK, Acknowledgment Numbers)

Rôle principal
Confirmation de réception : Un ACK est un numéro envoyé par le récepteur pour indiquer :
Le prochain octet attendu.
Que tous les octets avant ce numéro ont été reçus correctement.
Contrôle de flux : Le récepteur régule l'émetteur via la fenêtre de réception annoncée dans le champ Window de l'en-tête TCP (et, marginalement, en retardant ses ACK).

Mécanisme
Le numéro d'ACK est égal au numéro de séquence du prochain octet attendu.
Exemple : si le récepteur a reçu tous les octets jusqu'à 1999, il envoie un ACK avec le numéro 2000.
ACK cumulatifs : un ACK=2000 signifie que tous les octets avant 2000 sont acquittés, même si certains segments ont été reçus dans le désordre.

Cas particuliers
ACK duplicata : si un récepteur reçoit un segment hors séquence (ex. SEQ=3000 alors qu'il attend 2000), il renvoie un ACK=2000. Après plusieurs ACK duplicatas (typiquement 3), l'émetteur retransmet le segment manquant (Fast Retransmit).
ACK sélectifs (SACK) : extension de TCP (RFC 2018) permettant d'acquitter des blocs de données non contigus, pour améliorer l'efficacité en cas de pertes multiples.

Interaction séquence/ACK : mécanisme de fiabilité

Le couplage des numéros de séquence et des ACK permet à TCP de garantir :

Fiabilité :

Si un segment est perdu, l'absence d'ACK déclenche une retransmission après un timeout (RTO, Retransmission Timeout).
Les ACK duplicatas accélèrent la détection des pertes (sans attendre le timeout).

Contrôle de flux :

Le récepteur annonce une fenêtre de réception (nombre d'octets qu'il peut encore bufferiser). L'émetteur ajuste son débit pour ne pas saturer le récepteur.

Contrôle de congestion :

TCP utilise les ACK et les timeouts pour estimer la congestion du réseau et ajuster sa fenêtre de congestion (algorithmes Slow Start, Congestion Avoidance, Fast Recovery).

Exemple concret d'échange (segments de 1000 octets)

Étape Émetteur (A) Récepteur (B) Récepteur (B) Émetteur (A) Description

1 SEQ=1000, données 1000–1999 A envoie le premier segment.
2 ACK=2000, Window=4000 B acquitte jusqu'à 1999 (prochain attendu : 2000) et annonce sa fenêtre.
3 SEQ=2000, données 2000–2999 A envoie le segment suivant.
4 ACK=3000 B confirme la réception jusqu'à 2999.
5 SEQ=3000, données 3000–3999 (perdu) Le segment 3000–3999 n'arrive jamais.
6 SEQ=4000, données 4000–4999 ACK=3000 (duplicata) B a reçu un segment hors séquence : il réémet ACK=3000.
7 SEQ=3000, données 3000–3999 (retransmission) ACK=5000 Après 3 ACK duplicatas (Fast Retransmit), A retransmet ; B acquitte alors tout jusqu'à 4999.

Limites et optimisations

Problème des ACK cumulatifs : si plusieurs segments sont perdus, l'ACK reste bloqué sur le premier trou, ce qui ralentit la récupération. Les SACK résolvent ce problème.
Overhead : les ACK génèrent du trafic. TCP utilise des ACK retardés (delayed ACK, RFC 1122) : le récepteur attend l'arrivée d'un second segment ou l'expiration d'un délai (≤ 500 ms, en pratique ~200 ms) avant d'envoyer l'ACK.
Piggybacking : un même segment peut porter des données et un ACK (flag ACK=1). Un ACK pur (sans données) a un en-tête TCP de 20 octets minimum.

Résumé des champs TCP pertinents

Champ Taille (bits) Description

Sequence Number 32 Numéro du premier octet de données du segment.
Acknowledgment Number 32 Numéro du prochain octet attendu (ACK cumulatif).
ACK flag 1 Positionné à 1 si le champ Acknowledgment est valide.
Window 16 Nombre d'octets que le récepteur peut encore accepter.
SACK (option) Variable Liste des blocs reçus hors séquence (extension).

Références (RFC)

RFC 793 (remplacée par la RFC 9293) : définit les numéros de séquence et les ACK cumulatifs.
RFC 2018 : introduit les SACK.
RFC 5681 (remplace la RFC 2581) : algorithmes de contrôle de congestion (Slow Start, Congestion Avoidance, Fast Retransmit, Fast Recovery).

Erreurs courantes à éviter

Confondre numéro de séquence (premier octet du segment) et numéro d'ACK (prochain octet attendu).
Oublier que les ACK sont cumulatifs : un ACK=X confirme tous les octets jusqu'à X−1 inclus.
Croire que l'ISN vaut 0 : il est imprévisible, pour éviter les collisions et les attaques par prédiction.
Négliger l'impact du RTO : trop court, il cause des retransmissions inutiles ; trop long, il augmente la latence de récupération.

Outils pour observer les séquences/ACK

Wireshark : filtres tcp.analysis.retransmission, tcp.analysis.duplicate_ack.
Commande Linux :