Un protocole réseau, c'est d'abord un en-tête : des champs de taille fixe, que l'émetteur remplit et que le récepteur lit dans le même ordre. Une requête HTTP vers le port 80 d'un serveur part dans un segment TCP qui porte les ports, glissé dans un paquet IP qui porte les adresses IP, glissé dans une trame Ethernet qui porte les adresses MAC, celles des cartes réseau. Ici, tu ouvres ces en-têtes un par un, comme en TP : ce que dit chaque champ, et qui le lit.
Chaque protocole à sa couche
À l'émission, chaque couche ajoute son en-tête devant ce que lui confie la couche du dessus ; à l'arrivée, chacune lit le sien et le retire. C'est l'encapsulation. La RFC 1122, un des textes qui définissent Internet, nomme les quatre couches du modèle TCP/IP : application, transport, internet et liaison. Beaucoup de cours disent « accès réseau » pour la dernière.
| Protocole | Couche OSI | Couche TCP/IP | Ce que son en-tête désigne |
|---|---|---|---|
| HTTP, DNS | 7 | application | aucune adresse réseau (DNS traduit les noms en adresses IP) |
| TCP, UDP | 4 | transport | le programme, par son port |
| IP | 3 | internet | la machine, par son adresse IP |
| Ethernet | 1 et 2 | liaison | la carte réseau du prochain saut, par sa MAC |
TCP/IP ne découpe pas la couche application : ce qu'OSI range en couches 5 (session) et 6 (présentation) se fait à l'intérieur des protocoles d'application.
Ethernet et ARP
Une trame Ethernet s'ouvre sur 14 octets : MAC de destination (6 octets), MAC source (6), puis EtherType (2), qui dit en hexadécimal ce que transporte la trame : 0x0800 pour IPv4, 0x0806 pour ARP. Suivent les données, de 46 à 1 500 octets, puis 4 octets de FCS, un code de contrôle qui permet de jeter une trame abîmée.
Pour remplir la MAC de destination, ton PC ne connaît qu'une adresse IP. ARP (Address Resolution Protocol) fait le lien : ton PC demande à tout le réseau local, à l'adresse de diffusion ff:ff:ff:ff:ff:ff, « qui a 192.168.1.1 ? », et seule la machine concernée lui répond avec sa MAC. Ce message voyage dans la trame sans en-tête IP, d'où son classement hésitant entre couches 2 et 3.
Piège classique : pour joindre un serveur d'un autre réseau, ton PC ne demande jamais sa MAC. Son masque de sous-réseau lui dit que la destination est ailleurs : il demande la MAC de sa passerelle, le routeur de sortie du réseau. La trame porte l'IP du serveur, mais la MAC du routeur.
IP et ICMP
L'en-tête IPv4, défini par la RFC 791, fait au moins 20 octets. Six champs suffisent pour lire ce qu'affiche un analyseur de trames, le logiciel qui capture le trafic.
| Champ | Taille | Ce qu'il indique |
|---|---|---|
| Version | 4 bits | 4 pour IPv4 |
| IHL (Internet Header Length) | 4 bits | longueur de l'en-tête, en mots de 4 octets : 5 donne 20 octets |
| Longueur totale | 16 bits | en-tête et données, en octets |
| TTL (Time To Live) | 8 bits | baisse à chaque routeur ; à 0, le paquet est détruit |
| Protocole | 8 bits | ce qui suit : 1 ICMP, 6 TCP, 17 UDP |
| Adresses | 32 bits chacune | source, puis destination |
Le TTL évite qu'un paquet tourne sans fin dans une boucle. Chaque routeur le baisse d'au moins 1 ; celui qui le voit tomber à 0 jette le paquet et peut prévenir la source par un message ICMP « Time Exceeded » (type 11). C'est ce que traceroute exploite pour faire répondre un à un les routeurs du trajet.
ICMP, le protocole des messages d'erreur et du ping, est porté directement par IP (Protocole 1) : pas de TCP ni d'UDP, donc pas de port.
TCP et UDP
Leurs en-têtes commencent tous deux par le port source et le port destination, sur 16 bits chacun, donc de 0 à $2^{16} - 1 = 65\,535$. Côté serveur, le port désigne le service : 80 pour HTTP, 443 pour HTTPS, 53 pour DNS. Le client prend un port temporaire, que le serveur reprend comme destination dans sa réponse.
L'en-tête UDP s'arrête à 8 octets : les deux ports, la longueur et une somme de contrôle. Ni numéro ni accusé de réception : un datagramme perdu est perdu, à l'application de redemander.
TCP, défini par la RFC 9293, livre un flux d'octets complet et dans l'ordre. Son en-tête fait au moins 20 octets. Le numéro de séquence (32 bits) situe le premier octet de données du segment : TCP compte les octets, pas les segments. Le numéro d'acquittement (32 bits) annonce le prochain octet attendu. La fenêtre (16 bits) dit combien d'octets le récepteur accepte encore. Des drapeaux, dont SYN, ACK et FIN, donnent le rôle du segment.
Une connexion s'ouvre en trois segments.
Étape 1 : le client envoie un SYN, avec son numéro initial $x$.
Étape 2 : le serveur répond par un SYN-ACK, avec son propre numéro initial $y$ et l'acquittement $x + 1$.
Étape 3 : le client répond par un ACK, avec l'acquittement $y + 1$ ; ses données partiront du numéro $x + 1$.
Piège classique : l'acquittement annonce le prochain octet attendu, pas le dernier reçu. Après 100 octets numérotés à partir de 1001, il vaut 1101, pas 1100. Et le SYN, comme le FIN, consomme à lui seul un numéro, d'où le $x + 1$.
Ce qu'un routeur réécrit
Un routeur retire l'en-tête Ethernet, lit l'IP de destination et cherche dans sa table de routage, la liste des réseaux qu'il sait joindre, le prochain saut : routeur suivant ou machine finale. Il baisse le TTL, recalcule la somme de contrôle IP, qui couvre le TTL, puis fabrique une trame neuve : sa MAC en source, celle du prochain saut en destination. Les adresses MAC changent donc à chaque réseau traversé, alors que les adresses IP et les ports arrivent tels qu'ils sont partis.
Le NAT (traduction d'adresses) de ta box fait exception : il remplace l'adresse privée de ton PC par l'adresse publique de la box, et au besoin le port source.
Exercices corrigés
Cherche chacun sur ta feuille avant d'ouvrir la correction.
Exercice 1 : Un analyseur de trames affiche les 20 premiers octets d'un paquet IP, en hexadécimal : 45 00 00 3c 1c 46 40 00 40 06 20 aa c0 a8 01 0a cb 00 71 19. Donne la version, la longueur de l'en-tête, la longueur totale, le TTL, le protocole transporté, les deux adresses et la taille de ce qui suit l'en-tête IP.
Correction :
Le premier octet, 45, se lit en deux moitiés : 4 pour la version (IPv4), 5 pour l'IHL, soit $5 \times 4 = 20$ octets d'en-tête.
Les octets 3 et 4, 00 3c, donnent la longueur totale : $3 \times 16 + 12 = 60$ octets. Le neuvième, 40, est le TTL : $4 \times 16 = 64$. Le dixième, 06, annonce TCP.
Les huit derniers octets sont les adresses, un octet par nombre (c0 vaut $12 \times 16 = 192$) : source 192.168.1.10, destination 203.0.113.25.
Il reste $60 - 20 = 40$ octets pour le segment TCP.
Exercice 2 : Données fictives. Un client ouvre une connexion TCP avec le numéro initial 4000 ; le serveur choisit 9000. Le client envoie 250 octets, puis le serveur répond par 1 200 octets. Donne la séquence et l'acquittement des cinq segments : SYN, SYN-ACK, ACK, données du client, réponse du serveur.
Correction :
SYN : séquence 4000, pas d'acquittement (drapeau ACK baissé).
SYN-ACK : séquence 9000, acquittement 4001, car le SYN a consommé le numéro 4000.
ACK : séquence 4001, acquittement 9001 ; cet ACK seul ne consomme aucun numéro.
Données du client : séquence 4001, acquittement 9001. Les 250 octets portent les numéros 4001 à 4250.
Réponse du serveur : séquence 9001, acquittement $4001 + 250 = 4251$, le prochain octet qu'il attend. Le client acquittera ensuite par $9001 + 1200 = 10\,201$.
Exercice 3 : Ton PC a l'adresse 192.168.1.10, le masque 255.255.255.0 et la passerelle 192.168.1.1. Il envoie un ping vers 203.0.113.25, situé derrière trois routeurs, avec un TTL de départ de 64. Quelles adresses MAC et IP de destination porte la trame qui quitte ton PC ? Quel port de destination ? Quel TTL lit le serveur, si chaque routeur le baisse de 1 ?
Correction :
Le masque garde les trois premiers octets : 203.0.113.25 n'est pas dans le réseau 192.168.1.0. La trame part donc vers la passerelle : MAC de destination, celle de 192.168.1.1, trouvée par ARP ; IP de destination, 203.0.113.25, inchangée jusqu'au serveur.
Port : aucun. Le ping utilise ICMP, porté directement par IP, sans TCP ni UDP. Donner un numéro de port, c'est l'erreur visée.
TTL à l'arrivée : $64 - 3 = 61$.
À retenir
À retenir :
- Chaque couche ne lit que son en-tête : MAC pour un saut, IP pour tout le trajet, port pour le programme au bout.
- Pour un serveur lointain, ARP cherche la MAC de la passerelle, jamais celle du serveur.
- IPv4 : 20 octets au moins ; Protocole 1 pour ICMP, 6 pour TCP, 17 pour UDP.
- UDP : 8 octets d'en-tête. TCP : 20 au moins, et son acquittement annonce le prochain octet attendu.
Sources
- RFC 1122, « Requirements for Internet Hosts, Communication Layers », octobre 1989 : texte sur rfc-editor.org.
- RFC 791, « Internet Protocol », septembre 1981 : texte sur rfc-editor.org.
- RFC 9293, « Transmission Control Protocol (TCP) », août 2022 : texte sur rfc-editor.org.