infra / reseaux-tcp-ip
Three-way handshake TCP en détail
Explication
Ce que vous allez apprendre
- Décrire précisément les trois étapes du handshake TCP (SYN, SYN-ACK, ACK)
- Comprendre pourquoi TCP a besoin de cette poignée de main avant d'échanger la moindre donnée
- Lire les états d'une connexion TCP (
LISTEN,ESTABLISHED,TIME-WAIT...) avecss -tan - Observer un handshake réel avec
tcpdumpet reconnaître les flags SYN/ACK/FIN/RST - Repérer un signe d'attaque (SYN flood) ou de perte de paquets (retransmissions) via les métriques TCP
Dans quel contexte ?
Un administrateur système remarque que son serveur web devient très lent à répondre alors que le CPU et la mémoire semblent normaux. En lançant ss -tan state syn-recv | wc -l, il découvre des milliers de connexions bloquées en SYN-RECV : quelqu'un envoie des paquets SYN sans jamais terminer le handshake, un schéma typique d'attaque par déni de service (SYN flood) qui épuise les ressources du serveur en connexions à moitié ouvertes.
Pourquoi une connexion doit être "établie" avant d'échanger des données
TCP promet la fiabilité : aucune donnée perdue, dans le bon ordre. Pour tenir cette promesse, les deux machines doivent d'abord se mettre d'accord sur les règles de base de leur échange (à partir de quel numéro de séquence commencer à compter, par exemple). C'est précisément le rôle du three-way handshake : une poignée de main en trois étapes qui établit cet accord avant que la moindre donnée applicative ne circule.
| État TCP | Signification |
|---|---|
LISTEN | En attente de connexions entrantes |
SYN-RECV | SYN-ACK envoyé, attend l'ACK final |
ESTABLISHED | Connexion pleinement ouverte |
TIME-WAIT | Fermeture terminée, port bientôt libéré |
Piège fréquent
Un grand nombre de connexions en TIME_WAIT n'est PAS forcément une anomalie : c'est un comportement normal et volontaire de TCP après une fermeture. En revanche, un grand nombre de connexions bloquées en SYN-RECV est un signal d'alerte bien plus sérieux, souvent révélateur d'une attaque en cours.
Pourquoi trois étapes, ni plus ni moins
Deux étapes ne suffiraient pas : le client proposerait un numéro de départ, le serveur répondrait avec le sien, mais le serveur n'aurait alors aucune confirmation que le client a bien reçu sa réponse. La troisième étape (l'accusé de réception final du client) referme cette boucle de confirmation mutuelle. C'est un principe qu'on retrouve dans beaucoup de protocoles fiables : chaque partie doit savoir que l'autre a bien reçu son dernier message.
Les états d'une connexion racontent son histoire
Une connexion TCP passe par plusieurs états successifs (en attente, en cours d'établissement, établie, en cours de fermeture...). Observer ces états sur un serveur donne des indices précieux : trop de connexions bloquées en attente d'établissement peut trahir une attaque, trop de connexions en attente de fermeture peut trahir une application qui ne ferme pas proprement ses ressources.
Le lien avec le diagnostic réseau
Cette mécanique interne, invisible en temps normal, redevient centrale dès qu'un problème de connexion survient : savoir lire ces états et repérer des retransmissions permet de distinguer un problème de réseau (paquets perdus) d'un problème applicatif (le serveur ne répond simplement pas).
Commandes & code
Three-way handshake TCP en détail
Client Serveur
| |
|------------- SYN (seq=x) --------------------->| 1. Client demande l'ouverture
| |
|<----- SYN-ACK (seq=y, ack=x+1) ----------------| 2. Serveur accepte + demande à son tour
| |
|------------- ACK (ack=y+1) --------------------->| 3. Client confirme, connexion ÉTABLIE
| |
|============ échange de données ================|
# Fermeture (four-way, TCP est full-duplex donc chaque sens se ferme séparément)
|------------- FIN ------------------------------>|
|<------------ ACK -------------------------------|
|<------------ FIN -------------------------------|
|------------- ACK ------------------------------->| connexion fermée, client passe en TIME_WAIT# Observer le handshake réellement avec tcpdump
sudo tcpdump -i eth0 -n 'tcp port 443 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)' -c 6
# Flags visibles dans la sortie :
# [S] = SYN
# [S.] = SYN-ACK (le point = ACK combiné)
# [.] = ACK simple
# [F.] = FIN-ACK
# [R] = RST (réinitialisation brutale, ex: port fermé ou connexion refusée)
# Vérifier les états d'une connexion TCP sur la machine
ss -tan
# État Signification
# LISTEN en attente de connexions entrantes
# SYN-SENT SYN envoyé, attend le SYN-ACK
# SYN-RECV SYN-ACK envoyé, attend l'ACK final
# ESTABLISHED connexion pleinement ouverte
# FIN-WAIT-1/2 fermeture initiée localement
# TIME-WAIT fermeture terminée, attend un délai avant de libérer le port
# CLOSE-WAIT l'autre côté a fermé, en attente que l'appli locale ferme aussi
# Un grand nombre de connexions en SYN-RECV = signe possible d'une attaque SYN flood
ss -tan state syn-recv | wc -l
# Numéro de séquence et fenêtre de réception (contrôle de flux)
sudo tcpdump -i eth0 -n -v port 443 -c 1
# seq 1:1461, win 65535 -> "win" = taille de fenêtre annoncée, limite le volume envoyable
# sans attendre d'accusé de réception (impacte directement le débit sur liens à forte latence)
# Retransmissions : signe de perte de paquets ou de congestion
ss -ti # affiche des infos TCP internes (rtt, cwnd, retrans) par connexion
nstat -az TcpRetransSegs # compteur cumulé de segments retransmisRésumé
- Trois étapes pour ouvrir une connexion (SYN, SYN-ACK, ACK), quatre pour la fermer (FIN/ACK de chaque côté).
TIME_WAITest normal et volontaire : la connexion attend un délai avant de libérer le port.- Beaucoup de
SYN-RECVou de retransmissions TCP indiquent respectivement une possible attaque ou de la perte de paquets.
Exercices pratiques
Mission : confirmer un SYN flood en cours
Objectif : Utiliser les états de connexion TCP pour distinguer une attaque par déni de service d'une simple charge de trafic légitime.
Contexte
Le serveur web d'une entreprise devient très lent, sans que le CPU ni la mémoire ne semblent en cause. En inspectant les connexions TCP, tu observes 5000 connexions à l'état SYN-RECV et seulement 3 à l'état ESTABLISHED. Un collègue pense que c'est simplement "beaucoup de trafic".