# Les réseaux informatiques/Les datagrammes IP

Au niveau de la couche réseau, les données sont envoyées par paquets, composés d'une trame (de couche liaison) à laquelle on ajoute un en-tête de la couche réseau. Le protocole de la couche réseau est le protocole IP, qui a donné son nom aux adresses IP mentionnées dans le chapitre précédent. Dans ce chapitre, nous allons voir comment est structuré l'en-tête IP et nous verrons comment les paquets sont formés et structurés. Nous parlerons aussi du phénomène de fragmentation des paquets IP.

## La taille maximale des paquets

En théorie, rien ne limite la taille d'un paquet IP : on peut mettre autant de données qu'on veut derrière l'en-tête. Mais dans la pratique, la taille d'un paquet n'est pas infinie. Les divers équipements réseau n'ont pas une mémoire infinie et ont une limite fixe, qu'il faut prendre en compte.

### Le Maximum Transmission Unit

Chaque réseau/routeur/ordinateur/... a une taille de paquet maximale qu'il accepte et/ou peut gérer : le Maximum Transmission Unit (unité de transmission maximale), ou MTU. Précisons que le MTU comprend les données utiles et l’en-tête (qui est inclut dans le MTU).
Exemples de MTU pour divers protocoles réseau. :
| Type de réseau | MTU (en octets) |
| Arpanet (ancètre d'Internet) | 1 000 |
| Ethernet | 1 500 |
| FDDI | 4 470 |
Plus le MTU est grand, plus la transmission est efficace. Pour être plus précis, il faut introduire le rapport suivant :
    ${\frac {taille~des~donnees~utiles}{taille~totale~des~donnees}}={\frac {donnees}{en-tete~IP+donnees}}={\frac {donnees}{MTU}}$
Plus le MTU est grand, plus ce rapport augmente. On peut le comprendre assez intuitivement : plus le MTU est grand, moins l'en-tête prendra une proportion importante du MTU (rappelons que l'en-tête a une taille fixe).

### La fragmentation des paquets IP

Il est possible qu'un paquet IP doive passer par un réseau dont le MTU est trop petit pour lui. Cela arrive parfois au niveau des routeurs, lors du passage d'un réseau à un autre, à condition que les deux réseaux connectés aient des MTU différents. Si les deux réseaux connectés par un routeur ont un MTU identique, il n'y a pas de problème et le paquet IP est routé sans encombres. Si un paquet dépasse le MTU, il ne peut pas être transmis tel quel. Mais la transmission n'est pas interrompue ou annulée pour autant. À la place, le routeur utilise une procédure de fragmentation du paquet.
Le nom trahit ce que fait le routeur : il découpe le paquet en plusieurs mini-paquets compatibles avec le MTU de l'équipement, qui sont envoyés un par un. Les mini-paquets créés par le routeur sont appelés des fragments. Notons que l'en-tête du paquet IP originel est recopié au début de chaque fragment, sans quoi ceux-ci ne pourraient pas être routés correctement. De plus, les fragments sont envoyés uns par uns par le routeur, si possible dans l'ordre. Mais il se peut que les paquets arrivent dans le désordre au récepteur. Le routeur doit donc, en plus de fragmenter le paquet, ajouter des informations d'ordre à chaque fragment. Ces informations permettent au récepteur de remettre les fragments dans l'ordre, pour reconstruire le paquet initial.

## L'en-tête du protocole IP

Commençons par aborder l'en-tête du protocole IP. Précisons en premier lieu que celui-ci n'est pas le même selon que l'on parle d'en-tête Ipv4 ou IPv6. Il existe quelques différences, certes mineures, mais qui rendent l'exposé un peu difficile. On peut cependant noter qu'il existe quelques régularités qui sont valables aussi bien en IPv4 qu'en IPv6. Par exemple, l'en-tête contient systématiquement l'adresse IP de l'émetteur et celle du récepteur.

### L'en-tête du protocole IPv4

L'en-tête d'IPv4 est illustré à droite et chaque champ est expliqué ci-dessous. Dans les grandes lignes, on peut décomposer l'en-tête IPv4 en deux sections : une section de commande qui contient diverses options, et un champ d'adresse dans lequel on trouve les adresses IP de l'émetteur et du récepteur. L'ensemble des champs est codée sur minimum 20 octets, soit 160 bits, mais peut aussi prendre plus de place sur certains paquets.
La version du protocole est codée sur 4 bits. Ce champ sert à préciser si le segment est un segment IPv4 ou IPv6.
Les quatre bits suivants, notés IHL, indiquent la longueur de l'en-tête. Vu que l'IHL fait 4 bits, on en déduit que la longueur de l'en-tête est comprise entre 0 et 15 unités. Vous serez peut-être étonné, sachant que l'en-tête fait 20 octets, mais c'est parce que vous ne savez pas que cette longueur n'est pas exprimée en bits ou en octets, mais en paquets de 32 bits (4 octets). Ce qui fait donc une longueur totale théorique comprise entre 0 et 60 octets, pour l'en-tête. Dans les faits, l'en-tête a toujours une taille comprise entre 20 et 40 octets, par construction, ce qui fait que le champ IHL est toujours compris entre 5 et 15.
Le champ type de service est décrit par plusieurs RFC et ce champ est passé par trois versions différentes. Il sert pour la qualité de service, à savoir la gestion de la saturation du débit d'un nœud du réseau. Il est utilisé quand un routeur est saturé de paquets IP et qu'il ne peut plus en mettre en attente. Ce phénomène n'est pas rare et a reçu le nom de congestion réseau. Gérer une telle situation peut se faire de plusieurs manières. La plus simple est de supprimer certains paquets en attente, quitte à prévenir l'émetteur. En théorie, les paquets sont choisis de manière aléatoire, mais il est possible de privilégier certains types de paquets sur les autres. Pour cela, il faut créer plusieurs classes de paquets, de priorités différentes : les paquets de faible priorité sont supprimés en premier, alors que ceux de forte priorité sont les derniers à être supprimés. La priorité du paquet est indiquée par un numéro de six bits, le DSCP, qui est placé dans le champ type de service. Les deux bits restants sont utilisés pour autre chose, toujours pour gérer la congestion réseau.
Le champ longueur totale donne la longueur totale du segment, en-tête compris. Il est codé sur 16 bits, ce qui permet d'utiliser des segments de 64 kibioctets (65536 octets). Dans la réalité, les protocoles de couche 2 ne supportent pas des paquets aussi gros. Par exemple, le protocole Ethernet a une limite à 1500 octets par paquet, appelée MTU. Pour être compatibles avec une telle taille, les segments doivent donc être découpés en sous-segments compatibles avec le MTU. Ces sous-segments sont appelés des fragments. On appelle une telle opération la fragmentation.
Quand un segment est fragmenté en sous-segment, un problème se pose à la réception : comment remettre en ordre les morceaux et comment identifier les fragments ? C'est justement à cela que sert le champ suivant, nommé identification. Tous les fragments d'un même segment se voient attribuer le même identifiant, un numéro qui indique qu'ils sont du même segment.
Le champ suivant, les indicateurs, indique si le paquet reçu a été fragmenté, si des fragments vont suivre, et ainsi de suite. Il est codé sur trois bits :
* Le premier bit est réservé et reste à 0 ;
* Le second bit est appelé le bit Do Not Fragment. Comme son nom l'indique, il précise si le paquet peut être fragmenté ou si cette opération est interdite. S'il est à 0, la fragmentation est autorisée si nécessaire, alors qu'un 1 dit que la fragmentation est interdite.
* Le troisième bit précise si le paquet a déjà été fragmenté et si ce fragment est le dernier d'entre eux. Son nom est : bit More Fragments.
La position de chaque fragment dans le segment est quant à elle indiquée par un numéro, le fragment offset, présent à la suite des indicateurs.
Le champ suivant, le TTL est décrémenté quand il passe dans un routeur ou une machine. Quand il tombe à zéro, le segment est tout simplement abandonné, éliminé. Cela permet d'éviter qu'un segment soit routé indéfiniment. Le TTL étant codé sur un octet, sa valeur maximale est de 255 intermédiaires de routage.
Le champ protocole sert à indiquer s'il s'agit d'un segment TCP ou UDP. Il précise quel est le protocole de couche transport qui a généré le paquet.
Le reste de la section de commande est composé de bits de détection/correction d'erreurs.
Enfin, on trouve les adresses IP source et de destination.

### L'en-tête du protocole IPv6

L'en-tête utilisé par le protocole IPv6 est illustré ci-contre. On voit rapidement que l'en-tête IPv6 est plus simple que l'en-tête IPv4 : le nombre de champ est plus faible, et leur signification est plus facile à appréhender.
Comme pour IPv4, le tout premier champ donne la version du protocole utilisé, ici IPv6. Vu qu'il est codé sur 4 bits, il peut prendre 16 valeurs, mais la plupart n'a pas de signification. Seules les valeurs suivantes sont autorisées :
* 00 – Réservé ;
* 01 – Non assigné ;
* 04 – IP V4 ;
* 05 – ST Datagram Mode ;
* 06 – IP V6, 15 – Réservé.
Le champ Traffic Class, sur 8 bits, donne la priorité du paquet. Il sert dans les scénario qui requièrent une certaine qualité de service.
Le champ Flow Label, codé sur 20 bits est utilisé pour coder des séquences de paquets qui doivent subir un traitement spécial. Ce champ stocke le numéro du paquet dans la séquence.
Le champ Payload Length encode la longueur du paquet, en-tête IPv6 exclu.
Le champ Next Header code le type de données transmises dans le paquet : est-ce un paquet TCP, UDP, ICMP, ou autre ? Pour faire simple, il remplace le champ protocole d'IPv4.
Le champ Hop Limit est l'exact copie du champ TTL d'IPv4.
Enfin, les adresses source et destination sont placées en fin de paquet.