MOOC:Compagnon Act21-s7
From Livre IPv6
Activité 21: Le format de l’en-tête IPv6
Principes structurant l'en-tête IP
Comme rappelé en introduction de la séquence, la fonction principale du protocole IP est d'acheminer un paquet d'un point à un autre de l'Internet. Le modèle datagramme impose que chaque paquet soit traité indépendamment, sans se baser sur des informations issues d'autres paquets déjà transmis. L'en-tête IP doit donc comporter toutes les informations pour réaliser cet acheminement. C'est la raison pour laquelle chaque paquet doit contenir l'adresse de l'émetteur ainsi que du destinataire du paquet.
L'adresse du destinataire est fondamentale pour les équipements intermédiaires réalisant la fonction de routage. C'est en effet à partir de cette adresse que l'équipement décide vers quelle interface le paquet sera retransmis. La lecture de l'adresse du destinataire dans l'en-tête IP est donc une étape cruciale pour la performance globale de l'acheminement du paquet. Afin d'optimiser cette étape, deux principes ont été appliqués dans la spécification de l'en-tête IP :
- Une adresse IP est de taille fixe, permettant ainsi d'être récupérée dans l'en-tête directement en lisant un nombre de bits prédéterminé, sans avoir à lire ni interpréter au préalable un champ de longueur d'adresse ;
- L'adresse IP destination est à un emplacement fixe dans l'en-tête, emplacement aligné en mémoire, facilitant ainsi son extraction de l'en-tête par un simple décalage en mémoire, qui est une opération optimisée au niveau matériel.
Format de l'en-tête du datagramme IPv6
Le format d'en-tête du datagramme IPv6 est spécifié par le RFC 2460 (page 4). Cet en-tête, avec les champs le composant, est représenté par la figure 1. L'en-tête IPv6 est de taille fixe et se compose de 5 mots de 64 bits (contre 5 mots de 32 bits pour IPv4). La taille de l'en-tête IPv6 est donc de 40 octets.
Valeurs des champs de l'en-tête
Version
Le champ Version est au même emplacement et de même longueur, quelle que soit la version du protocole IP (IPv4 ou IPv6). Cette similarité permet à la pile réseau d'aiguiller correctement le paquet en se basant sur les 4 premiers bits de l'en-tête de niveau 3. Dans le cas d'IPv6, sa valeur est de 6 ; elle est de 4 pour IPv4. Le numéro de version 5 avait déjà été attribué au protocole Stream qui finalement n'a pas eu le succès attendu (RFC 1190, RFC 1819).
Classe de trafic (Traffic Class)
Dans la version standardisée par le RFC 2460, un champ Classe de trafic, sur 8 bits, permet la différenciation de services, conformément aux spécifications du RFC 2474.
Le champ Classe de trafic est défini de façon similaire au champ Differentiated Services (DS, ou DiffServ) de l'en-tête IPv4, qui a lui-même pris la place de l'octet Type of Service de la spécification initiale d'IPv4. Ce champ est découpé en deux parties (cf. figure 2). Le sous-champ DSCP (Differentiated Services Code Point) contient les valeurs identifiant les différents traitements que les routeurs appliquent. La valeur par défaut 000000 correspond au service au mieux (ou best effort). Les deux derniers bits du champ, notés ECN (Explicit congestion Notification), servent aux routeurs à reporter un risque de congestion en combinaison avec l'algorithme RED (Random Early Detection). Le codage des 2 bits ECN est décrit à la page 6 du RFC 6040.
Plus de détails sur l'utilisation de ce champ sont donnés en Annexe 1.
Identificateur de flux (Flow Label)
Ce champ, introduit dans le RFC 2460 puis spécifié en détails dans le RFC 6437, contient un numéro unique, choisi par la source, pour identifier le flux de données d'une application (l'ensemble des paquets voix d'une application de voix sur IP, par exemple).
Cette valeur a pour but de faciliter le travail des routeurs dans le traitement différencié de paquets et donc la mise en oeuvre des fonctions de qualité de service, comme RSVP (RFC 2205). En identifiant par cette valeur les datagrammes provenant d'un même flux, le routeur peut alors réaliser un traitement particulier : choix d'une route, traitement en "temps réel" de l'information. Habituellement, les routeurs se basent sur les valeurs de cinq champs pour construire un contexte propre à un même flux de données : adresses de la source et de la destination, numéros de port de la source et de la destination, et protocole. Ce contexte sert à router plus rapidement les paquets puisqu'il évite de fouiller dans les en-têtes successives (niveau 3 pour les adresses, niveau 4 pour les info de protoles et de port source et destination). Ce contexte est détruit après une période d'inactivité.
Avec IPv6, cette technique est officialisée. Le champ Identificateur de flux peut être rempli avec une valeur aléatoire qui servira à référencer le contexte. La source gardera cette valeur pour tous les paquets qu'elle émettra pour cette application et cette destination. Le traitement est optimisé puisque le routeur n'a plus à consulter cinq champs pour déterminer l'appartenance d'un paquet, mais un seul. De plus, si une extension de confidentialité est utilisée, les informations concernant les numéros de port sont masquées aux routeurs intermédiaires.
Passage à l'échelle
Le passage à l'échelle désigne la capacité d'un produit ou d'un mécanisme à s'adapter à un changement d'ordre de grandeur de la demande (montée en charge), en particulier sa capacité à maintenir ses fonctionnalités et ses performances en cas de forte demande[1]. Il faut donc comprendre qu'une difficulté à passer à l'échelle signifie que la propriété d'extensibilité n'est pas acquise.
À la date de rédaction de ce document, l'utilisation de l'étiquette de flux reste encore floue. Les micro-flux, c'est-à-dire de flux applicatifs, ne sont pas analysés dans le coeur du réseau pour des raisons de passage à l'échelle. De plus, MPLS a repris la notion de "routage spécifique en fonction d'une étiquette". Pour l'instant, ce champ peut être vu comme réservé. Son utilisation pourra être mieux spécifiée dans le futur.
Longueur des données utiles (Payload Length)
Ce champ indique la dimension, en octets, du reste du datagramme (en-tête exclus, donc), c'est-à-dire les données à la suite de l'en-tête. Les éventuelles extensions à l'en-tête IPv6 sont incluses dans ces données. Ce champ, sur 16 bits, peut donc indiquer une taille des données utiles, allant jusqu'à 64 kibioctets (64 * 1024 octets). Pour des paquets dont la taille serait supérieure, ce champ vaut 0 et l'émetteur ajoute une extension d'en-tête de "proche en proche" avec l'option jumbogramme définie par le RFC 2675. Cette extension est essentiellement prévue pour la transmission à grand débit entre deux équipements.
En-tête suivant (Next Header)
Ce champ identifie le prochain en-tête se trouvant à la suite de l'en-tête IPv6. Il peut s'agir d'un protocole de niveau supérieur (ICMP, UDP, TCP...) ou de la désignation d'une extension (cf. tableau Valeurs du champ en-tête suivant pour IPv6).
valeur | Hexa | Protocole ou Extension |
---|---|---|
0 | 0x00 | Proche-en-proche |
4 | 0x04 | IPv4 |
6 | 0x06 | TCP |
17 | 0x11 | UDP |
41 | 0x29 | IPv6 |
43 | 0x2b | Routage |
44 | 0x2c | Fragmentation |
50 | 0x32 | Confidentialité |
51 | 0x33 | Authentification |
58 | 0x3a | ICMPv6 |
59 | 0x3b | Fin des en-têtes |
60 | 0x3c | Destination |
132 | 0x84 | SCTP |
135 | 0x87 | Mobilité |
136 | 0x88 | UDP-lite |
140 | 0x8c | Shim6 |
Nombre maximal de sauts (Hop Limit)
Ce champ représente le nombre maximal de routeurs que le paquet peut traverser. Il est initialisé par la source du paquet, et ensuite, décrémenté à chaque routeur traversé. Un datagramme retransmis par un routeur est rejeté avec l'émission d'un message d'erreur ICMPv6 vers la source si la valeur, après décrémentation, atteint 0. Ce mécanisme permet d'éliminer des paquets persistant trop longtemps dans le réseau pour cause de problèmes de configuration, comme les boucles de routage. Il est aussi utilisé par des outils d'ingénierie des réseaux comme traceroute pour signaler à la source l'ensemble des routeurs traversés jusqu'à une destination.
La valeur initiale de ce champ, à l'émission du paquet, devrait être donnée dans un document annexe de l'IANA (http://www.iana.org/) ; ce qui permettrait de la modifier en fonction de l'évolution de la topologie du réseau. La valeur n'est pas encore officiellement attribuée mais certaines implantations prennent actuellement la valeur conseillée pour IPv4 : 64.
La valeur par défaut peut être dynamiquement attribuée aux équipements du réseau par les annonces des routeurs en configuration automatique. Une modification de ce paramètre sera donc relativement simple quand la limite actuelle sera atteinte. On peut noter une limitation puisque ce champ, codé sur 8 bits, n'autorise la traversée que de 255 routeurs. En réalité, dans l'Internet actuel, le nombre maximal de routeurs traversés est d'une quarantaine, ce qui laisse une bonne marge pour l'évolution du réseau.
Adresses source et destination
Ces adresses sont renseignées par l'émetteur du paquet pour désigner l'émetteur et le destinataire du paquet. Pour renseigner l'adresse source, l'émetteur choisit de préférence une adresse IPv6 parmi celles configurées sur l'interface utilisée pour transmettre le paquet sur le réseau. Cette adresse est choisie pour avoir une portée compatible avec l'adresse de destination et, ainsi, permettre au destinataire de répondre. Par exemple, il serait problématique d'essayer de joindre une machine de l'Internet en donnant comme adresse source une adresse lien-local. Le mécanisme de choix de l'adresse source est spécifié dans le RFC 6724.
L'adresse destination, elle aussi, peut être choisie dans la liste des adresses valables pour le destinataire ; liste pouvant provenir de la résolution d'un nom en adresses par le DNS. L'adresse choisie doit être compatible avec la portée des adresses disponibles au niveau de l'émetteur. Par exemple, si l'émetteur ne possède que des adresses de type ULA, et que le destinataire est connu avec des adresses globales et ULA, ces dernières adresses seront à préférer. Le mécanisme du RFC 6724 précise le processus de choix de l'adresse destination.
Extensions à l'en-tête IPv6
L'ajout de nouvelles fonctionnalités est problématique quand l'en-tête est de taille fixe comme c'est le cas d'IPv6. La solution proposée consiste à ajouter des en-têtes spécifiques pour chaque fonctionnalité. Par exemple, si un paquet doit être fragmenté, une extension de fragmentation sera ajoutée par l'émetteur afin que le récepteur puisse rassembler les morceaux correctement. Les extensions sont ajoutées par l'émetteur du paquet pour signaler un traitement spécifique à réaliser, soit par les équipements intermédiaires, soit par le destinataire du paquet. Il existe plusieurs types d'extensions selon le traitement demandé. Elles se placent après l'en-tête IPv6 et avant la charge utile du paquet (voir la figure 3). La présence d'une extension est signalée par le champ En-tête suivant (Next Header) de l'en-tête IPv6 qui possède alors la valeur correspondant à cette extension. Ainsi, elle est traitée par les routeurs intermédiaires comme un protocole de niveau supérieur à IP. L'utilisation des différents types d'extensions d'en-tête IPv6 sera abordé dans l'activité 24.
Evolution de l'en-tête depuis IPv4
Hormis la modification de la taille des adresses, ce qui conduit à une taille d'en-tête de 40 octets (le double d'un en-tête IPv4 sans options), le protocole IP a subi un toilettage[2], reprenant l'expérience acquise au fil d’une trentaine d’années avec IPv4, défini en 1981 (!) par le RFC 791. Le format des en-têtes IPv6 est ainsi simplifié et permet aux routeurs de meilleures performances dans leurs traitements. L'idée est de retirer du cœur de réseau les traitements compliqués. Les routeurs ne font que retransmettre les paquets vers la destination, les autres traitements sont faits par l'émetteur et le destinataire du paquet.
L'en-tête ne contient plus de contrôle d'erreur (checksum), qui devait être ajusté, pour IPv4, par chaque routeur en raison, entre autres, de la décrémentation du champ durée de vie. Par contre, pour éviter qu'un paquet, dont le contenu est erroné -- en particulier sur l'adresse de destination --, ne se glisse dans une autre communication, tous les protocoles de niveau supérieur doivent mettre en œuvre un mécanisme de contrôle d'erreur de bout en bout, incluant un pseudo-en-tête qui prend en compte les adresses source et destination. Le contrôle d'erreur d'UDP, facultatif pour IPv4, devient ainsi obligatoire. Pour ICMPv6, le contrôle d'erreur intègre le pseudo-en-tête alors que, pour ICMPv4, il ne portait que sur le message ICMP.
La fonction de fragmentation a aussi été retirée des routeurs. Les champs de l'en-tête IPv4 qui s'y reportent (Identification, Drapeau, Place du fragment) ont été supprimés. Normalement, les algorithmes de découverte du PMTU (Path MTU) évitent d'avoir recours à la fragmentation. Si celle-ci s'avère nécessaire, une extension est prévue et le découpage en fragments est réalisé uniquement au niveau de l'émetteur.
Une autre évolution majeure depuis l'en-tête IPv4 est la spécification des extensions d'en-tête pour remplacer les options. En effet, dans le cas d'IPv4, les options sont incluses dans l'en-tête. Celui-ci est donc de taille variable (taille indiquée dans le champ Internet Header Length), ce qui peut compliquer le traitement dans les routeurs intermédiaires. Les extensions à l'en-tête IPv6 simplifient la mise en œuvre de ces fonctionnalités et permettent de garder la taille de l'en-tête IPv6 fixe à 40 octets.
Conclusion
Cette activité a présenté l'en-tête IPv6, définissant une nouvelle version du protocole IP. Cette version reprend les caractéristiques communes du protocole : des adresses de taille fixe, un en-tête définissant une position fixe pour l'adresse de destination, position de plus alignée en mémoire. L'objectif reste toujours le traitement optimal de l'en-tête dans les équipements intermédiaires tels que les routeurs. IPv6 garde donc ces principes et va même plus loin que son prédécesseur IPv4 en reconsidérant des mécanismes jugés coûteux, comme la fragmentation, le checksum ou les options. Certains de ces mécanismes ont été éliminés dans la nouvelle version du protocole, d'autres remplacés par mécanismes plus performants. Enfin, nous pouvons signaler ce formulaire qui présente l'essentiel du paquet IPv6 en une seule page[3]. Ceci peut vous être utile pour la suite.
Références bibliographiques
- ↑ Wikipedia.Définition de la scalabilité
- ↑ Lee, D.C.; Lough, D.L.; Midkiff, S.F.et al. (1998). IEEE Network, Vol. 12, No. 1, January. The next generation of the Internet: aspects of the Internet protocol version 6.
- ↑ Stretch, J. (2009) packetlife.net. Aide-mémoire tout en une page. IPv6
Pour aller plus loin
RFC et leur analyse par S. Bortzmeyer :
- RFC 791 Internet protocol (IPv4)
- RFC 1190 Experimental Internet Stream Protocol, Version 2 (ST-II)
- RFC 1819 Internet Stream Protocol Version 2 (ST2) Protocol Specification - Version ST2+
- RFC 2205 Resource ReSerVation Protocol (RSVP)
- RFC 2460 Internet Protocol, Version 6 (IPv6) Specification Analyse
- RFC 2474 Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers Analyse
- RFC 2675 IPv6 Jumbograms
- RFC 6040 Tunnelling of Explicit Congestion Notification
- RFC 6437 IPv6 Flow Label Specification
- RFC 6724 Default Address Selection for Internet Protocol version 6 (IPv6) Analyse
- RFC 7098: Using the IPv6 Flow Label for Load Balancing in Server Farms Analyse
Annexe 1: la gestion de la qualité de service
L'Internet différencié permet aux fournisseurs d'accès de gérer différemment les congestions qui surviennent dans le réseau. Sans différenciation, les paquets ont la même probabilité de rejet. Avec la différenciation, plusieurs classes de trafic sont définies. Les paquets appartenant aux classes les plus élevées ont une probabilité de rejet plus faible. Bien entendu, pour que l'introduction de telles classes de trafic soit efficace, il faut introduire une gestion des ressources différente pour chacune des classes, et des mécanismes de contrôle pour vérifier que les flux des utilisateurs n'utilisent pas que les classes les plus élevées ou qu'ils ne dépassent pas leur contrat. Par exemple, un client peut établir un contrat de niveau de services appelé SLA (Service Level Agreement) avec son fournisseur d’accès.
L'intérêt principal de la différenciation de services est qu'elle ne casse pas le modèle initial de l'Internet (version 4 ou version 6). Les flux sont toujours traités en Best Effort même si certains sont plus Best que d'autres. Il n'y a aucune garantie qu'un trafic d'une classe haute arrive à destination, mais la probabilité est plus importante. L'autre intérêt des classes de trafic vient de la possibilité d'agrégation des flux. La classe d'appartenance est indiquée dans l'en-tête du paquet. Les applications peuvent marquer les paquets en fonction de paramètres locaux (flux multimédia, flux interactif, trafic priorisé...). Le fournisseur d'accès qui récupère le trafic n'a plus à se préoccuper des applicatifs. Il vérifie que le trafic d'une classe ne dépasse pas le contrat préalablement établi.
Dans le cœur du réseau, les routeurs prennent en compte les différentes classes. Le fournisseur d'accès devra également passer des accords avec les autres opérateurs pour pouvoir faire transiter les flux avec un traitement approprié. Cet aspect de dimensionnement de réseau et de négociation d'accords d'échange est au coeur du métier d'opérateur.
Pour signifier l'appartenance d'un paquet à une certaine classe de trafic, une valeur est renseigné au niveau de l'en-tête IP dans l'octet Traffic Class afin qu'elle puisse être analysée par tous les routeurs mettant en oeuvre le traitement différencié. Le format de ce champ est rappelé en Figure 2.
Le tableau 1 présente les différentes valeurs définies pour le champ DSCP (Differential Service Code Point). Les valeurs sont présentées en format binaire avec les 6 bits les plus significatifs de l’octet Traffic Class, puis leur conversion en décimal, leur nommage, la probabilité d’écartement, et l’équivalence avec les anciennes valeurs du champ TOS de l’IPv4 :
Pour l'instant, deux types de comportement sont standardisés :
- Assured Forwarding [RFC 2597] : Ce comportement définit quatre classes de trafic et trois priorités, suivant que l'utilisateur respecte son contrat, le dépasse légèrement, ou est largement en dehors. Les classes sont donc choisies par l'utilisateur et restent les mêmes tout au long du trajet dans le réseau. La priorité, par contre, peut être modifiée dans le réseau par les opérateurs en fonction du respect ou non des contrats. Par exemple, pour la classe AF n°2, on dispose des 3 priorités suivantes : AF21, AF22 et AF23. Plus le chiffre est élevé, plus la priorité est faible. C'est-à-dire qu'en cas de saturation de cette classe de trafic, les paquets AF23 seront écartés avant AF22, puis AF21.
- Expedited Forwarding [RFC 2598] : Ce comportement est comparable à un circuit à débit constant réservé dans le réseau. Le trafic est mis en forme à l'entrée du réseau, en retardant l'émission des paquets qui sont hors contrat. En plus de ces comportements, l'octet DS a gardé, pour des raisons de compatibilité avec les équipements existants, les valeurs du bit ToS qui étaient le plus fréquemment utilisées. La valeur est 0xB8 (1011 1000 en binaire, et en tenant compte uniquement des 6 bits de poids forts : 46 en décimal).
- Voice Admit : Cette autre valeur a été par la suite proposée dans le RFC 5865 pour affiner le traitement de flux temps réel de différentes natures : voix, vidéo, signalisation temps réel… (La valeur est 0xB0 soit 1011 0100 en binaire, et en tenant compte uniquement des 6 bits de poids forts : 44 en décimal).
- Network Control : Autre particularité : la valeur 0xE0 (1110 0000 en binaire, et en tenant compte uniquement des 6 bits de poids forts : 56 en décimal) correspond à CS7, la classe de contrôle du réseau (Network Control). Elle est utilisée dans des mises en oeuvre d'IPv6 pour l'émission de certains paquets ICMPv6. Cette valeur est dépréciée. Il est conseillé d'utiliser la valeur CS6 comme spécifié dans le RFC 4594.