Difference between revisions of "MOOC:Compagnon Act12-s7"
From Livre IPv6
(→Notation des préfixes) |
(→Notation des préfixes) |
||
(107 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
__NOTOC__ | __NOTOC__ | ||
− | = Activité 12 : Notation d'une adresse IPv6 | + | |
+ | <!-- = Activité 12 : La notation des adresses IPv6 = --> | ||
+ | = Activité 12 : Notation des adresses IPv6 = | ||
+ | <!-- {{Decouverte}} --> | ||
+ | == Introduction == | ||
+ | La notation des adresses IPv6 traite du problème de leur représentation textuelle. Il s'agit de définir des règles pour leur affichage, leur manipulation, leur saisie par un utilisateur humain. Le RFC 4291 a posé les principes de la notation d'une adresse IPv6. Le RFC 5952 est venu le compléter pour poser des règles. La notation est importante. Mal maitrisée, elle peut entrainer des problèmes d'interopérabilité comme le montre cet article<ref>Huston, G. (2013) The ISP Column. March. [http://www.potaroo.net/ispcol/2013-03/literals.html Literally IPv6]</ref>. | ||
− | == | + | == Principes == |
− | + | IPv6 a abandonné la notation décimale pointée en usage pour | |
− | IPv6 a abandonné la notation décimale pointée | + | les adresses IPv4 (sur 32 bits, soit 4 octets, on indique la valeur décimale de chaque octet séparée par un point décimal. Exemple : l'adresse IPv4 192.168.0.1). Cette notation est en effet inadaptée pour des chaînes binaires de 16 octets. IPv6 a adopté la notation hexadécimale couramment utilisée dans le monde informatique pour représenter des octets par des couples de chiffres. |
− | les adresses IPv4 ( | + | |
− | décimale de chaque octet séparée par un point décimal | + | |
− | + | ||
− | inadaptée pour des chaînes binaires de 16 octets. IPv6 a adopté la | + | |
− | notation hexadécimale | + | |
− | informatique pour représenter des octets par des couples de | + | |
− | + | ||
− | + | ||
− | + | Les 16 octets (128 bits) de l'adresse IPv6 suivante se notent en | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | Les 16 octets (128 bits) | + | |
binaire : | binaire : | ||
00100000 00000001 00001101 10111000 00000000 00000000 00000000 00000000 00000000 00001000 00001000 00000000 00100000 00001100 01000001 01111010 | 00100000 00000001 00001101 10111000 00000000 00000000 00000000 00000000 00000000 00001000 00001000 00000000 00100000 00001100 01000001 01111010 | ||
− | et s'écrivent en hexadécimal | + | et s'écrivent en hexadécimal sous la forme suivante : |
<center> | <center> | ||
20 01 0d b8 00 00 00 00 00 08 08 00 20 0C 41 7A | 20 01 0d b8 00 00 00 00 00 08 08 00 20 0C 41 7A | ||
</center> | </center> | ||
− | couramment | + | couramment précédés par le préfixe <tt>0x</tt> pour indiquer que la chaine qui suit est en notation hexadécimale : |
− | est en notation hexadécimale | + | |
<center> | <center> | ||
0x20010db80000000000080800200C417A | 0x20010db80000000000080800200C417A | ||
</center> | </center> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
La représentation "textuelle" des adresses IPv6 se fait | La représentation "textuelle" des adresses IPv6 se fait | ||
en segmentant le mot de 128 bits en 8 champs de 16 bits (2 octets) | en segmentant le mot de 128 bits en 8 champs de 16 bits (2 octets) | ||
Line 47: | Line 35: | ||
</center> | </center> | ||
Par convention, il n'est pas nécessaire d'écrire les zéros de | Par convention, il n'est pas nécessaire d'écrire les zéros de | ||
− | poids fort placés en tête de champ (dans chaque mot de 16 bits les | + | poids fort placés en tête de champ (dans chaque mot de 16 bits, les |
− | zéros de poids fort sont | + | zéros de poids fort ne sont pas significatifs). |
L'adresse peut donc prendre une notation plus | L'adresse peut donc prendre une notation plus | ||
compacte : | compacte : | ||
<center><tt>2001:db8:0:0:8:800:200C:417A</tt></center> | <center><tt>2001:db8:0:0:8:800:200C:417A</tt></center> | ||
Plusieurs champs nuls consécutifs peuvent être "abrégés" | Plusieurs champs nuls consécutifs peuvent être "abrégés" | ||
− | par l'abréviation "'''::'''" | + | par l'abréviation " '''::''' " |
− | (2 caractères ':' successifs, sans espace). | + | (2 caractères ':' successifs, sans espace). |
− | éviter toute ambiguïté cette abréviation ne peut être utilisée | + | <center><tt>2001:db8::8:800:200C:417A</tt></center> |
− | qu'une seule fois par adresse !''' | + | '''Attention : pour éviter toute ambiguïté, cette abréviation ne peut être utilisée qu'une seule fois par adresse !''' |
<center> | <center> | ||
− | {| border=" | + | {| border="0" class="wikitable alternance centre" width="90%" |
− | |- | + | |- align="center" |
− | + | ||
− | Exemple | + | ! scope="col" width="40%" align="left" | '''Exemple''' |
− | ! | + | ! scope="col" width="30%" align="center" | '''l'adresse''' |
− | l'adresse | + | ! scope="col" width="30%" align="right" | '''peut également s'écrire''' |
− | ! | + | |
− | peut également s'écrire | + | |- style="background:silver" |
− | |- | + | | Une adresse unicast || align="left" | <tt>2001:0db8:0:0:0:800:200c:417a</tt> || align="right" | <tt>2001:db8::800:200c:417a</tt> |
− | | | + | |
− | Une adresse unicast | + | |- |
− | | | + | | Une adresse multicast || align="left" | <tt>ff01:0:0:0:0:0:0:101</tt> || align="right" | <tt>ff01::101</tt> |
− | 2001:0db8:0:0:0:800:200c:417a | + | |
− | | | + | |- style="background:silver" |
− | + | | Adresse de bouclage (loopback address) || align="left" | <tt>0:0:0:0:0:0:0:1</tt> || align="right" | <tt>'''::1'''</tt> | |
− | |- | + | |
− | | | + | |- |
− | Une adresse multicast | + | | Adresse non spécifiée (unspecified address) || align="left" | <tt>0:0:0:0:0:0:0:0</tt> || align="right" | <tt>'''::'''</tt> |
− | | | + | |
− | ff01:0:0:0:0:0:0:101 | + | |
− | | | + | |
− | ff01::101 | + | |
− | |- | + | |
− | | | + | |
− | Adresse de bouclage (loopback address) | + | |
− | | | + | |
− | 0:0:0:0:0:0:0:1 | + | |
− | | | + | |
− | ::1 | + | |
− | |- | + | |
− | | | + | |
− | Adresse non spécifiée (unspecified address) | + | |
− | | | + | |
− | 0:0:0:0:0:0:0:0 | + | |
− | | | + | |
− | :: | + | |
|} | |} | ||
</center> | </center> | ||
− | + | == Notation canonique pour l'affichage == | |
− | + | Les adresses IPv6 peuvent donc avoir plusieurs représentations | |
− | Les adresses | + | valides possibles. Le RFC 5952 fournit les recommandations pour une |
− | valides possibles. | + | |
forme de représentation canonique des adresses. Cette forme est | forme de représentation canonique des adresses. Cette forme est | ||
− | destinée aux procédures d'affichage | + | destinée aux procédures d'affichage ; par les programmes, les appels |
− | systèmes inscrivant des événements dans les fichiers journaux | + | systèmes inscrivant des événements dans les fichiers journaux (logs). Cette recommandation ne porte donc que sur les sorties d'adresses (affichage). En entrée (configuration d'équipement, passage de paramètres...), un logiciel devrait toujours accepter les différentes formes valides. La saisie reste donc libre. |
− | (logs | + | |
− | d'adresses (affichage). En entrée (configuration d'équipement, | + | |
− | passage de paramètres ...) un logiciel devrait toujours accepter les | + | |
− | différentes formes | + | |
− | + | ||
− | Concrètement, selon | + | Concrètement, selon ce RFC 5952, une adresse devrait être |
affichée selon la forme suivante : | affichée selon la forme suivante : | ||
− | * Les zéros initiaux (non significatifs) doivent | + | * Les zéros initiaux (non significatifs) doivent être supprimés. |
− | * L'indication d'une suite de champs nuls | + | * L'indication d'une suite de champs nuls consécutifs « :: » doit être utilisée au maximum (sur la série nulle la plus longue). En cas d'égalité, on l'applique sur la première. Exemples :<br> |
** <tt>2001:db8:0:42''':0:0:0:'''1 → 2001:db8:0:42'''::'''1</tt><br> | ** <tt>2001:db8:0:42''':0:0:0:'''1 → 2001:db8:0:42'''::'''1</tt><br> | ||
** <tt>2001:db8''':0:0:'''42:0:0:1 → 2001:db8'''::'''42:0:0:1</tt><br> | ** <tt>2001:db8''':0:0:'''42:0:0:1 → 2001:db8'''::'''42:0:0:1</tt><br> | ||
− | * Les chiffres hexadécimaux doivent être en | + | * Les chiffres hexadécimaux doivent être en minuscules. |
− | * | + | * Si le numéro de port (TCP ou UDP) doit être indiqué, l'usage de crochets encadrant l'adresse devient obligatoire. Auparavant, cet usage ne l'était que pour les URL. Plus de détails en fin de chapitre. |
− | + | == Notation des préfixes == | |
− | La notation des préfixes définie par CIDR | + | La notation des préfixes définie par CIDR [RFC 4632] pour IPv4 |
est conservée pour IPv6. Le préfixe indique le nombre de bits de | est conservée pour IPv6. Le préfixe indique le nombre de bits de | ||
− | poids fort de l'adresse (la partie haute de l'adresse | + | poids fort de l'adresse (la partie haute de l'adresse ; c'est-à-dire, |
− | dans le sens de lecture occidentale les chiffres à gauche de | + | dans le sens de lecture occidentale, les chiffres à gauche de |
− | l'adresse) | + | l'adresse) communs à toutes les adresses appartenant à ce préfixe. |
− | + | ||
− | + | ||
− | + | ||
− | La notation du préfixe d'adresse se fait en séparant l'adresse | + | La notation du préfixe d'adresse se fait en séparant l'adresse du nombre de bits du préfixe par un caractère « '''/''' » (le caractère « diviseur » du pavé numérique de votre clavier). |
− | du nombre de bits du préfixe par un caractère « '''/''' » | + | |
− | (le caractère « diviseur » du pavé numérique de votre | + | <center>'''Adresse-IPv6/longueur-en-bits-du-préfixe'''</center> |
− | clavier). | + | |
− | <center>'''Adresse- | + | |
− | + | Par exemple, le préfixe suivant : | |
− | + | ||
− | + | ||
− | + | ||
− | <center><tt>2001: | + | <center><tt>'''2001:0db8:0024:a1a'''0:0000:0000:0000:0000/60</tt></center> |
− | + | définit 60 bits (affichés ici en caractères gras) qui seront communs à toutes les adresses lui appartenant. Un préfixe peut donc être utilisé pour désigner une plage d'adresses : | |
− | <center><tt>2001: | + | <center> |
+ | {| border="0" class="wikitable alternance centre" width="75%" | ||
+ | |- align="left" style="background:silver" | ||
+ | | '''Préfixe : '''||<tt>'''2001:0db8:0024:a1a'''0::/60</tt> | ||
+ | |- align="right" | ||
+ | | Première adresse : || <tt>'''2001:0db8:0024:a1a'''0:0000:0000:0000:0000</tt> | ||
+ | |- align="right" | ||
+ | | Dernière adresse : || <tt>'''2001:0db8:0024:a1a'''f:ffff:ffff:ffff:ffff</tt> | ||
+ | |} | ||
+ | </center> | ||
− | + | Les préfixes permettent donc d''''agréger''' en une seule notation plusieurs adresses possédant les mêmes bits de poids forts. Un préfixe permet aussi d'agréger plusieurs préfixes plus spécifiques, c'est-à-dire définissant un nombre plus large de bits communs à un ensemble d'adresses. Ainsi, le préfixe /60 donné dans l'exemple précédent agrège 16 préfixes de largeur 64 bits (/64) : | |
− | les bits de préfixe | + | |
− | + | ||
− | <center><tt>'''2001: | + | <!-- |
+ | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
+ | <center> | ||
+ | {| border="0" class="wikitable alternance centre" width="75%" | ||
+ | |- | ||
+ | | rowspan="32" | <tt>'''2001:0db8:0024:a1a'''0::/60</tt> | ||
+ | | rowspan="2" | <tt>'''2001:0db8:0024:a1a0'''::/64</tt> | ||
+ | | Première adresse : <tt>2001:0db8:0024:a1a0:0000:0000:0000:0000</tt> | ||
+ | |- | ||
+ | | Dernière adresse : <tt>2001:0db8:0024:a1a0:ffff:ffff:ffff:ffff</tt> | ||
+ | |- | ||
+ | | rowspan="2" | <tt>'''2001:0db8:0024:a1a1'''::/64</tt> | ||
+ | | Première adresse : <tt>2001:0db8:0024:a1a1:0000:0000:0000:0000</tt> | ||
+ | |- | ||
+ | | Dernière adresse : <tt>2001:0db8:0024:a1a1:ffff:ffff:ffff:ffff</tt> | ||
+ | |- | ||
+ | | rowspan="2" | <tt>'''2001:0db8:0024:a1a2'''::/64</tt> | ||
+ | | Première adresse : <tt>2001:0db8:0024:a1a2:0000:0000:0000:0000</tt> | ||
+ | |- | ||
+ | | Dernière adresse : <tt>2001:0db8:0024:a1a2:ffff:ffff:ffff:ffff</tt> | ||
+ | |- | ||
+ | | colspan = 2 | ... (''12 préfixes de <tt>2001:0db8:0024:a1a3::/64</tt> à <tt>2001:0db8:0024:a1ae::/64</tt>'') ... | ||
+ | |- | ||
+ | | rowspan="2" | <tt>'''2001:0db8:0024:a1af'''::/64</tt> | ||
+ | | Première adresse : <tt>2001:0db8:0024:a1af:0000:0000:0000:0000</tt> | ||
+ | |- | ||
+ | | Dernière adresse : <tt>2001:0db8:0024:a1af:ffff:ffff:ffff:ffff</tt> | ||
+ | |} | ||
+ | </center> | ||
− | + | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
+ | --> | ||
− | <center><tt>'''2001: | + | <center> |
+ | {| border="0" class="wikitable alternance centre" width="85%" | ||
+ | |- align="left" | ||
+ | | '''Le préfixe ''' || <tt>'''2001:0db8:0024:a1a'''0::/60</tt> || '''agrège 16 préfixes /64''' | ||
+ | |- align="right" | ||
+ | | || || | ||
+ | |- align="right" style="background:silver" | ||
+ | | '''1er préfixe /64 : ''' || <tt>'''2001:0db8:0024:a1a0'''::/64</tt> || | ||
+ | |- align="right" | ||
+ | | || première adresse : || <tt>'''2001:0db8:0024:a1a0''':0000:0000:0000:0000</tt> | ||
+ | |- align="right" | ||
+ | | || dernière adresse : || <tt>'''2001:0db8:0024:a1a0''':ffff:ffff:ffff:ffff</tt> | ||
+ | |- align="right" style="background:silver" | ||
+ | | '''2ième préfixe /64 : ''' || <tt>'''2001:0db8:0024:a1a1'''::/64</tt> || | ||
+ | |- align="right" | ||
+ | | || premère adresse : || <tt>'''2001:0db8:0024:a1a1''':0000:0000:0000:0000</tt> | ||
+ | |- align="right" | ||
+ | | || dernière adresse : || <tt>'''2001:0db8:0024:a1a1''':ffff:ffff:ffff:ffff</tt> | ||
+ | |- align="right" style="background:silver" | ||
+ | | '''3ième préfixe /64 : ''' || <tt>'''2001:0db8:0024:a1a2'''::/64</tt> || | ||
+ | |- align="right" | ||
+ | | || première adresse : || <tt>'''2001:0db8:0024:a1a2''':0000:0000:0000:0000</tt> | ||
+ | |- align="right" | ||
+ | | || dernière adresse : || <tt>'''2001:0db8:0024:a1a2''':ffff:ffff:ffff:ffff</tt> | ||
+ | |- align="right" style="background:silver" | ||
+ | | 12 préfixes /64 successifs || || | ||
+ | |- align="right" | ||
+ | | '''.''' || '''.''' || '''.''' | ||
+ | |- align="right" | ||
+ | | '''.''' || '''.''' || '''.''' | ||
+ | |- align="right" | ||
+ | | '''.''' || '''.''' || '''.''' | ||
+ | |- align="right" style="background:silver" | ||
+ | | '''16ième préfixe /64 : ''' || <tt>'''2001:0db8:0024:a1af'''::/64</tt> || | ||
+ | |- align="right" | ||
+ | | || première adresse :|| <tt>'''2001:0db8:0024:a1af''':0000:0000:0000:0000</tt> | ||
+ | |- align="right" | ||
+ | | || dernière adresse :|| <tt>'''2001:0db8:0024:a1af''':ffff:ffff:ffff:ffff</tt> | ||
+ | |} | ||
+ | </center> | ||
− | |||
− | + | Un préfixe peut être utilisé par exemple par la fonction de routage d'un équipement pour désigner la destination d'une route vers un ensemble de machines ou de réseaux (cf. notion de routage du MOOC "Principes des Réseaux de Données"). | |
− | + | ||
− | + | Cette notation peut être aussi reprise lors de la désignation d'une adresse pour spécifier le réseau auquel elle appartient. Ainsi, dans l'exemple suivant, | |
− | + | <center> | |
+ | {| border="0" class="wikitable alternance centre" width="75%" | ||
− | |||
− | |||
− | |||
|- | |- | ||
− | | | + | | le nœud d'adresse || <tt> 2001:db8:24:a1a1:8:800:200C:417a</tt> |
− | + | ||
− | | | + | |
− | <tt> 2001:db8:24:a1a1:8:800:200C:417a | + | |
|- | |- | ||
− | | | + | | appartenant au sous-réseau ||<tt> 2001:db8:24:a1a0::/60</tt> |
− | + | ||
− | | | + | |
− | <tt> 2001:db8:24: | + | |
|- | |- | ||
− | | | + | | peut se noter || <tt> 2001:db8:24:a1a1:8:800:200C:417a/60</tt> |
− | peut se noter | + | |
− | | | + | |
− | <tt> 2001:db8:24:a1a1:8:800:200C:417a/60</tt> | + | |
|} | |} | ||
</center> | </center> | ||
− | On notera une petite difficulté | + | |
+ | Cette notation est utilisée notamment lorsque l'on configure une interface réseau avec une adresse, permettant de définir en une seule notation son adresse ainsi que le réseau auquel elle est connectée (qui est représenté par le ''netmask'' en IPv4). | ||
+ | |||
+ | On notera une petite difficulté dans cette convention de notation | ||
pour les préfixes qui ne sont pas alignés sur une frontière de | pour les préfixes qui ne sont pas alignés sur une frontière de | ||
− | mots de 16 bits, d'octet ou de demi octet | + | mots de 16 bits, d'octet ou de demi-octet : |
+ | <center> | ||
+ | {| border="0" class="wikitable alternance centre" width="75%" | ||
− | + | |- | |
+ | | l'adresse IPv6 || <tt>2001:db8:7654:2003::cafe/51</tt> | ||
− | + | |- | |
+ | | appartient au réseau || <tt>2001:db8:7654:2000::/51</tt> | ||
− | < | + | |- |
+ | | La plage d'adresses démarre en || <tt> 2001:db8:7654:2000:0000:0000:0000:0000</tt> | ||
+ | |- | ||
+ | |et se termine avec || <tt> 2001:db8:7654:3fff:ffff:ffff:ffff:ffff</tt> | ||
+ | |} | ||
+ | </center> | ||
− | + | == Notation des URL == | |
− | + | ||
Une autre difficulté provient du fait que le caractère "''':'''" | Une autre difficulté provient du fait que le caractère "''':'''" | ||
− | est significatif dans certains contextes | + | est significatif dans certains contextes, ce qui peut créer des |
− | ambiguïtés. C'est le cas des URL où il est utilisé comme | + | ambiguïtés. C'est le cas des URL où il est utilisé comme séparateur entre l'adresse et le numéro de port. Les adresses de niveau transport sont des numéros de port TCP ou UDP, cf. MOOC "Principes des Réseaux de Données". |
− | séparateur entre l'adresse et le numéro de port | + | |
− | niveau transport sont des numéros de port TCP ou UDP, cf MOOC | + | |
− | Principes des Réseaux de Données | + | |
− | + | Exemple : l'URL suivante est ambiguë : <tt>http://2001:db8:12::1:8000/</tt> ; | |
− | Exemple l'URL suivante est ambiguë : | + | en effet, elle peut être interprétée de deux manières : |
− | + | * le service ''web'' à l'écoute sur le port http par défaut (le port TCP 80 est le port implicite d'écoute du protocole HTTP) sur la machine d'adresse <tt>2001:db8:12::1:8000</tt> | |
− | http://2001:db8:12::1:8000/ | + | * les services ''web'' (protocole HTTP) à l'écoute sur le port TCP 8000 de la machine d'adresse <tt>2001:db8:12::1</tt> |
+ | Pour lever cette ambiguïté, le RFC 3986 propose d'inclure l'adresse IPv6 entre "'''[''' ''']'''" (crochets ouvrant et fermant). Ainsi, dans le premier cas, l'URL sera notée <tt>http://[2001:db8:12::1:8000]/</tt> et dans le second, <tt>http://[2001:db8:12::1]:8000/ </tt> | ||
+ | == Les adresses IPv6 unicast embarquant une adresse IPv4 == | ||
+ | |||
+ | === Intégration de l'espace d'adressage IPv4 dans l'espace IPv6 === | ||
+ | Compte tenu de son étendue, l'espace d'adressage IPv6 peut facilement intégrer l'espace d'adressage IPv4. En conséquence, une adresse IPv4 peut être imbriquée dans une adresse IPv6. Les mécanismes d'interopérabilité IPv6 et IPv4 développés dans la séquence 4 de cette présentation en font usage. Chacun de ces mécanismes d'interopérabilité a fait l'objet d'implémentations diversifiées entraînant des variantes d'imbrication de tout ou partie d'une adresse IPv4 dans une adresse IPv6. Ces variantes seront présentées en détail dans les activités de la séquence 4. | ||
+ | |||
+ | === Notation d'une adresse IPv4 dans une adresse IPv6 === | ||
+ | L'adresse IPv4 est notée sous forme hexadécimale en deux mots de 16 bits séparés par le caractère "<tt>''':'''</tt>". | ||
+ | Ainsi, l'adresse IPv4 '''<tt>192.168.10.5</tt>''' sera notée '''<tt>c0a8:a05</tt>''' dans l'adresse IPv6. | ||
+ | |||
+ | Exemples : | ||
+ | * <tt>2002:'''c0a8:a05''':624:5054:1ff1:fe12:3456</tt> | ||
+ | * <tt>2001:db8:900d:cafe::'''c0a8:a05'''</tt> | ||
+ | |||
+ | Lorsque l'adresse IPv4 occupe la partie basse de l'adresse IPv6 (les 32 bits de poids faible - bits 96 à 127), la notation décimale pointée traditionnelle d'IPv4 est tolérée comme l'indique le RFC 4291. Autrement dit, la notation décimale n’est valide qu’à la fin de l’adresse IPv6. | ||
+ | Ainsi, l'adresse <tt>2001:db8:900d:cafe::'''c0a8:a05'''</tt> peut être notée <tt>2001:db8:900d:cafe::'''192.168.10.5'''</tt> lors d'une saisie (configuration manuelle d'interface ou passage de paramètre en ligne de commande...). Cependant, elle sera affichée sous sa forme canonique (RFC 5952) <tt>2001:db8:900d:cafe::c0a8:a05</tt> dans le journal de bord (log système) de la machine. Dans ce cas, si la saisie peut nous sembler familière, la correspondance entre l'adresse IPv6 et l'adresse IPv4 embarquée est moins évidente à l'affichage. | ||
+ | |||
+ | == Conclusion == | ||
+ | Nous venons d'introduire la notation des adresses IPv6. Sa maîtrise est importante. Sinon, cela peut entraîner des problèmes d'interopérabilité. Dans les activités suivantes, nous allons approfondir les règles de notations, leurs affectations, et le rôle des différents types d'adresses. | ||
+ | |||
+ | == Références bibliographiques == | ||
+ | <references /> | ||
+ | |||
+ | == Pour aller plus loin== | ||
+ | RFC et leur analyse par S. Bortzmeyer : | ||
+ | * RFC 4632 Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy [http://www.bortzmeyer.org/fini-les-classes.html Analyse] | ||
+ | * RFC 3986 Uniform Resource Identifier (URI): Generic Syntax [http://www.bortzmeyer.org/3986.html Analyse] | ||
+ | * RFC 4291 IP Version 6 Addressing Architecture [http://www.bortzmeyer.org/4291.html Analyse] | ||
+ | * RFC 5952 A Recommendation for IPv6 Address Text Representation [http://www.bortzmeyer.org/5952.html Analyse] | ||
+ | |||
+ | = Annexe : Vadémécum de notation hexadécimale = | ||
− | + | <strong>Cet aide mémoire, librement inspiré de | |
− | + | l'article "Système hexadécimal" de Wikipedia, est destiné à l'accompagnement des auditeurs qui ne sont pas familiers avec cette notation concise des nombres binaires.</strong> | |
+ | Le système hexadécimal est un système de numération en base | ||
+ | 16. Il utilise ainsi 16 symboles, en général les chiffres arabes | ||
+ | pour les dix premiers chiffres et les lettres '''"a"''' à '''"f"''' pour les six suivants (en majuscules ou en minuscules, sans importance en | ||
+ | principe, mais il vaut mieux par cohérence adopter l'un ou l'autre | ||
+ | pour la notation). Ce système est couramment utilisé en | ||
+ | informatique et en électronique numérique pour représenter des | ||
+ | codes binaires utilisés par les ordinateurs car il est : | ||
− | * | + | * commode : conversion facile binaire <=> hexadécimal du fait que 16 (nombre de chiffres dans la base hexadécimale) est lui-même une puissance de 2 (nombre de chiffres de la base binaire) ; |
− | + | * facilement lisible par les opérateurs humains car compact (il réduit le nombre de signes d'un facteur 4 par rapport au binaire). L'unité d'information couramment utilisée en informatique, à savoir l'octet (8 bits), se note ainsi sous forme de 2 chiffres hexadécimaux. | |
− | + | La conversion de binaire en hexadécimal se fait en regroupant les | |
− | + | chiffres binaires (les bits) par groupes de quatre, également appelés | |
− | + | "quartets" (ou nibbles). Le mot binaire doit donc avoir une longueur multiple de quatre. Au besoin, on le complète par des zéros à gauche (0 de poids fort non significatifs). À chacune des 16 combinaisons binaires d'un quartet (2 puissance 4 = 16) correspond un chiffre hexadécimal. | |
− | + | <center> | |
+ | {| border="0" class="wikitable alternance centre" width="40%" | ||
+ | |- align="right" | ||
+ | | '''binaire''' || '''Hexadécimal''' || '''décimal''' | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 0 0 0 0 || '''0''' || 0 | ||
+ | |||
+ | |- align="right" | ||
+ | | 0 0 0 1 || '''1''' || 1 | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 0 0 1 0 || '''2''' || 2 | ||
+ | |||
+ | |- align="right" | ||
+ | | 0 0 1 1 || '''3''' || 3 | ||
+ | |- align="right" style="background:silver" | ||
+ | | 0 1 0 0 || '''4''' || 4 | ||
+ | |||
+ | |- align="right" | ||
+ | | 0 1 0 1 || '''5''' || 5 | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 0 1 1 0 || '''6''' || 6 | ||
+ | |||
+ | |- align="right" | ||
+ | | 0 1 1 1 || '''7''' || 7 | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 1 0 0 0 || '''8''' || 8 | ||
+ | |||
+ | |- align="right" | ||
+ | | 1 0 0 1 || '''9''' || 9 | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 1 0 1 0 || '''a''' || 10 | ||
+ | |||
+ | |- align="right" | ||
+ | | 1 0 1 1 || '''b''' || 11 | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 1 1 0 0 || '''c''' || 12 | ||
+ | |||
+ | |- align="right" | ||
+ | | 1 1 0 1 || '''d''' || 13 | ||
+ | |||
+ | |- align="right" style="background:silver" | ||
+ | | 1 1 1 0 || '''e''' || 14 | ||
+ | |||
+ | |- align="right" | ||
+ | | 1 1 1 1 || '''f''' || 15 | ||
+ | |||
+ | |} | ||
+ | |||
+ | </center> | ||
− | Ainsi | + | ==Conversion== |
+ | |||
+ | Ainsi, le nombre binaire 0010101011010101 composé de 4 quartets (nibbles) 0010 1010 1101 0101 se note 2ad5 en hexadécimal ( 0010 => '''2''', 1010 => '''a''', 1101 => '''d''', 0101 => '''5'''). | ||
+ | |||
+ | Inversement, le nombre hexadécimal 7c8f20 se traduit par la chaîne binaire | ||
+ | 0111 1100 1000 1111 0010 0000 | ||
+ | ('''7''' => 0111, '''c''' => 1100, '''8''' => 1000, | ||
+ | '''f''' => 1111, '''2''' => 0010, '''0''' => 0000) et | ||
+ | correspond au code binaire 011111001000111100100000. | ||
+ | |||
+ | ==Notation== | ||
+ | |||
+ | Des notations sont utilisées, notamment dans les langages | ||
+ | informatiques, pour différencier sans ambiguïté les chiffres | ||
+ | hexadécimaux des autres : | ||
+ | * notation préfixée : 0x123 (langage C et dérivés), &h123 (BASIC), $123 (en Pascal et dérivés comme le VHDL en électronique), mais aussi #123 (Common Lisp), 0h123 (Texas Instruments) ou X'123' (COBOL) ; | ||
+ | * notation suffixée : 123h, 123'''(16)''' (arithmétique) | ||
− | + | (Nota : pour l'anecdote, le chanteur et humoriste Boby Lapointe a inventé en 1968 un système de représentation hexadécimale, appelé système bibi-binaire à la fois drôle et cohérent, basé sur des symboles graphiques convenus en lieu et | |
− | + | place des chiffres arabes et lettres (de 'a' à 'f'). | |
+ | |||
+ | == Pour aller plus loin == | ||
− | + | * Le système hexadécimal [https://fr.wikipedia.org/wiki/Syst%C3%A8me_hexad%C3%A9cimal https://fr.wikipedia.org/wiki/Syst%C3%A8me_hexad%C3%A9cimal] | |
− | + | * Le système bibi-binaire [https://fr.wikipedia.org/wiki/Syst%C3%A8me_Bibi-binaire https://fr.wikipedia.org/wiki/Syst%C3%A8me_Bibi-binaire] | |
+ | * Nibble [https://fr.wikipedia.org/wiki/Nibble https://fr.wikipedia.org/wiki/Nibble] | ||
+ | * Une autre forme, moins courante, de représentation des codes binaires : le système octal [http://fr.wikipedia.org/wiki/Syst%C3%A8me_octal http://fr.wikipedia.org/wiki/Syst%C3%A8me_octal] |
Latest revision as of 22:56, 8 January 2023
Activité 12 : Notation des adresses IPv6
Introduction
La notation des adresses IPv6 traite du problème de leur représentation textuelle. Il s'agit de définir des règles pour leur affichage, leur manipulation, leur saisie par un utilisateur humain. Le RFC 4291 a posé les principes de la notation d'une adresse IPv6. Le RFC 5952 est venu le compléter pour poser des règles. La notation est importante. Mal maitrisée, elle peut entrainer des problèmes d'interopérabilité comme le montre cet article[1].
Principes
IPv6 a abandonné la notation décimale pointée en usage pour les adresses IPv4 (sur 32 bits, soit 4 octets, on indique la valeur décimale de chaque octet séparée par un point décimal. Exemple : l'adresse IPv4 192.168.0.1). Cette notation est en effet inadaptée pour des chaînes binaires de 16 octets. IPv6 a adopté la notation hexadécimale couramment utilisée dans le monde informatique pour représenter des octets par des couples de chiffres.
Les 16 octets (128 bits) de l'adresse IPv6 suivante se notent en
binaire :
00100000 00000001 00001101 10111000 00000000 00000000 00000000 00000000 00000000 00001000 00001000 00000000 00100000 00001100 01000001 01111010
et s'écrivent en hexadécimal sous la forme suivante :
20 01 0d b8 00 00 00 00 00 08 08 00 20 0C 41 7A
couramment précédés par le préfixe 0x pour indiquer que la chaine qui suit est en notation hexadécimale :
0x20010db80000000000080800200C417A
La représentation "textuelle" des adresses IPv6 se fait en segmentant le mot de 128 bits en 8 champs de 16 bits (2 octets) séparés par le caractère ":". Chacun de ces champs est transcrit en 4 chiffres hexadécimaux. L'adresse précédente se note donc :
2001:0db8:0000:0000:0008:0800:200C:417A
Par convention, il n'est pas nécessaire d'écrire les zéros de poids fort placés en tête de champ (dans chaque mot de 16 bits, les zéros de poids fort ne sont pas significatifs). L'adresse peut donc prendre une notation plus compacte :
Plusieurs champs nuls consécutifs peuvent être "abrégés" par l'abréviation " :: " (2 caractères ':' successifs, sans espace).
Attention : pour éviter toute ambiguïté, cette abréviation ne peut être utilisée qu'une seule fois par adresse !
Exemple | l'adresse | peut également s'écrire |
---|---|---|
Une adresse unicast | 2001:0db8:0:0:0:800:200c:417a | 2001:db8::800:200c:417a |
Une adresse multicast | ff01:0:0:0:0:0:0:101 | ff01::101 |
Adresse de bouclage (loopback address) | 0:0:0:0:0:0:0:1 | ::1 |
Adresse non spécifiée (unspecified address) | 0:0:0:0:0:0:0:0 | :: |
Notation canonique pour l'affichage
Les adresses IPv6 peuvent donc avoir plusieurs représentations valides possibles. Le RFC 5952 fournit les recommandations pour une forme de représentation canonique des adresses. Cette forme est destinée aux procédures d'affichage ; par les programmes, les appels systèmes inscrivant des événements dans les fichiers journaux (logs). Cette recommandation ne porte donc que sur les sorties d'adresses (affichage). En entrée (configuration d'équipement, passage de paramètres...), un logiciel devrait toujours accepter les différentes formes valides. La saisie reste donc libre.
Concrètement, selon ce RFC 5952, une adresse devrait être affichée selon la forme suivante :
- Les zéros initiaux (non significatifs) doivent être supprimés.
- L'indication d'une suite de champs nuls consécutifs « :: » doit être utilisée au maximum (sur la série nulle la plus longue). En cas d'égalité, on l'applique sur la première. Exemples :
- 2001:db8:0:42:0:0:0:1 → 2001:db8:0:42::1
- 2001:db8:0:0:42:0:0:1 → 2001:db8::42:0:0:1
- 2001:db8:0:42:0:0:0:1 → 2001:db8:0:42::1
- Les chiffres hexadécimaux doivent être en minuscules.
- Si le numéro de port (TCP ou UDP) doit être indiqué, l'usage de crochets encadrant l'adresse devient obligatoire. Auparavant, cet usage ne l'était que pour les URL. Plus de détails en fin de chapitre.
Notation des préfixes
La notation des préfixes définie par CIDR [RFC 4632] pour IPv4 est conservée pour IPv6. Le préfixe indique le nombre de bits de poids fort de l'adresse (la partie haute de l'adresse ; c'est-à-dire, dans le sens de lecture occidentale, les chiffres à gauche de l'adresse) communs à toutes les adresses appartenant à ce préfixe.
La notation du préfixe d'adresse se fait en séparant l'adresse du nombre de bits du préfixe par un caractère « / » (le caractère « diviseur » du pavé numérique de votre clavier).
Par exemple, le préfixe suivant :
définit 60 bits (affichés ici en caractères gras) qui seront communs à toutes les adresses lui appartenant. Un préfixe peut donc être utilisé pour désigner une plage d'adresses :
Préfixe : | 2001:0db8:0024:a1a0::/60 |
Première adresse : | 2001:0db8:0024:a1a0:0000:0000:0000:0000 |
Dernière adresse : | 2001:0db8:0024:a1af:ffff:ffff:ffff:ffff |
Les préfixes permettent donc d'agréger en une seule notation plusieurs adresses possédant les mêmes bits de poids forts. Un préfixe permet aussi d'agréger plusieurs préfixes plus spécifiques, c'est-à-dire définissant un nombre plus large de bits communs à un ensemble d'adresses. Ainsi, le préfixe /60 donné dans l'exemple précédent agrège 16 préfixes de largeur 64 bits (/64) :
Le préfixe | 2001:0db8:0024:a1a0::/60 | agrège 16 préfixes /64 |
1er préfixe /64 : | 2001:0db8:0024:a1a0::/64 | |
première adresse : | 2001:0db8:0024:a1a0:0000:0000:0000:0000 | |
dernière adresse : | 2001:0db8:0024:a1a0:ffff:ffff:ffff:ffff | |
2ième préfixe /64 : | 2001:0db8:0024:a1a1::/64 | |
premère adresse : | 2001:0db8:0024:a1a1:0000:0000:0000:0000 | |
dernière adresse : | 2001:0db8:0024:a1a1:ffff:ffff:ffff:ffff | |
3ième préfixe /64 : | 2001:0db8:0024:a1a2::/64 | |
première adresse : | 2001:0db8:0024:a1a2:0000:0000:0000:0000 | |
dernière adresse : | 2001:0db8:0024:a1a2:ffff:ffff:ffff:ffff | |
12 préfixes /64 successifs | ||
. | . | . |
. | . | . |
. | . | . |
16ième préfixe /64 : | 2001:0db8:0024:a1af::/64 | |
première adresse : | 2001:0db8:0024:a1af:0000:0000:0000:0000 | |
dernière adresse : | 2001:0db8:0024:a1af:ffff:ffff:ffff:ffff |
Un préfixe peut être utilisé par exemple par la fonction de routage d'un équipement pour désigner la destination d'une route vers un ensemble de machines ou de réseaux (cf. notion de routage du MOOC "Principes des Réseaux de Données").
Cette notation peut être aussi reprise lors de la désignation d'une adresse pour spécifier le réseau auquel elle appartient. Ainsi, dans l'exemple suivant,
le nœud d'adresse | 2001:db8:24:a1a1:8:800:200C:417a |
appartenant au sous-réseau | 2001:db8:24:a1a0::/60 |
peut se noter | 2001:db8:24:a1a1:8:800:200C:417a/60 |
Cette notation est utilisée notamment lorsque l'on configure une interface réseau avec une adresse, permettant de définir en une seule notation son adresse ainsi que le réseau auquel elle est connectée (qui est représenté par le netmask en IPv4).
On notera une petite difficulté dans cette convention de notation pour les préfixes qui ne sont pas alignés sur une frontière de mots de 16 bits, d'octet ou de demi-octet :
l'adresse IPv6 | 2001:db8:7654:2003::cafe/51 |
appartient au réseau | 2001:db8:7654:2000::/51 |
La plage d'adresses démarre en | 2001:db8:7654:2000:0000:0000:0000:0000 |
et se termine avec | 2001:db8:7654:3fff:ffff:ffff:ffff:ffff |
Notation des URL
Une autre difficulté provient du fait que le caractère ":" est significatif dans certains contextes, ce qui peut créer des ambiguïtés. C'est le cas des URL où il est utilisé comme séparateur entre l'adresse et le numéro de port. Les adresses de niveau transport sont des numéros de port TCP ou UDP, cf. MOOC "Principes des Réseaux de Données".
Exemple : l'URL suivante est ambiguë : http://2001:db8:12::1:8000/ ; en effet, elle peut être interprétée de deux manières :
- le service web à l'écoute sur le port http par défaut (le port TCP 80 est le port implicite d'écoute du protocole HTTP) sur la machine d'adresse 2001:db8:12::1:8000
- les services web (protocole HTTP) à l'écoute sur le port TCP 8000 de la machine d'adresse 2001:db8:12::1
Pour lever cette ambiguïté, le RFC 3986 propose d'inclure l'adresse IPv6 entre "[ ]" (crochets ouvrant et fermant). Ainsi, dans le premier cas, l'URL sera notée http://[2001:db8:12::1:8000]/ et dans le second, http://[2001:db8:12::1]:8000/
Les adresses IPv6 unicast embarquant une adresse IPv4
Intégration de l'espace d'adressage IPv4 dans l'espace IPv6
Compte tenu de son étendue, l'espace d'adressage IPv6 peut facilement intégrer l'espace d'adressage IPv4. En conséquence, une adresse IPv4 peut être imbriquée dans une adresse IPv6. Les mécanismes d'interopérabilité IPv6 et IPv4 développés dans la séquence 4 de cette présentation en font usage. Chacun de ces mécanismes d'interopérabilité a fait l'objet d'implémentations diversifiées entraînant des variantes d'imbrication de tout ou partie d'une adresse IPv4 dans une adresse IPv6. Ces variantes seront présentées en détail dans les activités de la séquence 4.
Notation d'une adresse IPv4 dans une adresse IPv6
L'adresse IPv4 est notée sous forme hexadécimale en deux mots de 16 bits séparés par le caractère ":". Ainsi, l'adresse IPv4 192.168.10.5 sera notée c0a8:a05 dans l'adresse IPv6.
Exemples :
- 2002:c0a8:a05:624:5054:1ff1:fe12:3456
- 2001:db8:900d:cafe::c0a8:a05
Lorsque l'adresse IPv4 occupe la partie basse de l'adresse IPv6 (les 32 bits de poids faible - bits 96 à 127), la notation décimale pointée traditionnelle d'IPv4 est tolérée comme l'indique le RFC 4291. Autrement dit, la notation décimale n’est valide qu’à la fin de l’adresse IPv6. Ainsi, l'adresse 2001:db8:900d:cafe::c0a8:a05 peut être notée 2001:db8:900d:cafe::192.168.10.5 lors d'une saisie (configuration manuelle d'interface ou passage de paramètre en ligne de commande...). Cependant, elle sera affichée sous sa forme canonique (RFC 5952) 2001:db8:900d:cafe::c0a8:a05 dans le journal de bord (log système) de la machine. Dans ce cas, si la saisie peut nous sembler familière, la correspondance entre l'adresse IPv6 et l'adresse IPv4 embarquée est moins évidente à l'affichage.
Conclusion
Nous venons d'introduire la notation des adresses IPv6. Sa maîtrise est importante. Sinon, cela peut entraîner des problèmes d'interopérabilité. Dans les activités suivantes, nous allons approfondir les règles de notations, leurs affectations, et le rôle des différents types d'adresses.
Références bibliographiques
- ↑ Huston, G. (2013) The ISP Column. March. Literally IPv6
Pour aller plus loin
RFC et leur analyse par S. Bortzmeyer :
- RFC 4632 Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy Analyse
- RFC 3986 Uniform Resource Identifier (URI): Generic Syntax Analyse
- RFC 4291 IP Version 6 Addressing Architecture Analyse
- RFC 5952 A Recommendation for IPv6 Address Text Representation Analyse
Annexe : Vadémécum de notation hexadécimale
Cet aide mémoire, librement inspiré de l'article "Système hexadécimal" de Wikipedia, est destiné à l'accompagnement des auditeurs qui ne sont pas familiers avec cette notation concise des nombres binaires.
Le système hexadécimal est un système de numération en base 16. Il utilise ainsi 16 symboles, en général les chiffres arabes pour les dix premiers chiffres et les lettres "a" à "f" pour les six suivants (en majuscules ou en minuscules, sans importance en principe, mais il vaut mieux par cohérence adopter l'un ou l'autre pour la notation). Ce système est couramment utilisé en informatique et en électronique numérique pour représenter des codes binaires utilisés par les ordinateurs car il est :
- commode : conversion facile binaire <=> hexadécimal du fait que 16 (nombre de chiffres dans la base hexadécimale) est lui-même une puissance de 2 (nombre de chiffres de la base binaire) ;
- facilement lisible par les opérateurs humains car compact (il réduit le nombre de signes d'un facteur 4 par rapport au binaire). L'unité d'information couramment utilisée en informatique, à savoir l'octet (8 bits), se note ainsi sous forme de 2 chiffres hexadécimaux.
La conversion de binaire en hexadécimal se fait en regroupant les chiffres binaires (les bits) par groupes de quatre, également appelés "quartets" (ou nibbles). Le mot binaire doit donc avoir une longueur multiple de quatre. Au besoin, on le complète par des zéros à gauche (0 de poids fort non significatifs). À chacune des 16 combinaisons binaires d'un quartet (2 puissance 4 = 16) correspond un chiffre hexadécimal.
binaire | Hexadécimal | décimal |
0 0 0 0 | 0 | 0 |
0 0 0 1 | 1 | 1 |
0 0 1 0 | 2 | 2 |
0 0 1 1 | 3 | 3 |
0 1 0 0 | 4 | 4 |
0 1 0 1 | 5 | 5 |
0 1 1 0 | 6 | 6 |
0 1 1 1 | 7 | 7 |
1 0 0 0 | 8 | 8 |
1 0 0 1 | 9 | 9 |
1 0 1 0 | a | 10 |
1 0 1 1 | b | 11 |
1 1 0 0 | c | 12 |
1 1 0 1 | d | 13 |
1 1 1 0 | e | 14 |
1 1 1 1 | f | 15 |
Conversion
Ainsi, le nombre binaire 0010101011010101 composé de 4 quartets (nibbles) 0010 1010 1101 0101 se note 2ad5 en hexadécimal ( 0010 => 2, 1010 => a, 1101 => d, 0101 => 5).
Inversement, le nombre hexadécimal 7c8f20 se traduit par la chaîne binaire 0111 1100 1000 1111 0010 0000 (7 => 0111, c => 1100, 8 => 1000, f => 1111, 2 => 0010, 0 => 0000) et correspond au code binaire 011111001000111100100000.
Notation
Des notations sont utilisées, notamment dans les langages informatiques, pour différencier sans ambiguïté les chiffres hexadécimaux des autres :
- notation préfixée : 0x123 (langage C et dérivés), &h123 (BASIC), $123 (en Pascal et dérivés comme le VHDL en électronique), mais aussi #123 (Common Lisp), 0h123 (Texas Instruments) ou X'123' (COBOL) ;
- notation suffixée : 123h, 123(16) (arithmétique)
(Nota : pour l'anecdote, le chanteur et humoriste Boby Lapointe a inventé en 1968 un système de représentation hexadécimale, appelé système bibi-binaire à la fois drôle et cohérent, basé sur des symboles graphiques convenus en lieu et place des chiffres arabes et lettres (de 'a' à 'f').
Pour aller plus loin
- Le système hexadécimal https://fr.wikipedia.org/wiki/Syst%C3%A8me_hexad%C3%A9cimal
- Le système bibi-binaire https://fr.wikipedia.org/wiki/Syst%C3%A8me_Bibi-binaire
- Nibble https://fr.wikipedia.org/wiki/Nibble
- Une autre forme, moins courante, de représentation des codes binaires : le système octal http://fr.wikipedia.org/wiki/Syst%C3%A8me_octal