TCP : handshake, fiabilité, fin
TCP transporte ~90 % de ce que tu utilises (web, mail, SSH, bases).
Prérequis (cursus dev) : TCP et UDP, parler TCP à la main.
Pourquoi
TCP transporte ~90 % de ce que tu utilises (web, mail, SSH, bases). Comprendre SYN/ACK, acquittements et fermeture, c'est lire ss, tcpdump et les timeouts comme un livre ouvert.
Concepts
- Handshake en 3 temps : SYN (je veux parler) → SYN-ACK (ok, et moi aussi) → ACK (c'est parti). Tout ce qui bloque au milieu (firewall !) = connexion qui timeout au lieu de « refuser ».
- Fiabilité : numéros de séquence + acquittements (ACK) + retransmissions. Perte = réémission, pas perte de données — au prix de la latence. D'où : TCP déteste la perte (WiFi pourri, liens saturés).
- Fermeture : FIN/ACK dans chaque sens (ou RST brutal = « stop », souvent signe de firewall ou de service qui a crashé entre-temps).
- Fenêtre (window) : quantité de données envoyées sans attendre l'ACK. Petite fenêtre + grosse latence = débit effondré même sur un gros tuyau (cas satellite/transatlantique).
Exemple : lire ss et tcpdump
ss -tn state established # connexions TCP vivantes : qui parle à qui
ss -tn state syn-sent # bloquées au handshake = firewall ou service down ?
SYN-SENT qui reste = le SYN part mais rien ne revient : firewall qui jette (timeout) vs port fermé (RST immédiat = « refusé »). Deux symptômes, deux causes.
Cas réel
App « lente » derrière un firewall stateful saturé (table de connexions pleine) : les nouvelles connexions timeout aléatoirement. ss -s (résumé) montre des milliers de TIME-WAIT : la table déborde. Solution : tuning (timeouts, table plus grande) ou firewall dimensionné.
Pièges
- Timeout vs refusé : timeout = filtré/perdu (firewall, routage), refusé (RST) = arrivé mais rien n'écoute. Ne pas confondre !
- Keepalive applicatif vs TCP : un NAT oublie les connexions idle (souvent ~5 min). Sans keepalive applicatif, « déconnexions fantômes ».
- Trop de TIME-WAIT sur un client qui ouvre beaucoup (scraper, tests) : épuisement de ports éphémères →
connect: cannot assign requested address.
À retenir
SYN/SYN-ACK/ACK, ACK = fiabilité, timeout = filtré, RST = refusé, fenêtre × latence = débit réel.