Networking

TCP/IP & Sockets

TCP/IP est la couche de transport sous-jacente à chaque requête HTTP, connexion de base de données et WebSocket. Les sockets sont le moyen pour votre code de communiquer directement avec elle.

intermediate14 min readUpdated 15 sept. 2026
server.js
js
// server.js
import { createServer } from "node:net";

const server = createServer((socket) => {
  socket.write("hello\n");
  socket.on("data", (data) => {
    console.log("received:", data.toString().trim());
  });
});

server.listen(9000, () => console.log("tcp://localhost:9000"));
Modèle
En couches (liaison, IP, transport, application)
Adressage
Adresse IP + port
Fiable
TCP
Rapide
UDP
Handshake
SYN, SYN-ACK, ACK
Dans Node
node:net

Pourquoi c'est important

Pourquoi TCP/IP est essentiel

Transport fiable

TCP garantit une livraison complète et ordonnée, c'est pourquoi HTTP, les bases de données et les e-mails fonctionnent avec lui.

Omniprésent

Chaque requête traitée par votre serveur arrive via une connexion TCP, même si un framework en masque les détails.

Le coût des connexions

L'ouverture d'une connexion TCP nécessite un aller-retour plus un handshake, c'est pourquoi leur réutilisation est cruciale.

Le tableau complet

Les trois couches du modèle

L'IP gère les adresses et le routage des paquets, TCP assure la fiabilité de la livraison, et les sockets sont l'API utilisée par votre code.

IP

Adressage et routage

Les paquets transportent les adresses source et destination et sont acheminés de saut en saut.

TCP

Fiabilité

Les numéros de séquence, les accusés de réception et la retransmission transforment des paquets non fiables en un flux stable.

Sockets

Programmation

Un socket est le point de terminaison dans lequel votre code lit et écrit, identifié par une adresse et un port.

TCP/IP en un coup d'œil

Les concepts fondamentaux

Adresses IP

IPv4 et IPv6 identifient un hôte sur le réseau.

Ports

Un numéro qui identifie un service sur un hôte, comme le 443 pour HTTPS.

Handshake

SYN, SYN-ACK et ACK établissent une connexion et s'accordent sur les options.

Numéros de séquence

L'ordonnancement et l'accusé de réception rendent la livraison fiable.

Contrôle de flux

Les fenêtres empêchent un émetteur rapide de submerger un récepteur lent.

Timeouts

La retransmission, le keep-alive et le TIME_WAIT régissent le cycle de vie de la connexion.

Un bref aperçu

Le protocole qui supporte internet

  1. 1974

    Proposition de TCP

    Cerf et Kahn décrivent un protocole pour connecter différents réseaux.

    74
  2. 1981

    Standardisation de TCP/IP

    La suite de protocoles est spécifiée puis adoptée comme standard internet.

    81
  3. 1983

    Transition d'ARPANET

    Le réseau bascule vers TCP/IP en une seule journée, prouvant son efficacité à grande échelle.

    83
  4. 1993

    Contrôle de congestion

    Des algorithmes comme TCP Reno empêchent l'effondrement du réseau sous forte charge.

    93
  5. Aujourd'hui

    Toujours le fondement

    HTTP/3 passe à QUIC sur UDP, mais TCP transporte toujours la vaste majorité du trafic.

    Aujourd'hui

Le guide complet

TCP/IP & Sockets: Tout ce que vous devez savoir

Qu’est-ce que TCP/IP ?

TCP/IP est la suite de protocoles qui supporte l’internet. IP est responsable de l’adressage et du routage des paquets entre les hôtes ; TCP se superpose à IP pour transformer ces paquets non fiables en un flux d’octets ordonné et fiable. Ensemble, ils constituent la couche de transport sous-jacente à HTTP, aux bases de données, aux e-mails, aux WebSocket et à presque tout ce que fait votre serveur.

Il est rare d’écrire du code TCP directement, mais le comprendre permet d’expliquer beaucoup de choses : pourquoi les connexions sont coûteuses, pourquoi le keep-alive est important, pourquoi un pool de base de données a une limite de taille, et pourquoi certains trafics utilisent UDP à la place.

Le modèle en couches

Le réseau est généralement décrit en couches, chacune gérant une tâche spécifique :

Couche Rôle Exemples
Application Signification HTTP, WebSocket, DNS
Transport Fiabilité et ports TCP, UDP
Internet Adressage et routage IP, ICMP
Liaison Livraison locale Ethernet, Wi-Fi

Chaque couche utilise celle qui se trouve en dessous d’elle. HTTP ne sait pas s’il transite via Ethernet ou Wi-Fi ; il s’appuie sur TCP pour livrer des octets, lequel s’appuie sur IP pour déplacer des paquets. Cette séparation est la raison pour laquelle Internet peut transporter autant de types de trafic différents.

Adresses IP et ports

Une adresse IP identifie un hôte, et un port identifie un service sur cet hôte. Ensemble, ils forment une adresse socket, telle que 203.0.113.10:443.

  • Les adresses IPv4 sont sur 32 bits (203.0.113.10) ; les adresses IPv6 sont sur 128 bits et écrites en hexadécimal.
  • Les ports inférieurs à 1024 sont réservés aux services bien connus.
  • Les clients reçoivent un port éphémère pour la durée d’une connexion.
  • Une connexion est identifiée de manière unique par le tuple complet : adresse source, port source, adresse destination et port destination.

C’est grâce à ce tuple qu’un serveur peut accepter des milliers de connexions simultanées sur le port 443 : le port source de chaque client est différent.

Le three-way handshake

Avant tout flux de données, TCP établit une connexion en trois étapes :

  1. Le client envoie un SYN avec son numéro de séquence initial.
  2. Le serveur répond par un SYN-ACK, accusant réception de la demande du client et envoyant son propre numéro de séquence.
  3. Le client envoie un ACK, et la connexion est établie.

Cela coûte un aller-retour (round trip) avant le premier octet de données applicatives, ce qui représente un coût réel en termes de latence. TLS ajoute un autre aller-retour (ou deux), et DNS peut en ajouter un supplémentaire avant cela. La réutilisation des connexions existe précisément pour éviter de payer ces coûts à répétition.

Fiabilité et contrôle de flux

TCP assure la fiabilité grâce à plusieurs mécanismes :

  • Les numéros de séquence ordonnent les octets, permettant ainsi au récepteur de les réassembler correctement.
  • Les accusés de réception confirment la réception, et les données non acquittées sont retransmises.
  • Les sommes de contrôle (checksums) détectent la corruption des données.
  • Le contrôle de flux utilise une fenêtre de réception pour éviter qu’un émetteur rapide ne submerge un récepteur lent.
  • Le contrôle de congestion adapte le débit d’envoi en fonction du réseau pour éviter l’effondrement de celui-ci.

Le résultat est un flux d’octets qui arrive complet et dans l’ordre, au prix d’une certaine latence et d’un surcoût (overhead).

UDP : l’alternative rapide

UDP est un protocole sans connexion. Il envoie des datagrammes sans établissement de connexion (handshake), sans garantie d’ordre et sans retransmission. Cela peut sembler être un inconvénient, mais pour certaines charges de travail, c’est un avantage :

  • La latence prime sur la perfection : la vidéo en direct, la voix et les jeux préfèrent perdre une image plutôt que de la recevoir avec retard.
  • L’application gère la fiabilité : QUIC, qui propulse HTTP/3, implémente sa propre couche de fiabilité au-dessus d’UDP.
  • Requêtes courtes et sans état : DNS utilise traditionnellement UDP car une seule requête et sa réponse tiennent dans un seul datagramme.

Choisissez TCP lorsque l’exactitude et l’ordre des données sont primordiaux, et UDP lorsque vous avez besoin de vitesse et que vous pouvez tolérer des pertes de données.

Les Sockets dans Node.js

Node expose TCP via node:net et UDP via node:dgram. Un serveur TCP vous fournit un socket par connexion.

// echo.js
import { createServer } from "node:net";

const server = createServer((socket) => {
  socket.setKeepAlive(true, 10_000);
  socket.setTimeout(30_000);
  socket.on("timeout", () => socket.destroy());

  socket.on("data", (data) => socket.write(data));
  socket.on("error", (err) => console.error(err));
});

server.listen(9000);

Les sockets sont des streams : vous lisez les événements data et vous écrivez avec socket.write(). Comme TCP est un flux d’octets sans délimitation de messages, les protocoles applicatifs doivent définir leur propre cadrage (framing), c’est pourquoi HTTP utilise des headers avec des longueurs de contenu et WebSockets utilise des frames.

Cycle de vie et optimisation des connexions

  • Le Keep-alive permet de réutiliser les connexions, évitant ainsi le handshake à chaque requête.
  • Les Pools limitent le nombre de connexions simultanées vers une base de données ou un service.
  • Les Timeouts ferment les connexions inactives ou bloquées afin de libérer les ressources.
  • Le TIME_WAIT est un état normal après la fermeture, mais un trop grand nombre de connexions éphémères peut épuiser les ports.
  • Backpressure : socket.write() renvoie false lorsque le buffer est plein, et vous devez alors attendre drain.

La plupart des optimisations en production consistent à réutiliser les connexions et à limiter la concurrence, plutôt qu’à modifier les paramètres du kernel.

Bonnes pratiques

  • Réutilisez les connexions avec keep-alive ou un pool.
  • Configurez des timeouts et le keep-alive sur les connexions longue durée.
  • Limitez la concurrence pour éviter d’épuiser les sockets ou les descripteurs de fichiers.
  • Gérez les erreurs et la backpressure sur chaque socket.
  • Utilisez TCP, sauf si vous avez une raison spécifique d’utiliser UDP.
  • Gardez à l’esprit que TCP est un flux d’octets (byte stream) et définissez votre propre framing.
  • Surveillez le TIME_WAIT et le nombre de connexions pour détecter un renouvellement excessif des connexions (connection churn).

Erreurs courantes

  • Ouvrir une nouvelle connexion pour chaque requête.
  • Supposer que TCP préserve les limites des messages.
  • Ignorer la backpressure de socket.write() et mettre en tampon des données non bornées.
  • Laisser des connexions persistantes sans keep-alive ni timeouts.
  • Configurer des tailles de pool bien plus importantes que ce que la base de données peut supporter.
  • Utiliser UDP alors que la fiabilité est réellement primordiale.

Et après ?

TCP/IP est la couche sur laquelle tout le reste repose. Approfondissez vos connaissances avec le guide HTTP, comprenez les bases du réseau dans Comment fonctionne Internet, et passez aux connexions persistantes avec WebSockets. Ensuite, inspectez les connexions réelles sur votre machine avec ss ou netstat pendant que votre serveur gère le trafic.

Choisir un transport

TCP garantit une livraison ordonnée au prix de handshakes et de retransmissions. UDP privilégie la latence au détriment de la fiabilité.

TCP
// reliable, ordered stream
const socket = net.connect(9000, "localhost");
socket.write("GET / HTTP/1.1\r\n\r\n");
UDP
// fast, no delivery guarantee
const socket = dgram.createSocket("udp4");
socket.send(Buffer.from("ping"), 9001, "localhost");

Réutilisation des connexions

Ouvrir une connexion par requête impose le coût du handshake à chaque fois. Le keep-alive réutilise une seule connexion pour plusieurs requêtes.

À privilégier
const agent = new http.Agent({
  keepAlive: true,
  maxSockets: 50,
});

fetch(url, { agent });
À éviter
// a fresh connection and
// handshake for every call
for (const url of urls) {
  await fetch(url);
}

FAQ

Foire aux questions

Keep learning

Related topics from the roadmap.

$ commencer à apprendre

Prêt à apprendre TCP/IP & Sockets ?

Notre tutoriel interactif vous guide à travers TCP/IP & Sockets pas à pas — avec des quiz et du vrai code que vous pouvez exécuter dans le navigateur.