TCP/IP : Le protocole IP pour les nuls

Tous les appareils présents sur Internet, que ce soient des PC, des serveurs, des smartphones, ou des objets connectés, doivent utiliser les protocoles universellement adoptés pour communiquer. Ils doivent être conforme au modèle OSI.

Le modèle OSI (Open Systems Interconnection), normalisé par l’ISO en 1984, décrit sept couches superposées. Chaque couche fournit un service à la couche supérieure et utilise les services de la couche inférieure. Ce découpage permet de faire évoluer une couche indépendamment des autres.

Couche 1, physique : Se charge de la transmission des bits sur un support (câble cuivre, fibre optique, ondes radio). Elle définit les tensions électriques, les débits, les modulations.

Couche 2, liaison : Se charge de l’organisation des bits en trames, de la détection d’erreur, de l’adressage sur le lien local (adresses MAC pour Ethernet). Protocoles de couche 2 : Ethernet, Wi-Fi, PPP.

Couche 3, réseau : Se charge de l’acheminement des paquets de l’appareil source à l’appareil destination à travers plusieurs réseaux intermédiaires. Protocoles de couche 3 : IP (que nous allons détailler ici), ICMP, et des protocoles de routage comme OSPF et BGP.

Couche 4, transport : Se charge de la fiabilité de la liaison de bout en bout, du contrôle de flux, du réordonnancement. Protocoles de couche 4 : TCP, UDP, SCTP.

Couche 5, session : Se charge de la gestion des sessions entre applications. Cette couche est rarement implémentée distinctement dans la pile Internet.

Couche 6, présentation : Se charge du codage des données, chiffrement, compression. TLS/SSL (qui permet notamment de faire du web en https) se situe ici dans cette couche 6.

Couche 7, application : On y retrouve les protocoles applicatifs directement utilisés par les logiciels : HTTP, DNS, SMTP, SSH, FTP.

Pour qu’un appareil puisse communiquer sur Internet, il lui faut embarquer les couches logicielles correspondant aux couches du modèle OSI.

Ainsi, lorsque 2 appareils communiquent via Internet, même si conceptuellement on pense qu’il se passe cela :

En réalité, il se passe cela :

Concrètement, si l’appareil de gauche veut envoyer des données à l’appareil de droite, ses données vont descendre au travers des 7 couches dans ses logiciels internes (chaque étage encapsule dans les données qu’il gère les données reçues de l’étage directement supérieur et livre le résultat à l’étage directement inférieur), puis être transmises sur Internet par la couche physique. Lorsqu’elles vont arriver à l’appareil de droite, elles vont suivre le chemin inverse en traversant les couches en montant (chaque étage désencapsule les données qu’il reçoit de l’étage directement inférieur, et livre le résultat à l’étage directement supérieur), jusqu’à être délivrées au programme destinataire.

Si l’appareil de droite veut répondre à l’appareil de gauche, les données emprunteront le chemin inverse (descente et encapsulations à droite, puis à l’arrivée montée et désencapsulations).

En théorie, si l’on veut comprendre comment se font les dialogues entre appareils sur Internet il faudrait étudier ce qui se passe au sein des 7 couches.

En pratique, on comprend déjà beaucoup de choses si l’on étudie les couches 3 (réseau, le protocole important à connaître est IP) et 4 (transport, les protocoles importants à connaître sont TCP et UDP, que nous étudierons).

IP est donc un protocole de la couche 3 du modèle OSI, la couche réseau. Sa fonction unique est d’acheminer des blocs de données, les datagrammes, d’une adresse source à une adresse destination à travers un ensemble de réseaux interconnectés. Il ne garantit pas la livraison des données au destinataire (elles peuvent donc se perdre sur Internet). Il ne garantit pas l’ordre d’arrivée des données au destinataire (elles peuvent donc arriver, ou pas, dans le désordre). Il ne vérifie pas l’intégrité des données transportées. Ces responsabilités sont déléguées aux couches supérieures ou au protocole choisi au-dessus de lui. Ce choix de conception minimaliste est la raison pour laquelle IP a survécu à toutes les évolutions des technologies de liaison et des usages depuis cinquante ans.

IP est donc un protocole indispensable au fonctionnement d’Internet, mais qui a de très grosses lacunes, qui doivent être compensées par les protocoles de la couche 4. Avant de détailler le fonctionnement d’IP, un peu d’histoire.

D’ARPANET au protocole unique d’Internet

En 1969, le ministère américain de la Défense finance ARPANET, un réseau expérimental reliant quatre ordinateurs universitaires. L’idée directrice, théorisée par Paul Baran quelques années plus tôt à la RAND Corporation, est de découper les messages en petits blocs indépendants, les paquets, capables de trouver leur chemin dans un maillage. Si un nœud est détruit, les paquets contournent la panne. Le réseau n’a pas de centre vulnérable. Il est ainsi conçu pour résister à d’éventuelles frappes nucléaires soviétiques. Si une ville est détruite, les paquets passeront par un autre chemin du maillage de villes mais ils trouveront toujours un chemin pour arriver à destination.

Le premier protocole de communication d’ARPANET s’appelle NCP, Network Control Program, déployé en 1970. Il fonctionne, mais avec une hypothèse lourde : le réseau est supposé fiable. Or ARPANET grandit et s’interconnecte avec d’autres réseaux expérimentaux, notamment un réseau radio par paquets (PRNET) et un réseau satellite (SATNET). Ces réseaux ont des caractéristiques physiques radicalement différentes : latences, taux d’erreur, tailles de paquets variables. Un protocole qui suppose la fiabilité du lien sous-jacent ne peut pas fonctionner sur une interconnexion aussi hétérogène.

Vint Cerf

Vint Cerf et Bob Kahn, alors chercheurs à Stanford et à l’ARPA, publient en 1974 un article intitulé « A Protocol for Packet Network Intercommunication« . Ils proposent de séparer strictement deux fonctions : le transport de bout en bout, garantissant la fiabilité et le contrôle de flux (TCP), et l’acheminement de paquets de passerelle en passerelle sans garantie (IP). Cette séparation permet à chaque réseau de conserver ses spécificités internes. IP devient la couche d’interopérabilité minimale commune.

Ce couple de protocoles, IP et TCP, seront donc désormais presqu’indissociables puisque l’un sait faire ce que l’autre ne sait pas et inversement.

Au cours des années 1980, TCP/IP s’impose dans le monde universitaire, porté par les distributions Berkeley Unix qui intègrent cette pile réseau. En 1989, le CERN adopte TCP/IP, et Tim Berners-Lee pose au-dessus le protocole HTTP. Le Web explose dans les années 1990, et avec lui le nombre d’hôtes connectés. IPv4 (version 4 du protocole IP, mais première version du protocole à avoir été largement déployée), dont l’espace d’adressage de 32 bits semblait inépuisable dans les années 1970, atteint ses limites (et l’ère des smartphones, qui eux aussi sont connectés en IP sur Internet, ne viendra que 17 ans plus tard). Dès 1992, l’IETF lance des travaux sur un successeur. La spécification d’IPv6 est publiée en 1998. Aujourd’hui, IPv4 et IPv6 coexistent, et la migration complète vers IPv6 est encore en cours.

Principe de fonctionnement d’IPv4

Comme nous l’avons dit rapidement, chaque appareil sur Internet a une adresse IP unique. Cette adresse est exactement le pendant de l’adresse postale de notre maison. Chaque maison a une adresse postale unique, sinon le facteur ne saurait pas où délivrer les colis.

Ici le facteur c’est IP, ou plutôt la succession d’équipements réseaux que les paquets IP vont traverser. Le challenge pour eux va être de réussir à trouver l’appareil de destination sur Internet, en ne connaissant qu’une seule information : son adresse IP.

Et cela ne va pas être facile, car pour communiquer entre un appareil qui serait par exemple en France, avec un appareil qui serait par exemple en Nouvelle Zélande, non seulement les paquets IP vont devoir franchir des dizaines de routeurs répartis sur le trajet, mais les paquets ne vont pas tous prendre le même chemin de routeurs (ce qui explique qu’ils n’arriveront pas tous dans l’ordre, le premier paquet étant par exemple susceptible d’emprunter un chemin qui s’avèrera plus long que celui du dernier paquet).

Il peut même y avoir certains paquets qui vont tourner dans le réseau Internet sans jamais trouver l’appareil de destination. Sans mécanisme d’élimination au bout d’un certain temps, le réseau Internet finirait par être saturé de paquets fantômes qui tournent sans jamais trouver leur destination. Ce mécanisme d’élimination repose sur un champ appelé TTL (Time To Live = durée à vivre) positionné au départ par l’appareil émetteur du paquet IP à une certaine valeur (par exemple 256) et décrémenté par les routeurs à chaque franchissement. Lorsqu’un routeur reçoit un paquet qui a un TTL à 1 il sait que sa décrémentation du TTL donnera zéro donc il élimine le paquet en le retransmettant pas. A la place il envoie un paquet ICMP (nous verrons cela dans un autre article) à l’appareil émetteur du paquet perdu pour l’informer de la perte de son paquet dans le réseau. Le problème est que le paquet ICMP est encapsulé dans IP et donc peut se perdre lui aussi sur le réseau.

En IPv4 l’adresse d’un appareil comporte 4 octets (un octet est un nombre utilisant 8 bits, chaque bit pouvant prendre la valeur 0 ou 1. Un octet peut donc prendre une valeur qui est comprise entre 0 et 255) qu’on note séparés par des points, par exemple 12.124.36.3

Cet espace d’adressage ne permet de ne connecter au réseau Internet que 4 294 967 296 appareils. Comme on l’a dit, dans les années 70 cela paraissait suffisant, maintenant, ne serait-ce qu’avec le nombre de smartphones en circulation, c’est largement insuffisant.

Ce nombre de 4 milliards d’adresses IP a été coupé en plages. Certaines plages ont été attribuées aux pays du monde. Ainsi un appareil donné peut savoir que l’appareil qui entre en contact avec lui utilise une adresse IP française, ou ghanéenne, ou guatémaltèque. Certaines plages ne peuvent pas être utilisées sur Internet, mais seulement sur des réseaux locaux (à l’intérieur des entreprises par exemple).

Ces adresses privées sont définies dans la RFC 1918 pour IPv4 :

Adresses IP de 10.0.0.0 à 10.255.255.255

Adresses IP de 172.16.0.0 à 172.31.255.255

Adresses IP de 192.168.0.0 à 192.168.255.255 : typiques des réseaux domestiques et des box internet.

La plage de 127.0.0.0 à 127.0.0.255 est réservée aux adresses de boucle locale (appelée loopback en anglais). 127.0.0.1 est l’adresse standard que toute machine utilise pour se désigner elle-même. Tout paquet envoyé à une adresse 127.x.x.x est traité localement et ne sort jamais sur le réseau.

La plage 169.254.x.x est réservée aux adresses de liaison locale auto-configurées (APIPA). Quand une machine est configurée pour obtenir une adresse par DHCP mais qu’aucun serveur DHCP ne répond, elle s’attribue une adresse dans cette plage. Cela permet une communication de base sur le segment local uniquement.

La plage 0.0.0.x est réservée et ne peut pas être utilisée comme adresse de destination. La valeur 0.0.0.0 est utilisée comme adresse source quand une machine demande une configuration DHCP et n’a pas encore d’adresse. En routage, 0.0.0.0/0 représente la route par défaut : « tout le trafic pour lequel je n’ai pas de route spécifique ».

Les adresses de multicast occupent la plage de 224.0.0.0 à 239.255.255.255. Elles ne désignent pas une machine unique mais un groupe de machines.

La plage 240.0.0.0/4 est réservée pour des usages futurs (anciennement classe E). Les systèmes d’exploitation refusent généralement d’utiliser ces adresses.

L’adresse de broadcast d’un réseau est celle où tous les bits de la partie hôte sont à 1. Par exemple, pour le réseau 192.168.1.0 à 192.168.1.255, l’adresse de broadcast est 192.168.1.255. Un paquet envoyé à cette adresse est remis à toutes les machines qui ont une adresse IP en 192.168.1.x

Regardons maintenant la structure d’un paquet IP. Elle est assez simple :

Dans le schéma ci-dessus, chaque colonne numérotée représente un bit (0 ou 1), donc chaque ligne représente 4 octets (32 bits) du paquet IP.

Les 4 premiers bits sont la version d’IP contenue dans le paquet. Vous l’avez compris, la valeur sera soit 4 soit 6 (en binaire 0100 ou 0110).

Longueur de l’en-tête : ce champ indique en binaire sur 4 bits la longueur totale de l’en-tête et cette longueur est donnée, non pas en bit, ni en octet, mais en mots de 32 bits (=4 octets). La longueur donnée correspond au nombre de lignes du schéma ci-dessus. La valeur est comprise entre 5 et 15, car il y a 20 octets minimum et on ne peut dépasser 40 octets d’option. La longueur maximale d’un en-tête est donc de 15*4 octets soit 60 octets.

Type de service : ce champ permet de distinguer différentes qualités de service différenciant la manière dont les paquets sont traités. Composé de 3 bits de priorité (donc 8 niveaux) et trois indicateurs permettant de différencier le débit, le délai ou la fiabilité.

Longueur totale : nombre total d’octets du paquet, en-tête IP comprise.

Identification : numéro permettant d’identifier les fragments d’un même paquet.

Indicateur (3 bits) : premier bit actuellement inutilisé. Lorsque le 2ème bit est positionné à 1, il indique que le paquet ne peut pas être fragmenté par les routeurs qu’il va traverser. Quand le 3ème bit est positionné à 1, on sait que ce paquet est un fragment de données et que d’autres doivent suivre. Quand il est à 0, soit le fragment est le dernier (et dans ce cas le fragment offset est différent de 0), soit le paquet n’a pas été fragmenté.

Fragment offset (13 bits) : position du fragment par rapport au paquet de départ, en nombre de mots de 8 octets. Lorsque la valeur indiquée est 0, il s’agit du premier fragment.

Durée de vie ou TTL (pour Time To Live) (8 bits) : initialisé par l’émetteur, ce champ est décrémenté d’une unité généralement à chaque saut de routeur. Quand TTL = 0, le paquet est abandonné et un message ICMP est envoyé à l’émetteur pour information.

Protocole encapsulé (8 bits) : numéro du protocole au-dessus de la couche réseau : TCP = 6, UDP = 17, ICMP = 1.

Somme de contrôle de l’en-tête ou Header Checksum (16 bits) : complément à un de la somme complémentée à un de tout le contenu de l’en-tête afin de détecter les erreurs de transfert. Si la somme de contrôle est invalide, le paquet est abandonné sans message d’erreur.

Adresse source (32 bits) : adresse IP de l’émetteur sur 32 bits. Il est fondamental que les paquets IP contiennent l’adresse IP de l’appareil qui a émis le paquet, sinon comment l’appareil cible saurait à qui répondre ?

Adresse destination (32 bits) : adresse IP de l’appareil de destination du paquet sur 32 bits. C’est sur cette valeur que les routeurs qui sont sur le trajet, et qui vont être traversés par le paquet, se basent pour tenter de trouver le bon chemin (routage) vers la destination.

Options (0 à 40 octets par mots de 4 octets) : facultatif.

Remplissage ou Padding : champ de taille variable comprise entre 0 et 7 bits. Il permet de combler le champ option afin d’obtenir un en-tête IP multiple de 32 bits. La valeur des bits de bourrage est 0.

Un mot sur les protocoles de plus haut niveau encapsulés dans IP.

Si la valeur du champ est 1 : ICMP (Internet Control Message Protocol). C’est le protocole de signalisation d’IP. Il transporte les messages d’erreur (destination inaccessible, TTL dépassé) et les requêtes de diagnostic. ICMP n’est pas utilisé par les applications directement (sauf par les commandes ping et traceroute), mais il est essentiel au fonctionnement du réseau.

Si la valeur du champ est 6 : TCP (Transmission Control Protocol). C’est le protocole de transport fiable. Il garantit que les données arrivent dans l’ordre, sans perte ni duplication, en utilisant des accusés de réception, des numéros de séquence, et des retransmissions automatiques. TCP établit une connexion avant d’échanger des données et la ferme proprement. Il adapte son débit à la capacité du réseau grâce au contrôle de congestion. TCP est utilisé par exemple par HTTP, HTTPS, SMTP, SSH, FTP et la quasi-totalité des applications qui exigent de l’intégrité.

Si la valeur du champ est 17 : UDP (User Datagram Protocol). C’est le protocole de transport sans connexion, sans accusé de réception, sans contrôle de congestion. L’application émet des datagrammes indépendants qui peuvent être perdus, dupliqués ou arriver dans le désordre. UDP est utilisé quand la vitesse prime sur la fiabilité : utilisé pour le streaming, la VoIP, les jeux en ligne, le DNS, NTP, les VPN, etc.

D’autres protocoles sont moins visibles mais importants. ESP (valeur du champ à 50) et AH (valeur du champ à 51) sont les protocoles d’IPSec pour le chiffrement et l’authentification des paquets IP. SCTP (valeur du champ à 132) est un protocole de transport orienté message avec support du multi-homing, utilisé dans la signalisation téléphonique. GRE (valeur du champ à 47) est un protocole d’encapsulation pour créer des tunnels.

Avantages et inconvénients du protocole IP

Avantages : IP est universel, robuste, et évolutif : on peut ajouter de nouveaux protocoles de transport facilement.

Inconvénients : IP ne fournit aucune garantie de livraison, d’ordre ou d’intégrité. La sécurité n’est pas intégrée et doit être ajoutée par des couches supérieures (TLS) ou des extensions (IPSec). IPv4 a épuisé ses adresses. La coexistence IPv4/IPv6 ajoute une complexité opérationnelle qui pèse sur l’administration des réseaux et des serveurs.

Et IPv6 alors ?

IPv6 (version 6) a été conçu pour remplacer IPv4. Une adresse IPv6 ressemble à ceci : 2001:0db8:85a3::8a2e:0370:7334. Elle est codée sur 128 bits, donc sur 16 octets (au lieu de 4 pour IPv4). Le nombre d’adresses possibles est de 340 undécillions (un chiffre à 38 zéros). En pratique, cela signifie qu’on peut attribuer des adresses à tous les objets connectés sans jamais manquer de place, et ce pour l’éternité (il y a plus d’adresses IPv6 disponibles que d’atomes dans l’univers).

Au-delà d’un espace d’adressage plus grand, IPv6 apporte un certain nombre de changements très intéressants, notamment la fin du NAT (Network Address Translation). Avec IPv4, votre box Internet partage une seule adresse publique sur Internet entre tous les appareils de votre domicile, ce qui oblige à une gymnastique technique compliqué appelée NAT. Avec IPv6, chaque appareil reçoit sa propre adresse publique.

Par ailleurs les paquets IPv6 sont plus simples. L’en-tête des paquets IPv6 est plus petit et plus structuré que celui d’IPv4. Les routeurs ont moins d’informations à traiter, ce qui réduit légèrement la latence. Ils circulent plus rapidement sur Internet.

De même, la sécurité est intégrée puisqu’IPv6 inclut nativement le protocole IPsec (chiffrement et authentification), là où IPv4 nécessitait une configuration séparée.

Enfin, les appareils en IPv6 peuvent générer leur propre adresse IP sans serveur DHCP (contrairement à IPv4). Il suffit qu’ils écoutent les annonces du routeur local.

Voici l’entête IPv6 :

Version contient le chiffre 6.

Traffic class indique la qualité de service du paquet IP. Oui, comme on peut le voir, IPv6 permettrait de faire un Internet à plusieurs vitesses en fonction par exemple du prix payé. Nous n’en sommes pas encore là mais le protocole sait le faire.

Flow label permet lui aussi de pousser la sélection des flux de manière à des fins de traitements différenciés.

Payload length indique la taille de la charge utile du paquet en octets.

Next Header identifie le type de header qui suit immédiatement selon la même convention qu’IPv4.

Hop Limit est l’équivalent du TTL (Time To Live) d’IPv4, il est décrémenté de 1 à chaque franchissement de routeur (et le paquet est mis à la poubelle par le routeur sur lequel ce champ arrivera à zéro), et ce afin d’éviter que des paquets IP tournent ad vitam eternam sur le réseau.

Source Address et Destination Address : adresses IPv6 de l’appareil émetteur du paquet et de l’appareil destinataire du paquet.

Contrairement à ce que l’on pourrait croire, car IPv6 a mis un temps fou à décoller, l’adoption d’IPv6 avance tout de même bien maintenant. L’arcep a mis en ligne une cartographie permettant de suivre l’état d’adoption d’IPv6 dans le monde.

Les informations par pays y sont accessibles, par exemple pour la France :

Pour aller plus loin :