Paquets IP et segments TCP
Un paquet IP (couche 3) encapsule un segment TCP (couche 4) qui lui-même encapsule les données applicatives. Ces deux headers sont la colonne vertébrale du trafic Internet.
Voir Couches OSI pour comprendre comment ces couches s’articulent.
Anatomie d’un paquet IP (L3)
Un paquet IP est l’unité qui voyage de routeur en routeur jusqu’à destination. Chaque routeur lit uniquement ce header pour décider du prochain saut.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌─────────┬────────┬────────────────────┬────────────────────────┐
│ Version │ IHL │ DSCP / ECN │ Total Length │
├─────────┴────────┴────────────────────┼────────────────────────┤
│ Identification │ Flags │ Frag. Offset │
├───────────────────────────────────────┼───────┴────────────────┤
│ TTL │ Protocol │ Header Checksum │
├─────────────────┴─────────────────────┴────────────────────────┤
│ Source IP Address │
├────────────────────────────────────────────────────────────────┤
│ Destination IP Address │
├────────────────────────────────────────────────────────────────┤
│ Data (payload — segment TCP/UDP) │
└────────────────────────────────────────────────────────────────┘
| Champ | Taille | Rôle |
|---|---|---|
| Version | 4 bits | IPv4 (4) ou IPv6 (6) |
| IHL | 4 bits | Longueur du header IP (en mots de 32 bits, min = 5 = 20 octets) |
| DSCP / ECN | 8 bits | Qualité de service (priorité du paquet) |
| Total Length | 16 bits | Taille totale du paquet (header + payload), max 65 535 octets |
| Identification | 16 bits | Identifiant unique pour rassembler les fragments |
| Flags | 3 bits | DF (Don’t Fragment), MF (More Fragments) |
| Fragment Offset | 13 bits | Position du fragment dans le paquet original |
| TTL | 8 bits | Time To Live — décrémenté de 1 à chaque routeur, paquet supprimé si TTL = 0 |
| Protocol | 8 bits | Protocole encapsulé : 6 = TCP · 17 = UDP · 1 = ICMP |
| Header Checksum | 16 bits | Vérification d’intégrité du header IP uniquement |
| Source IP | 32 bits | Adresse IP de l’émetteur |
| Destination IP | 32 bits | Adresse IP du destinataire |
Le TTL sert à éviter les boucles de routage infinies. Sa valeur initiale est typiquement 64 (Linux) ou 128 (Windows). La commande
tracerouteexploite ce mécanisme.
IPv4 vs IPv6
| IPv4 | IPv6 | |
|---|---|---|
| Taille adresse | 32 bits (192.168.1.1) | 128 bits (2001:db8::1) |
| Nombre d’adresses | ~4,3 milliards | ~340 undécillions |
| Header | Variable (20-60 octets) | Fixe (40 octets) |
| Fragmentation | Par routeurs et hôtes | Uniquement par l’hôte source |
| Checksum | Oui (recalculé à chaque routeur) | Supprimé (délégué aux couches supérieures) |
| NAT | Nécessaire (manque d’adresses) | Inutile (adresses en quantité illimitée) |
Anatomie d’un segment TCP (L4)
TCP apporte la fiabilité que IP ne garantit pas : ordre des données, retransmission des pertes, contrôle de flux.
┌──────────────────────────┬──────────────────────────────────────┐
│ Port source │ Port destination │
├──────────────────────────┴──────────────────────────────────────┤
│ Numéro de séquence │
├─────────────────────────────────────────────────────────────────┤
│ Numéro d'acquittement (ACK) │
├────────┬────────┬─────────────────────────┬────────────────────┤
│ Offset │ Réservé│ Flags │ Window Size │
├────────┴────────┴─────────────────────────┴────────────────────┤
│ Checksum │ Urgent Pointer │
├───────────────────────────────┴─────────────────────────────────┤
│ Data (payload) │
└─────────────────────────────────────────────────────────────────┘
| Champ | Rôle |
|---|---|
| Port source | Port de l’application émettrice (choisi aléatoirement, ex. 52341) |
| Port destination | Port de l’application cible : 80=HTTP · 443=HTTPS · 22=SSH · 53=DNS |
| Numéro de séquence | Position du premier octet de ce segment dans le flux de données |
| Numéro d’ACK | Prochain octet attendu — confirme la réception de tout ce qui précède |
| Offset | Taille du header TCP (pour localiser le début des données) |
| Flags | Champs de contrôle (voir ci-dessous) |
| Window Size | Nombre d’octets que le récepteur peut encore accepter (contrôle de flux) |
| Checksum | Vérification d’intégrité du segment + payload |
Les flags TCP
| Flag | Nom | Rôle |
|---|---|---|
SYN | Synchronize | Initie une connexion |
ACK | Acknowledge | Acquitte des données reçues |
FIN | Finish | Fermeture gracieuse de la connexion |
RST | Reset | Fermeture brutale / connexion invalide |
PSH | Push | Demande à livrer les données immédiatement à l’application |
URG | Urgent | Indique des données urgentes (rare en pratique) |
Le Three-Way Handshake — établissement de connexion
Toute connexion TCP commence par cet échange en 3 temps. Sans lui, aucune donnée ne transite.
Client Serveur
│ │
│ ──── SYN (seq=1000) ────────────────► │
│ "Je veux me connecter, │
│ mon numéro de séquence est 1000" │
│ │
│ ◄─── SYN-ACK (seq=5000, ack=1001) ─── │
│ "D'accord, mon seq est 5000, │
│ j'attends ton octet 1001" │
│ │
│ ──── ACK (seq=1001, ack=5001) ───────► │
│ "Compris, j'attends ton 5001" │
│ │
│ ══════════ Données ══════════════════ │
│ │
Fermeture de connexion TCP (Four-Way)
La fermeture est asymétrique : chaque côté ferme sa direction indépendamment.
Client Serveur
│ ──── FIN ──────────────────────────► │ "J'ai fini d'envoyer"
│ ◄─── ACK ────────────────────────── │ "Reçu"
│ │ (le serveur peut encore envoyer)
│ ◄─── FIN ────────────────────────── │ "Moi aussi j'ai fini"
│ ──── ACK ──────────────────────────► │ "Reçu"
│ │
[connexion fermée des deux côtés]
TCP vs UDP — quand choisir ?
| Critère | TCP | UDP |
|---|---|---|
| Connexion | Établie (3-way handshake) | Aucune |
| Ordre | Garanti | Non garanti |
| Fiabilité | Retransmission automatique | Perte ignorée |
| Contrôle de flux | Window Size | Aucun |
| Latence | Plus haute (overhead) | Plus basse |
| Usage typique | HTTP, SSH, SMTP, base de données | DNS, streaming vidéo, jeux, VoIP |
| Taille header | 20 octets min | 8 octets |
Ports TCP/UDP courants
| Port | Protocole | Usage |
|---|---|---|
22 | TCP | SSH — accès distant sécurisé |
53 | TCP/UDP | DNS — résolution de noms |
80 | TCP | HTTP |
443 | TCP | HTTPS |
3306 | TCP | MySQL |
5432 | TCP | PostgreSQL |
6379 | TCP | Redis |
9200 | TCP | Elasticsearch |
2379-2380 | TCP | etcd (Kubernetes) |
10250 | TCP | kubelet API |
Suivi d’un paquet : traceroute
traceroute exploite le TTL pour identifier chaque routeur sur le chemin :
traceroute github.com
# Chaque ligne = un routeur (hop)
# Le TTL est incrémenté de 1 à chaque envoi
# Quand TTL=0, le routeur renvoie un ICMP "Time Exceeded"
# 1 192.168.1.1 1.2 ms (box internet)
# 2 10.0.0.1 5.4 ms (routeur FAI)
# 3 72.14.204.1 12.1 ms (backbone Google)
# ...
# 10 140.82.121.4 25.3 ms (github.com)En relation avec
- Couches OSI — le contexte L3/L4 dans le modèle en couches
- UDP — le pendant sans connexion de TCP, même couche 4
- Requêtes HTTP et HTTPS — le payload que TCP transporte
- Pile réseau — Vue d’ensemble — hub de navigation, encapsulation et “qui voit quoi”
- NAT — modifie les IPs et ports du header IP/TCP
- Table de Routage — utilisée par les routeurs pour acheminer les paquets IP
- TLS et SSL — TLS s’appuie sur TCP (L4)
- RPC — gRPC s’appuie sur HTTP/2 sur TCP