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)              │
└────────────────────────────────────────────────────────────────┘
ChampTailleRôle
Version4 bitsIPv4 (4) ou IPv6 (6)
IHL4 bitsLongueur du header IP (en mots de 32 bits, min = 5 = 20 octets)
DSCP / ECN8 bitsQualité de service (priorité du paquet)
Total Length16 bitsTaille totale du paquet (header + payload), max 65 535 octets
Identification16 bitsIdentifiant unique pour rassembler les fragments
Flags3 bitsDF (Don’t Fragment), MF (More Fragments)
Fragment Offset13 bitsPosition du fragment dans le paquet original
TTL8 bitsTime To Live — décrémenté de 1 à chaque routeur, paquet supprimé si TTL = 0
Protocol8 bitsProtocole encapsulé : 6 = TCP · 17 = UDP · 1 = ICMP
Header Checksum16 bitsVérification d’intégrité du header IP uniquement
Source IP32 bitsAdresse IP de l’émetteur
Destination IP32 bitsAdresse IP du destinataire

Le TTL sert à éviter les boucles de routage infinies. Sa valeur initiale est typiquement 64 (Linux) ou 128 (Windows). La commande traceroute exploite ce mécanisme.


IPv4 vs IPv6

IPv4IPv6
Taille adresse32 bits (192.168.1.1)128 bits (2001:db8::1)
Nombre d’adresses~4,3 milliards~340 undécillions
HeaderVariable (20-60 octets)Fixe (40 octets)
FragmentationPar routeurs et hôtesUniquement par l’hôte source
ChecksumOui (recalculé à chaque routeur)Supprimé (délégué aux couches supérieures)
NATNé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)                             │
└─────────────────────────────────────────────────────────────────┘
ChampRôle
Port sourcePort de l’application émettrice (choisi aléatoirement, ex. 52341)
Port destinationPort de l’application cible : 80=HTTP · 443=HTTPS · 22=SSH · 53=DNS
Numéro de séquencePosition du premier octet de ce segment dans le flux de données
Numéro d’ACKProchain octet attendu — confirme la réception de tout ce qui précède
OffsetTaille du header TCP (pour localiser le début des données)
FlagsChamps de contrôle (voir ci-dessous)
Window SizeNombre d’octets que le récepteur peut encore accepter (contrôle de flux)
ChecksumVérification d’intégrité du segment + payload

Les flags TCP

FlagNomRôle
SYNSynchronizeInitie une connexion
ACKAcknowledgeAcquitte des données reçues
FINFinishFermeture gracieuse de la connexion
RSTResetFermeture brutale / connexion invalide
PSHPushDemande à livrer les données immédiatement à l’application
URGUrgentIndique 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èreTCPUDP
ConnexionÉtablie (3-way handshake)Aucune
OrdreGarantiNon garanti
FiabilitéRetransmission automatiquePerte ignorée
Contrôle de fluxWindow SizeAucun
LatencePlus haute (overhead)Plus basse
Usage typiqueHTTP, SSH, SMTP, base de donnéesDNS, streaming vidéo, jeux, VoIP
Taille header20 octets min8 octets

Ports TCP/UDP courants

PortProtocoleUsage
22TCPSSH — accès distant sécurisé
53TCP/UDPDNS — résolution de noms
80TCPHTTP
443TCPHTTPS
3306TCPMySQL
5432TCPPostgreSQL
6379TCPRedis
9200TCPElasticsearch
2379-2380TCPetcd (Kubernetes)
10250TCPkubelet 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