Nous allons maintenant aborder dans ce cours des notions plus difficiles qui nécessiteront sûrement une étude plus longue et attentive du contenu. N’hésitez donc pas à relire les paragraphes jusqu’à être sûr de bien les avoir compris. On ne devient pas un spécialiste des réseaux sans faire fonctionner les neurones et y laisser un peu de sueur ! Si vous êtes prêt, on va directement avancer sur un rôle que nous ne connaissons pas encore du protocole IP !
Nous allons donc étudier plus en détail le protocole IP. Jusqu’à maintenant, vous ne connaissez que les éléments qui ont été utiles pour comprendre l’adressage IP et le routage, mais nous allons voir que l’en-tête IP contient d’autres informations utiles pour rendre tous les services attendus par le protocole IP.
Nous avons vu que le rôle principal de la couche 3 était d’interconnecter les réseaux, et que cela se faisait notamment grâce au routage. Le datagramme IP contenait alors les adresses IP source et destination, ce qui permettait de savoir à qui il devait être envoyé et donc de déterminer la route à utiliser pour joindre l’adresse de destination.
Mais nous allons voir que l’en-tête IP contient d’autres informations qui permettront à ce protocole d’assurer d’autres rôles annexes.
Le format de l’en-tête
Cet en-tête fait 20 octets, et nous n’en connaissons actuellement que 8 d’entre eux (4 pour l’adresse IP source, et 4 pour la destination). Nous pouvons faire la connaissons d'un de plus, le TTL (ou Time To Leave) dans cet article sur les protocoles ICMP. Il nous en reste donc 11 à découvrir !
Voici le format d’un en-tête IP :
Houlà ! qu’est-ce que c’est que ce tableau complexe ?
Nous allons le décortiquer pas à pas, car son écriture n’est effectivement pas si simple.
Les chiffres que vous voyez sur la première ligne sont les bits, nous allons donc en avoir 32 par ligne (de 0 à 31, il y en a 32, faites le calcul).
Une ligne correspond donc à 32 bits, soit 4 octets, vu qu’un octet est composé de 8 bits. L’en-tête IP s’arrête à l’adresse destination, soit la cinquième ligne. Nous avons donc cinq lignes de 4 octets, soit 20 octets, ce qui est conforme à ce que nous attendions.
Mais pourquoi avoir mis les informations en tableau plutôt qu’en ligne comme nous le faisions avant ?
Car il aurait fallu avoir une très grande ligne ! Pour pouvoir mieux présenter les informations, on a coupé la grande ligne et mis les morceaux les uns au-dessus des autres.
Ainsi, juste après l’information Total length, on a l’IPID, etc.
Mais pourquoi avoir écrit les informations dans l’en-tête en anglais ? Ce cours est en français !
Car la grande majorité des informations que vous pourrez trouver sur ce sujet est en anglais, et que la plupart des personnes qui traitent des réseaux utilisent les termes anglais plutôt que les termes français. C’est comme le switch et le commutateur !
OK, mais ils veulent dire quoi maintenant tous ces champs ?
Nous allons les étudier un par un, déjà, voici en bleu ceux que vous connaissez :
Nous allons maintenant présenter les autres, en commençant par la première ligne.
Détaillez les champs de l’en-tête
Version, 4 bits
Ce champ représente la version de protocole IP. Eh oui, il peut y avoir plusieurs versions de protocole IP. Aujourd’hui, nous utilisons la version 4, mais la version 6 est déjà très présente sur Internet. Vous avez peut-être déjà entendu parler d’IPv6, qui est l’avenir d’Internet.
Mais pourquoi le champ Version est-il en premier ?
Car c’est de lui que dépend le format du datagramme. En effet, selon la version du protocole utilisée, le contenu de l’en-tête ne sera pas le même. Il est donc important de savoir quelle version est utilisée pour savoir quelle information on va trouver par la suite.
Pour les plus curieux, vous pouvez aller voir des informations sur Internet sur le protocole IPv6, et notamment la taille des adresses IPv6...
HLEN, 4 bits : Ce qui veut dire Header Length, soit en français, longueur de l’en-tête. Ce champ sert donc à indiquer la longueur de l’en-tête, qui devrait toujours être 20 octets, comme nous l’avons vu, mais nous voyons aussi sur l’image qu’il peut y avoir des options qui agrandissent alors l’en-tête. Cependant, ces options sont surtout historiques et ne sont quasiment plus utilisées, donc notre en-tête fera toujours 20 octets.
Les plus perspicaces d’entre vous se seront peut-être posé une question :
Comment fait-on pour coder la taille de l’en-tête IP sur 4 bits alors que celle-ci peut valoir 20 octets ?
En effet, 4 bits permettent de coder 2 valeurs, soit 16 valeurs, on ne devrait donc pas pouvoir indiquer que l’en-tête fait 20 octets, et que dire s’il y a des options !
Mais les inventeurs d’IP ont été malins et ils ont prévu cela. La valeur mise pour la longueur de l’en-tête ne sera pas en octets, mais en morceaux de 4 octets. Ainsi, si l’on a la valeur 5 dans ce champ, l’en-tête fera 5*4 octets = 20 octets !
Et là, cela fonctionne bien. Le seul inconvénient est qu’il faut maintenant avoir un en-tête dont la taille est un multiple de 4 octets. C’est pour cela que l’on voit en fin d’en-tête le Padding, qui veut dire bourrage en français, et qui consiste à ajouter des 0 à la fin de l’en-tête si celui-ci n’est pas un multiple de 4.
Mais encore une fois, dans 99 % des cas, l’en-tête n’aura pas d’options et fera 20 octets.
TOS, 8 bits : Qui veut dire Type of Service, ou type de service, en français. Au départ, ce champ devait servir à pouvoir donner une priorité plus élevée que les autres à un paquet. Mais cela a été très peu utilisé, même si cela a été standardisé plusieurs fois. Il est donc très peu utilisé aujourd’hui.
Total length, 16 bits : Longueur totale, en français. Cela représente donc le nombre total d’octets présents dans le datagramme IP. C’est ce champ qui va nous poser problème dans cette partie du cours !
En effet, il est codé sur 16 bits, il peut donc prendre valeurs, soit 65 536 valeurs ! Notre datagramme pourra donc avoir une longueur totale de 65 535 octets.
Et ça ne vous étonne pas, ça !?!
Cela devrait, pourtant !
Revenons au mécanisme d’encapsulation que nous avons vu dans ce chapitre du cours Concevez votre réseau TCP/IP :
Nous voyons bien ici que le datagramme de couche 3 est contenu dans la trame de couche 2.
La taille maximale possible pour une trame Ethernet est de 1 518 octets. Et celle-ci doit pouvoir contenir un datagramme de... 65 535 octets ! Cela ne pourra pas bien marcher... ou alors il va falloir tasser très fort dans la trame.
Il va donc falloir faire quelque chose pour pouvoir régler ce problème. C’est ce quelque chose qui va nous intéresser dans ce chapitre ; c’est la fragmentation, qui consistera à couper un datagramme en plein de petits paquets !
Mais avant de nous y attarder, finissons d’abord le parcours de l’en-tête IP.
Nous arrivons à la seconde ligne avec les champs IPID, flags et Fragment offset. Nous n’allons pas étudier ces champs tout de suite, car ce sont ceux qui vont nous intéresser pour la fragmentation et nous allons les voir en détail dans la suite du chapitre.
Passons donc à la troisième ligne.
TTL, 8 bits : Comme nous le savons déjà, il s’agit du Time to live, ou durée de vie en français. Ce champ sert à pouvoir rejeter et détecter les paquets qui tournent indéfiniment dans le réseau à la suite d’une erreur de routage, pour éviter de saturer celui-ci.
Protocol 4, 8 bits : Ce champ représente l’indication du protocole de couche 4 qui a été utilisé lors de l’envoi, cela sera TCP ou UDP dans la majeure partie des cas.
Checksum, 16 bits : Ou Somme de contrôle en français. Ce champ sert à vérifier que les informations n’ont pas été altérées pendant le transport. Si jamais un 1 ou un 0 a changé, la somme de contrôle ne sera pas correcte et le destinataire pourra voir qu’il y a eu un problème.
Nous arrivons enfin à ce que nous connaissons, les adresses IP source et destination, codées, comme on pouvait le prévoir, sur 4 octets chacune.
Enfin, il peut y avoir des options à notre datagramme, mais cela est plutôt historique et n’est plus utilisé aujourd’hui.
Voilà, vous connaissez maintenant le contenu exact d’un en-tête IP. D’ailleurs, pour vous montrer ce que cela peut donner dans la réalité, nous allons voir une capture Wireshark dans laquelle nous voyons clairement chacun de ces champs.
Ici, l’en-tête IP a été déployé, et l’on voit son contenu qui correspond bien à ce que nous avons vu auparavant, ouf !
Version : 4
Longueur de l’en-tête : 20 octets (la vraie valeur est 5, mais Wireshark l’interprète directement)
TOS : 0
Longueur totale : 1 326 octets
IPID : 58014
Flags : 2
Fragment offset : 0
TTL : 64
Protocole de couche 4 : 6, soit TCP
Checksum : il est correct !
Adresse IP source : 10.8.98.13
Adresse IP destination : 74.125.230.81
Maintenant que l’en-tête est connu et maîtrisé (il n’est pas utile de tout retenir par cœur, le but est juste de connaître les champs et leurs rôles), nous allons pouvoir nous attarder sur notre problème principal de faire entrer 65 535 octets dans une trame de 1 518 octets !