Difference between revisions of "Format du paquet IPv6"

From Livre IPv6

(Routage)
(Justification des extentions)
(30 intermediate revisions by one other user not shown)
Line 1: Line 1:
 +
{{Suivi|Table_des_matières|Début du chapitre|Format du message ICMPv6|Format du message ICMPv6}}
 +
 +
__TOC__
 
Hormis la modification de la taille des adresses, ce qui conduit à une taille d'en-tête de 40 octets (le double de l'en-tête IPv4 sans les options), le protocole IP a subi un toilettage reprenant l'expérience acquise au fil des ans avec IPv4. Le format des en-têtes IPv6 est simplifié et permet aux routeurs de meilleures performances dans leurs traitements :
 
Hormis la modification de la taille des adresses, ce qui conduit à une taille d'en-tête de 40 octets (le double de l'en-tête IPv4 sans les options), le protocole IP a subi un toilettage reprenant l'expérience acquise au fil des ans avec IPv4. Le format des en-têtes IPv6 est simplifié et permet aux routeurs de meilleures performances dans leurs traitements :
 
   
 
   
Line 5: Line 8:
 
* Les options ont été retirées de l'en-tête et remplacées par de nouveaux en-têtes appelés extensions qui peuvent être facilement ignorées par les routeurs intermédiaires.
 
* Les options ont été retirées de l'en-tête et remplacées par de nouveaux en-têtes appelés extensions qui peuvent être facilement ignorées par les routeurs intermédiaires.
 
* Les champs sont alignés sur des mots de 64 bits, ce qui optimise leur traitement, surtout avec les nouvelles architectures à 64 bits.
 
* Les champs sont alignés sur des mots de 64 bits, ce qui optimise leur traitement, surtout avec les nouvelles architectures à 64 bits.
* La taille minimale des MTU : Maximum Transmission Unit est de 1 280 octets. Le choix de 1 280 comme MTU minimal en IPv6 permet le tunnelage de paquets IPv6. En effet, la taille de 1 500 octets est généralement admise car elle correspond à la valeur imposée par Ethernet. La majorité des autres réseaux offrent une taille supérieure. La valeur de 576 octets retenue pour IPv4 permettait de prendre en compte des réseaux comme Appletalk. Pour ces réseaux, une couche d'adaptation (comme avec les couches d'adaptation AAL d'ATM) devra être mise en oeuvre pour pouvoir transporter les paquets IPv6.
+
* La taille minimale des MTU : Maximum Transmission Unit est de 1 280 octets. Le choix de 1 280 comme MTU minimal en IPv6 permet le tunnelage de paquets IPv6. En effet, la taille de 1 500 octets est généralement admise car elle correspond à la valeur imposée par Ethernet. La majorité des autres réseaux offrent une taille supérieure. Pour les réseaux ne le permettant pas, une couche d'adaptation (comme avec les couches d'adaptation AAL d'ATM) ou 6LoWPAN avec les réseaux de capteurs (comme IEEE 802.15.4) devra être mise en oeuvre pour pouvoir transporter les paquets IPv6.
 
* La fonction de fragmentation a été retirée des routeurs. Les champs qui s'y reportent (identification, drapeau, place du fragment) ont été supprimés. Normalement les algorithmes de découverte du [[Mécanisme de découverte du PMTU|PMTU]](Path MTU) évitent d'avoir recours à la fragmentation. Si celle-ci s'avère nécessaire, une extension est prévue (voir [[Les_extensions#frag|Fragmentation]]).
 
* La fonction de fragmentation a été retirée des routeurs. Les champs qui s'y reportent (identification, drapeau, place du fragment) ont été supprimés. Normalement les algorithmes de découverte du [[Mécanisme de découverte du PMTU|PMTU]](Path MTU) évitent d'avoir recours à la fragmentation. Si celle-ci s'avère nécessaire, une extension est prévue (voir [[Les_extensions#frag|Fragmentation]]).
 +
 +
L'idée est de retirer du cœur de réseau les traitements compliqués. Les routeurs ne font que forwarder les paquets vers la destination, les autres traitements (fragmentation, ...) seront fait par l'émetteur du paquet.
 +
  
 
Le format d'en-tête d'un paquet IPv6 est donné par le RFC 2460 (cf. Format d'un datagramme IPv6).
 
Le format d'en-tête d'un paquet IPv6 est donné par le RFC 2460 (cf. Format d'un datagramme IPv6).
Line 118: Line 124:
 
: Le champ classe de trafic est aussi appelé dans les paquets IPv4 octet DiffServ (DS), il prend la place du champ ToS, initialement défini dans la spécification d'IPv4 (cf. figure Format de l'octet classe de trafic). Le champ DS est découpé en deux parties. Le sous-champ DSCP (''DiffServ Code Point'') contient les valeurs des différents comportements. Les deux derniers bits du champ sont actuellement non utilisés, mais devraient servir aux routeurs pour indiquer un risque de congestion en combinaison avec l'algorithme RED (''Random Early Detection'').
 
: Le champ classe de trafic est aussi appelé dans les paquets IPv4 octet DiffServ (DS), il prend la place du champ ToS, initialement défini dans la spécification d'IPv4 (cf. figure Format de l'octet classe de trafic). Le champ DS est découpé en deux parties. Le sous-champ DSCP (''DiffServ Code Point'') contient les valeurs des différents comportements. Les deux derniers bits du champ sont actuellement non utilisés, mais devraient servir aux routeurs pour indiquer un risque de congestion en combinaison avec l'algorithme RED (''Random Early Detection'').
  
[[image:Fig4-2.png|thumb|left|200px|Figure 4-2 ''Format de l'octet classe de trafic'']]
+
<tikz title="Format de l'octet classe de trafic">
 +
\clip (0,0 ) rectangle (11, 6);
 +
% \draw[help lines] (0,0) grid (10,6);
 +
     
 +
\draw (1.8, 3.6) node (B1) [right, shade,  top color=purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B1.text) node {\tiny{}}; \draw (B1.north) node[above] {\tiny{8}};
 +
\draw (B1.east) node (B2) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B2.text) node {\tiny{}};\draw (B2.north) node[above] {\tiny{7}};
 +
\draw (B2.east) node (B3) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B3.text) node {\tiny{}};\draw (B3.north) node[above] {\tiny{6}};
 +
\draw (B3.east) node (B4) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B4.text) node {\tiny{}};\draw (B4.north) node[above] {\tiny{5}};
 +
\draw (B4.east) node (B5) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B5.text) node {\tiny{}};\draw (B5.north) node[above] {\tiny{4}};
 +
\draw (B5.east) node (B6) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B6.text) node {\tiny{}};\draw (B6.north) node[above] {\tiny{3}};
 +
\draw (B6.east) node (B7) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B7.text) node {\tiny{}};\draw (B7.north) node[above] {\tiny{2}};
 +
\draw (B7.east) node (B8) [right, shade,  top color= purple!50,  draw, minimum height=0.5cm, minimum width=.2cm] {}; \draw (B8.text) node {\tiny{}};\draw (B8.north) node[above] {\tiny{1}};
 +
 
 +
\draw[decorate,decoration={brace,mirror},red] ([yshift=-.3cm]B1.west) -- node (DF) [below]  {}  ([yshift=-.3cm]B6.east);
 +
\draw[decorate,decoration={brace,mirror},red] ([yshift=-.3cm]B7.west) -- node (EC) [below] {} ([yshift=-.3cm]B8.east);
 +
 +
  \draw (DF) node [below] {\tiny{AF  1-4 EF}};
 +
  \draw (EC) node [below] {\tiny{ECN}};
 +
</tikz>
  
 
: 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 seront 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 service soit efficace, il faut offrir des tarifications différentes pour chacune des classes et des mécanismes de contrôle pour vérifier qu'un utilisateur n'utilise pas que les classes les plus élevées ou qu'il dépasse son contrat.
 
: 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 seront 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 service soit efficace, il faut offrir des tarifications différentes pour chacune des classes et des mécanismes de contrôle pour vérifier qu'un utilisateur n'utilise pas que les classes les plus élevées ou qu'il dépasse son contrat.
Line 156: Line 180:
 
; Nombre de sauts : Il est décrémenté à chaque nœud 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.  <br> Dans IPv4 ce champ est appelé durée de vie (ou TTL Time To Live). Sa vocation initiale est d'indiquer, en secondes, la durée maximale durant laquelle un paquet peut rester dans le réseau. En pratique, les paquets ne restent que quelques millisecondes dans les routeurs, et donc la décrémentation est arrondie à 1. Par contre, pour une liaison plus lente la décrémentation de ce champ peut être supérieure à 1. Dans IPv6, comme il s'agit d'un nombre de sauts, la décrémentation est toujours de 1. <br>La valeur initiale de ce champ 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. <br>La valeur par défaut peut être dynamiquement attribuée aux équipements du réseau par les annonce des routeurs (cf. [[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.
 
; Nombre de sauts : Il est décrémenté à chaque nœud 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.  <br> Dans IPv4 ce champ est appelé durée de vie (ou TTL Time To Live). Sa vocation initiale est d'indiquer, en secondes, la durée maximale durant laquelle un paquet peut rester dans le réseau. En pratique, les paquets ne restent que quelques millisecondes dans les routeurs, et donc la décrémentation est arrondie à 1. Par contre, pour une liaison plus lente la décrémentation de ce champ peut être supérieure à 1. Dans IPv6, comme il s'agit d'un nombre de sauts, la décrémentation est toujours de 1. <br>La valeur initiale de ce champ 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. <br>La valeur par défaut peut être dynamiquement attribuée aux équipements du réseau par les annonce des routeurs (cf. [[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.
  
== Exemples ==
 
  
Le paquet IPv6 suivant a été capturé au cours d'une connexion FTP :
 
 
''0000: 6<font color="blue">0 0</font>0 00 00 <font color="blue">00 28</font> 06 <font color="blue">40</font> 3f fe 03 02 00 12 00 02''
 
''0010: 00 00 00 00 00 00 00 13 <font color="blue">3f fe 03 05 10 02 00 01</font>''
 
''0020: <font color="blue">02 00 c0 ff fe 11 cb a0</font>|ff b3 <font color="blue">00 15</font> 55 4d fd d1''
 
''0030: <font color="blue">00 00 00 00</font> a0 <font color="blue">02</font> 40 00 <font color="blue">7d 76</font> 00 00 <font color="blue">02 04 05 a0</font>''
 
''0040: <font color="blue">01</font> 03 03 00 <font color="blue">01</font> 01 <font color="blue">08 0a 00 9a 17 44 00 00 00 00</font>''
 
 
Le paquet commence par <tt>6</tt> qui indique la version du protocole. Le second champ <tt><font color="blue">00</font></tt> donne la classe de trafic ''DiffServ''. L'identificateur de flux n'a pas été défini par la source (<tt>0 00 00</tt>). La longueur du paquet est de <tt><font color="blue">0x0028</font></tt> octets. Le paquet ne contient pas d'extension puisque la valeur de l'en-tête suivant, <tt>0x06</tt>, correspond au protocole de niveau 4 TCP. Le nombre maximal de routeurs que le paquet pourra traverser est de 64 (<tt><font color="blue">0x40</font></tt>). Les adresses source et destination sont des adresses de test appartenant au plan d'adressage agrégé.
 
  
 
= Justification des extentions =
 
= Justification des extentions =
Line 197: Line 211:
 
La figure "Enchaînement d'extentions" montre la souplesse avec laquelles plusieurs extentions peuvent être chaînées. Chaque extention contient dans son en-tête un champ ''en-tête suivant'' et longueur. Le premier paquet ne contient pas d'extention, le champ ''en-tête suivant'' pointe sur TCP. Le second paquet contient une extention de routage qui pointe sur TCP. Dans le dernier paquet, une extention de fragmentation est ajoutée après celle de routage.
 
La figure "Enchaînement d'extentions" montre la souplesse avec laquelles plusieurs extentions peuvent être chaînées. Chaque extention contient dans son en-tête un champ ''en-tête suivant'' et longueur. Le premier paquet ne contient pas d'extention, le champ ''en-tête suivant'' pointe sur TCP. Le second paquet contient une extention de routage qui pointe sur TCP. Dans le dernier paquet, une extention de fragmentation est ajoutée après celle de routage.
  
Si cet enchaînement d'extention offre beaucoup plus de souplesse que les options d'IPv4, il rend difficile la lecture des numéros de port, il faut en effet lire tout l'enchaînement d'extention pour arriver au protocole de niveau 4. Ceci a seri de justification au l'identificateur de flux qui permettait de refleter au niveau 3 un flux particulier et évitait de dérouler l'enchaînement. Bien entendu, les pare-feux devront aux numéros de ports.
+
Si cet enchaînement d'extention offre beaucoup plus de souplesse que les options d'IPv4, il rend difficile la lecture des numéros de port, il faut en effet lire tout l'enchaînement d'extention pour arriver au protocole de niveau 4. Ceci a servi de justification au l'identificateur de flux qui permettait de refleter au niveau 3 un flux particulier et évitait de dérouler l'enchaînement. Bien entendu, les pare-feux devront vérifier les numéros de ports.
  
 
Les extentions peuvent être vues comme un protocole 3.5 (entre la couche 3 et la couche 4). En effet, à part l'extention de proche-en-proche, qui est traitée par tous les routeurs traversés, les autres extentions ne sont traitées que par le destinataire du paquet (i.e. celui spécifié dans le champ adresse de destination du paquet IPv6).  
 
Les extentions peuvent être vues comme un protocole 3.5 (entre la couche 3 et la couche 4). En effet, à part l'extention de proche-en-proche, qui est traitée par tous les routeurs traversés, les autres extentions ne sont traitées que par le destinataire du paquet (i.e. celui spécifié dans le champ adresse de destination du paquet IPv6).  
  
==Traitement optimisé des extentions==
+
Si d'un point de vue théorique les extentions sont supérieurs aux options d'IPv4, dans la réalité très peu sont utilisées à grande échelle et restent du domaine de la recherche.
+
<tikz title="Traitement de l'option LSR en IPv4" scale="75%">
+
\clip (0, 0) rectangle (10,7);
+
  
\color{incertblue!20}
+
=Interaction avec le niveau supérieur=
\pgfsetstrokecolor{black}
+
        \pgfputat{\pgfxy(0.0,5.0)}{\pgfbox[left,base]{\pgfuseimage{compleft}}}
+
\foreach \x in {3,5,7} {
+
\pgfpathcircle{\pgfpoint{\x cm}{5.5cm}}{3mm} \pgfusepath{fill,stroke}
+
}
+
+
\pgfpathrectangle{\pgfpoint{8.5cm}{5cm}}{\pgfpoint{1cm}{1cm}}
+
\pgfusepath{fill, stroke}
+
  
\foreach \x in {4,2} {
+
==Checksum==
\pgfpathcircle{\pgfpoint{9 cm}{\x cm}}{3mm} \pgfusepath{fill,stroke}
+
}
+
  
        \pgfputat{\pgfxy(8.5,0.0)}{\pgfbox[left,base]{\pgfuseimage{compleft}}}
 
       
 
        \color {black}
 
        \pgfputat{\pgfpoint{0.34cm}{5.5cm}}{\pgfbox[left,base]{A}}
 
        \pgfputat{\pgfpoint{8.85cm}{5.4cm}}{\pgfbox[left,base]{R1}}
 
        \pgfputat{\pgfpoint{8.85cm}{0.5cm}}{\pgfbox[left,base]{B}}
 
%\color{blue!70}
 
  
 
+
Parmi les différences existant entre les datagrammes IPv4 et IPv6, il y a la disparition du checksum dans les en-têtes IP. Cette somme de contrôle était utilisée pour vérifier la validité de l'en-tête du paquet traité. En IPv4, il est nécessaire de la vérifier et de l'ajuster lors de chaque retransmission par un routeur, ce qui entraîne une augmentation du temps de traitement du paquet.
 
+
\draw (0.5, 4)  node  [right, draw, shade, top color = yellow, minimum width=2cm, minimum height=1cm] {\tiny{\tt{IPv4: A -> R1}}};
+
\draw (0.5, 3)  node  [right, draw, shade, top color = yellow, minimum width=2cm, minimum height=1cm] {\tiny{\tt{option:  ->  B}}};
+
  
\foreach \x in {1.3,3.3, 5.3,7.3} {
+
Cette somme ne vérifie que l'en-tête IPv4, pas le reste du paquet. Aujourd'hui les supports physiques sont de meilleure qualité et savent détecter les erreurs (par exemple, Ethernet a toujours calculé sa propre somme de contrôle ; PPP, qui a presque partout remplacé SLIP, possède un CRC). L'intérêt de la somme de contrôle a diminué et ce champ a été supprimé de l'en-tête IPv6.
\draw [->] (\x , 5.5) -- +(1.4, 0);
+
}
+
+
\foreach \x in {2.9,4.9, 6.9} {
+
\draw[->] (\x, 5.8) .. controls +(90:1.4cm) and +(45:0.3cm)  .. node[above] {\tiny{special treatment}} +(0.3, -0.2);
+
}
+
  
\draw (5.5, 4)  node  [right, draw, shade, top color = yellow, minimum width=2cm, minimum height=1cm] {\tiny{\tt{IPv4: A -> B}}};
+
[[image:Fig4-10.png|thumb|right|350px|Figure 4-10 ''Champ du pseudo-en-tête'']]
\draw (5.5, 3)  node  [right, draw, shade, top color = yellow, minimum width=2cm, minimum height=1cm] {\tiny{\tt{option:  R1 -> }}};
+
          }
+
         
+
          \draw [->] (9,5) -- (9,4.3);
+
          \draw [->] (9, 3.7) -- (9, 2.3);
+
          \draw [->] (9, 1.7) -- (9, 1);
+
         
+
          \draw[->] (9.2, 4) .. controls +(5:1.4cm) and +(-45:0.3cm)  .. +(0, -0.2);
+
          \draw[->] (9.2, 4) .. controls +(5:1.4cm) and +(-45:0.3cm)  .. +(0, -0.2);
+
  
          \draw[->] (9.2, 2) .. controls +(5:1.4cm) and +(-45:0.3cm)  .. +(0, -0.2);
 
          \draw[->] (9.2, 2) .. controls +(5:1.4cm) and +(-45:0.3cm)  .. +(0, -0.2);
 
</tikz>
 
  
 +
Le checksum sur l'en-tête IPv6 n'existant plus, il faut quand même se prémunir des erreurs de transmission. En particulier, une erreur sur l'adresse de destination va faire router un paquet dans une mauvaise direction. Le destinataire doit donc vérifier que les informations d'en-tête IP sont incorrectes pour éliminer ces paquets. Dans les mises en oeuvre des piles de protocoles Internet, les entités de niveau transport remplissent certains champs du niveau réseau. Il a donc été décidé que tous les protocoles au-dessus d'IPv6 devaient utiliser une somme de contrôle intégrant à la fois les données et les informations de l'en-tête IPv6. La notion de pseudo-en-tête dérive de cette conception. Pour un protocole comme TCP qui possède une somme de contrôle, cela signifie modifier le calcul de cette somme. Pour un protocole comme UDP qui possède une somme de contrôle facultative, cela signifie modifier le calcul de cette somme et le rendre obligatoire.
  
L'exemple suivant permet de souligner les problèmes d'utilisation des options dans IPv4, d'illustrer la notion de tunnel et le concept de transmission multicast.
+
IPv6 a unifié la méthode de calcul des différentes sommes de contrôle. Celle-ci est calculée sur l'ensemble formé de la concaténation d'un pseudo-en-tête (cf. Champ du pseudo-en-tête) et du paquet du protocole concerné. L'algorithme de calcul du checksum est celui utilisé en IPv4. Il est très simple à mettre en œuvre et ne demande pas d'opérations compliquées. Il s'agit de faire la somme en complément à 1 des mots de 16 bits du pseudo-en-tête, de l'en-tête du protocole de transport, et des données, puis de prendre le complément à 1 du résultat.
  
 +
Il faut noter que les informations contenues dans le pseudo-en-tête ne seront pas émises telles quelles sur le réseau. Le champ "en-tête suivant" du pseudo-en-tête ne reflète pas celui qui sera émis dans les paquets puisque les extensions ne sont pas prises en compte dans le calcul du checksum. Ainsi, si l'extension de routage est mise en œuvre, l'adresse de la destination est celle du dernier équipement. De même le champ longueur est sur 32 bits pour contenir la valeur de l'option jumbogramme, si celle-ci est présente.
  
La solution (cf. figure Traitement de l'option LSR en IPv4) consiste à émettre le paquet avec l'option de routage libéral par la source (''loose source routing''). Le paquet est destiné au routeur R1, qui permute l'adresse de destination avec celle contenue dans le champ option. Le paquet franchissant les routeurs entre A et R1 puis R1 et B sera retardé à cause de la présence du champ option. Avec IPv4, les options sont obligatoirement prises en compte par tous les routeurs intermédiaires. Ceux-ci, pour des raisons de performance, privilégient les paquets sans option. De plus, par construction, la longueur du champ option est limitée à 40 octets, ce qui limite l'emploi simultané de plusieurs options.
+
== UDP et TCP ==
  
<tikz title="Traitement avec l'extention de routage IPv6" scale="75%">
+
Les modifications apportées aux protocoles de niveau 4 UDP et TCP sont minimes. L'un des pré-requis à la mise en œuvre d'IPv6 était de laisser en l'état aussi bien TCP (''Transmission Control Protocol'') qu'UDP (''User Datagram Protocol''). Ces protocoles de transport sont utilisés par la très grande majorité des applications réseau et l'absence de modification facilitera grandement le passage de IPv4 à IPv6.
\clip (0, 0) rectangle (10,7);
+
  
\color{incertblue!20}
+
La principale modification à ces protocoles concerne le checksum. Comme il a été précisé [[Checksum au niveau transport]], il a été adapté au format de paquet IPv6 et englobe le pseudo-en-tête. De plus, pour UDP, le checksum qui était facultatif en IPv4, devient obligatoire.
\pgfsetstrokecolor{black}
+
        \pgfputat{\pgfxy(0.0,5.0)}{\pgfbox[left,base]{\pgfuseimage{compleft}}}
+
\foreach \x in {3,5,7} {
+
\pgfpathcircle{\pgfpoint{\x cm}{5.5cm}}{3mm} \pgfusepath{fill,stroke}
+
}
+
+
\pgfpathrectangle{\pgfpoint{8.5cm}{5cm}}{\pgfpoint{1cm}{1cm}}
+
\pgfusepath{fill, stroke}
+
  
\foreach \x in {4,2} {
+
Un autre changement au niveau des protocoles de niveau 4 concerne la prise en compte de l'option jumbogramme de l'extension [[Les extensions#PeP|proche-en-proche]]. Le  RFC 2675 définit le comportement de UDP et de TCP quand les jumbogrammes sont utilisés. En effet, les en-têtes de ces messages contiennent eux aussi un champ longueur codé sur 16 bits et par conséquent insuffisant pour coder la longueur du jumbogramme :
\pgfpathcircle{\pgfpoint{9 cm}{\x cm}}{3mm} \pgfusepath{fill,stroke}
+
}
+
  
        \pgfputat{\pgfxy(8.5,0.0)}{\pgfbox[left,base]{\pgfuseimage{compleft}}}
+
* Pour le protocole UDP, si la longueur des données excède 65 535 octets, le champ longueur est mis à 0. Le récepteur détermine la longueur des données par la connaissance de la taille dans l'option jumbogramme.
       
+
* Le protocole TCP pose plus de problèmes. En effet, bien que les messages TCP ne contiennent pas de champ longueur, plusieurs compteurs sont codés sur 16 bits.
        \color {black}
+
* Le champ longueur de la fenêtre de réception ne pose pas de problème depuis que le RFC 1323 a défini l'option TCP window scale qui donne le facteur multiplicatif qui doit être appliqué à ce champ.
        \pgfputat{\pgfpoint{0.34cm}{5.5cm}}{\pgfbox[left,base]{A}}
+
* À l'ouverture de connexion, la taille maximale des segments (MSS) est négociée. Le RFC 2675 précise que si cette taille doit être supérieure à 65 535, la valeur 65 535 est envoyée et le récepteur prend en compte la longueur déterminée par l'algorithme de découverte du MTU.
        \pgfputat{\pgfpoint{8.85cm}{5.4cm}}{\pgfbox[left,base]{R1}}
+
* Pour l'envoi de données urgentes avec TCP, on utilise un bit spécifique de l'en-tête (bit URG) ainsi que le champ "pointeur urgent". Ce dernier sert à référencer la fin des données à traiter de manière particulière. Trois cas peuvent se présenter :
        \pgfputat{\pgfpoint{8.85cm}{0.5cm}}{\pgfbox[left,base]{B}}
+
** Le premier, qui est identique à IPv4, est celui où le pointeur indique une position de moins de 65 535.
%\color{blue!70}
+
** Le second se produit lorsque le déplacement est supérieur à 65 535 et supérieur ou égal à la taille des données TCP envoyées. Cette fois-ci, on place la valeur 65 535 dans le champ "pointeur urgent" et on continue le traitement normal des paquets TCP.
+
** Le dernier cas intervient quand le pointeur indique un déplacement de plus de 65 535 qui est inférieur à la taille des données TCP. Un premier paquet est alors envoyé, dans lequel on met la valeur 65 535 dans le champ "pointeur urgent". L'important est de choisir une taille de paquet de manière à ce que le déplacement dans le second paquet, pour indiquer la fin des données urgentes, soit inférieur à 65 535.
+
+
\draw (0.5, 4)  node  [right, draw, shade, top color = purple, minimum width=2.3cm, minimum height=1cm] {\tiny{\tt{IPv6: A -> R1}}};
+
\draw (0.5, 2.8)  node  [right, draw, shade, top color = purple!20, minimum width=2.3cm, minimum height=1cm] {\tiny{\tt{Extension: ->  B}}};
+
+
\foreach \x in {1.3,3.3, 5.3,7.3} {
+
\draw [->] (\x , 5.5) -- +(1.4, 0);}
+
+
\foreach \x in {2.7,4.7, 6.7} {
+
\draw[->, dotted] (\x, 5.5) -- +(0.6, 0);}
+
+
+
  
\draw (6, 4)  node  [right, draw, shade, top color = purple, minimum width=2.3cm, minimum height=1cm] {\tiny{\tt{IPv6: A -> B}}};
+
Il existe d'autres propositions pour faire évoluer TCP. Il faut remarquer que le travail n'est pas de même ampleur que pour IP. En effet, TCP est un protocole de bout-en-bout, la transition vers une nouvelle génération du protocole peut se faire par négociation entre les deux extrémités. Pour IP, tous les routeurs intermédiaires doivent prendre en compte les modifications.
\draw (6, 2.8)  node  [right, draw, shade, top color = purple!20, minimum width=2.3cm, minimum height=1cm] {\tiny{\tt{Extension:  R1 ->  }}};
+
  
\draw [->] (9,5) -- (9,4.3);
+
== UDP-lite ==
          \draw [->] (9, 3.7) -- (9, 2.3);
+
          \draw [->] (9, 1.7) -- (9, 1);
+
  
\draw [->, dotted] (9, 4.3) -- (9, 3.7);
+
UDP-lite permet de remonter aux couches supérieures des données erronées pendant leur transport. Si dans un environnement informatique, une erreur peut avoir des conséquences relativement grave quant à l'intégrité des données et il est normal de rejeter ces paquets, or, la plupart des décodeurs de flux multimédias sont capables de supporter un certains nombre d'erreurs binaires dans un flux de données. Pour améliorer la qualité perçue par l'utilisateur, il est donc préférable d'accepter des paquets erronés plutôt que de rejeter un bloc complet d'information.
\draw [->, dotted] (9, 2.3) -- (9, 1.7);
+
+
  
}
+
En IPv4, l'utilisation du checksum UDP étant optionnelle (la valeur 0 indique que le checksum n'est pas calculé), UDP peut être utilisé pour transporter des flux multimédia. Avec IPv6, l'utilisation du checksum a été rendue obligatoire puisque le niveau 3 n'en possède pas. Pour éviter qu'un paquet comportant des erreurs ne puisse pas être remonté aux couche supérieures, le protocole UDP-lite a été défini RFC 3828. Les modifications sont minimes par rapport à UDP. Le format de la trame reste le même, seule la sémantique du champ longueur est changée. Avec UDP, ce champ est inutile puisqu'il est facilement déduit du champ longueur de l'en-tête IP. UDP-lite le transforme en champ couverture du checksum. Si la longueur est 0, UDP-lite considère que tout le checksum couvre tout le paquet. La valeur 8 indique que seul l'en-tête UDP est protégé par le checksum (ainsi qu'une partie de l'en-tête IP grâce au pseudo-header). Les valeurs comprises entre 1 et 7 sont interdites car le checksum UDP-lite doit toujours couvrir l'en-tête. Une valeur supérieure à 8 indique qu'une partie des données sont protégées. Si la couverture est égale à la longueur du message on se retrouve dans un cas compatible avec UDP.
  
 +
== SCTP ==
  
</tikz>
+
Le protocole SCTP (''Stream Control Transmission Protocol'') RFC 2960 est fortement lié au protocole IPv6. SCTP est un protocole de niveau 4 initialement conçu pour transporter des informations de signalisation. La fiabilité est donc un prérequis important et la gestion de la multi-domiciliation est prise en compte. L'idée est de permettre aux deux équipements terminaux d'échanger à l'initialisation de la connexion (appelée dans le standard association), l'ensemble de leurs adresses IPv4 et IPv6. Chaque équipement choisi une adresse privilégiée pour émettre les données vers l'autre extrémité et surveille périodiquement l'accessibilité des autres adresses. Si l'équipement n'est plus accessible par l'adresse principale, une adresse secondaire sera choisie.
 
+
<br/>
+
 
+
Avec IPv6 la philosophie est différente comme le montre la figure "Traitement avec l'extention de routage IPv6". Un paquet normal à destination de R1 est envoyé dans le réseau et est traité normalement par les routeurs intermédiaires. R1 reconnait son adresse et le passe à la couche supérieur qui traite l'extention de routage. Cette couche inverse les adresses et réémet le paquet vers la nouvelle destination.
+
 
+
== Ordre des extentions==
+
 
+
<tikz title="Importance de l'ordre des extentions" scale="75%">
+
\clip (0, 0) rectangle (11,7);
+
 
+
\draw (2, 6.5) node (IPv6)  [right, draw, shade, top color = purple, minimum width=2cm, minimum height=0.4cm] {\tiny{IPv6}};
+
+
\draw (2, 5.9) node (hbh)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Hop by Hop}};
+
 
+
\draw (2, 5.3) node (dest1)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Destination}};
+
 
+
\draw (2, 4.7) node (rout)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Routing}};
+
 
+
\draw (2, 4.1) node (frag)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Fragmentation}};
+
 
+
\draw (2, 3.5) node (auth)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Authentication}};
+
 
+
\draw (2, 2.9) node (sec)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Security}};
+
 
+
\draw (2, 2.3) node (dest2)  [right, draw, shade, top color = purple!40, minimum width=2cm, minimum height=0.4cm] {\tiny{Destination}};
+
+
\draw (2, 1) node (ulp)  [right, draw, shade, top color = white, minimum width=2cm, minimum height=1.8cm] {\tiny{ULP}};
+
+
\draw [->] (IPv6.west) .. controls +(-1, -0.1) and +(-1, -0.1) ..  node [left] {\tiny{\tt{0}}}  (hbh.west);
+
\draw [->] (hbh.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{60}}} (dest1.west);
+
\draw [->] (dest1.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{43}}} (rout.west);
+
\draw [->] (rout.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{44}}} (frag.west);
+
\draw [->] (frag.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{51}}} (auth.west);
+
\draw [->] (auth.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{50}}} (sec.west);
+
\draw [->,dotted] (sec.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{60}}} (dest2.west);
+
\draw [->, dotted] (dest2.west) .. controls +(-1, -0.1) and +(-1, -0.1).. node [left] {\tiny{\tt{6, 11, ...}}}  (ulp.west);
+
+
 
+
\draw (hbh.east) node [right]  {\tiny{Processed by every router}};
+
\draw (dest1.east) node [right]  {\tiny{Processed by routers listed in Routing extension}};
+
\draw (rout.east) node [right]  {\tiny{Processed by routers listed in Routing extension }};
+
\only <2| handout:2> {
+
\draw (frag.east) node [right]  {\tiny{Costly to reassemble in each router listed}};
+
\draw (auth.east) node [right]  {\tiny{Authentication can only be made on full packet }};
+
\draw (sec.east) node [right]  {\tiny{Processed by the destination }};
+
\draw (dest2.east) node [right]  {\tiny{Destination information will be protected}};
+
 
+
}
+
\draw (ulp.east) node [right]  {\tiny{Processed by the destination }};
+
 
+
</tikz>
+
 
+
 
+
Le RFC 2460 recommande l'ordre suivant :
+
 
+
*[[#PeP|Proche-en-proche]] (doit toujours être en première position)
+
*[[#dest|Destination]] (sera aussi traité par les routeurs listés dans l'extension de routage par la source)
+
*[[#routage|Routage]] par la source
+
*[[#frag|Fragmentation]]
+
*Authentification
+
*Destination (traité uniquement par l'équipement terminal)
+
 
+
En fait, il y a actuellement très peu de chance de trouver des extentions dans les paquets IPv6, encore moins plusieurs extentions enchaînées. Par ontre l'exemple précédent est instructif car il montre que la place d'une extention dans la chaîne est importante.
+
 
+
On peut remarquer que ce paquet contient deux extentions destination. La première étant placée avant l'extention de routage serait traitée par tous les routeurs intermédiaire listés dans l'option de routage. La second située après, ne serait traitée que par le destinataire final. De plus cette option étant également placée après l'extention de chiffrement, ses données ne circuleraient pas en clair sur le réseau.
+
 
+
De même l'extention fragmentation est située après celle de routage. Seul le destinataire final fera le réassemblage du paquet.
+
 
+
==Options dans les extentions==
+
 
+
=== <div id=PeP> Proche-en-proche </div> ===
+
 
+
[[image:Fig4-6.png|thumb|right|350px|Figure 4-6 ''Format générique des options "proche-en-proche" et "destination"'']]
+
 
+
Cette extension (en anglais : ''hop-by-hop'') se situe toujours en première position et est traitée par tous les routeurs que le paquet traverse. Le type associé (contenu dans le champ d'en-tête en-tête suivant de l'en-tête précédent) est 0 et le champ longueur de l'extension contient le nombre de mots de 64 bits moins 1.
+
+
L'extension est composée d'options. Pour l'instant, seules quatre options, dont deux de bourrage, sont définies (cf. Format des options IPv6). Chaque option est une suite d'octets. Le premier octet est un type, le deuxième (sauf pour l'option 0) contient la longueur de l'option moins 2. Les deux premiers bits de poids fort du type définissent le comportement du routeur quand il rencontre une option inconnue :
+
 
+
*00 : le routeur ignore l'option ;
+
*01 : le routeur rejette le paquet ;
+
*10 : le routeur rejette le paquet et retourne un message ICMPv6 d'inaccessibilité ;
+
*11 : le routeur rejette le paquet et retourne un message ICMPv6 d'inaccessibilité si l'adresse de destination n'est pas multicast.
+
 
+
Le bit suivant du type indique que le routeur peut modifier le contenu du champ option (valeur à 1) ou non (valeur à 0).
+
 
+
[[image:Fig4-7.png|thumb|right|350px|Figure 4-7 ''Format des options IPv6'']]
+
+
Les quatre options de proche-en-proche sont :
+
 
+
*<div id="Pad1">Pad1 (type 0). Cette option est utilisée pour introduire un octet de bourrage.</div>
+
*<div id="Padn">Padn (type 1). Cette option est utilisée pour introduire plus de 2 octets de bourrage. Le champ longueur indique le nombre d'octets qui suivent.</div>
+
 
+
Les options de bourrage peuvent sembler inutiles avec IPv6 puisqu'un champ longueur pourrait en donner la longueur exacte. En fait les options de bourrage servent à optimiser le traitement des paquets en alignant les champs sur des mots de 32, voire 64 bits ; le RFC 2460 discute en annexe de la manière d'optimiser le traitement tout en minimisant la place prise par les options.
+
 
+
*Jumbogramme (type 194 ou 0xc2, RFC 2675). Cette option est utilisée quand le champ longueur des données du paquet IPv6 n'est pas suffisant pour coder la taille du paquet. Cette option est essentiellement prévue pour la transmission à grand débit entre deux équipements. Si l'option jumbogramme est utilisée, le champ longueur des données utiles dans l'en-tête IPv6 vaut 0. <br> Noter que le type commence par la séquence binaire 11, ce qui permet au routeur ne traitant pas les jumbogrammes d'en informer la source. Celle-ci pourra réémettre l'information sans utiliser cette option.
+
 
+
*L'option Router Alert (RFC 2711) demande à un routeur d'examiner le contenu des données qu'il relaie (Router Alert existe également en IPv4, RFC 2113). En principe, le processus de relayage (recopier le paquet sur une interface de sortie en fonction de l'adresse destination et des tables de routage) doit être le plus rapide possible. Mais pour des protocoles comme la gestion des groupes de multicast avec MLD (''Multicast Listener Discovery'') ou la signalisation des flux avec RSVP, tous les routeurs intermédiaires doivent tenir compte des données. <br>L'émetteur envoie les données à la destination, mais s'il précise l'option Router Alert, les routeurs intermédiaires vont analyser les données, voire modifier leur contenu avant de relayer le paquet. Ce mécanisme est efficace puisque les routeurs n'ont pas à analyser le contenu de tous les paquets d'un flux. <br> Le type de l'option vaut 5. Il commence par la séquence binaire 00, puisqu'un routeur qui ne connaît pas cette option doit relayer le paquet sans le modifier. Le champ valeur de l'option contient :
+
**0 : pour les messages du protocole MLD de gestion des groupes multicast ;
+
**1 : pour les messages RSVP ;
+
**2 : pour les réseaux actifs ;
+
:les autres valeurs sont réservées.
+
 
+
=== <div id=dest>Destination </div>===
+
Cette extension, dont le format est identique à l'extension de proche-en-proche (cf. figure Format des extensions "proche-en-proche" et "destination"), contient des options qui sont traitées par l'équipement destinataire. Pour l'instant, à part les options de bourrage (voir [[#Pad1|Pad1]] et [[#Padn|Padn]]) et de mobilité (cf. [[Mobilité dans IPv6]]), la seule autre option concerne le tunnelage dans des paquets IPv6 (RFC 2473). Cette option permet de limiter le niveau d'encapsulation dans des tunnels des paquets IPv6.
+
 
+
=== <div id="routage">Routage ===
+
 
+
{{HorsTexte|Routage par la source déprécié|Le routage par la source peut conduire à une duplication de paquets dans le réseau. Cette amplification du trafic permettant de réaliser des attaques par déni de service. Ainsi si dans la liste des routeurs a traverser, on met une liste R1, R2, R1, R2, .... le paquet fera du ping pong entre ces deux routeurs, comme l'explique le rfc5095.}}
+
 
+
Cette extension permet d'imposer à un paquet une route différente de celle offerte par les politiques de routage présentes sur le réseau.  La [[Mobilité dans IPv6|mobilité IPv6]] a également introduit une extension de routage (type = 2) (cf. [[La gestion de la mobilité IPv6#Optimisation dans le cas du mobile dans un réseau étranger|Optimisation dans le cas du mobile dans un réseau étranger]]).
+
 
+
Dans IPv4, le routage peut être strict (le routeur suivant présent dans la liste doit être un voisin directement accessible) ou libéral (''loose'') (un routeur peut utiliser les tables de routage pour joindre le routeur suivant servant de relais). Dans IPv6, seul le routage libéral est autorisé. En effet, le routage strict était initialement mis en place surtout pour des raisons de sécurité. La source devait être absolument sûre du chemin pris par les paquets. Cette utilisation a maintenant disparu du réseau.
+
 
+
Le principe du routage par la source ou Source Routing dans IPv4 est rappelé en introduction de ce chapitre sur les extensions. Le principe est le même pour IPv6. L'émetteur met dans le champ destination du paquet IPv6, l'adresse du premier routeur servant de relais, l'extension contient la suite de la liste des autres routeurs relais et le destinataire. Quand un routeur reçoit un paquet qui lui est adressé comportant une extension de routage par la source, il permute son adresse avec l'adresse du prochain routeur et réémet le paquet vers cette adresse suivante.
+
 
+
[[image:Fig4-8.png|thumb|right|350px|Figure 4-8 ''Format de l'extension routage par la source'']]
+
 
+
 
+
La figure Format de l'extension routage par la source donne le format de l'extension de routage par la source :
+
+
*Le champ longueur de l'en-tête indique le nombre de mots de 64 bits qui composent l'extension. Pour l'extension de type 0, cela correspond au nombre d'adresses présentes dans la liste, multiplié par 2.
+
*Le champ type indique la nature du routage. Le routage par la source, de type 0 est spécifié a été déprécié (cf RFC5095). La suite de l'en-tête correspond à ce type.
+
*Le nombre de segments restant est décrémenté après la traversée d'un routeur. Il indique le nombre d'équipements qui doivent encore être traversés. Il permet de trouver l'adresse qui devra être substituée.
+
*Les 32 bits suivants sont inutilisés pour préserver l'alignement.
+
 
+
La liste comprenant les routeurs à traverser et le destinataire est fournie. Ces adresses ne peuvent pas être multicast.
+
 
+
== <div id="frag">Fragmentation </div>==
+
 
+
La fragmentation telle qu'elle est pratiquée dans IPv4 n'est pas très performante. Initialement, elle servait à rendre transparente les limitations physiques des supports de transmission. Dans IPv4 quand un routeur ne peut pas transmettre un paquet à cause de sa trop grande taille et si le bit <tt>DF</tt> (''don't fragment'') est à 0, il découpe l'information à transmettre en fragments. Or le réseau IP étant un réseau à datagramme, il n'y a pas de possibilité de contrôler les fragments. Deux fragments successifs peuvent prendre deux chemins différents et par conséquent seul le destinataire peut effectuer le réassemblage. En conséquence, après la traversée d'un lien impliquant une fragmentation, le reste du réseau ne voit passer que des paquets de taille réduite.
+
 
+
Il est plus intéressant d'adapter la taille des paquets à l'émission. Ceci est fait en utilisant les techniques de découverte du MTU (voir [[Mécanisme de découverte du PMTU]] (RFC 1981)). En pratique une taille de paquets de 1 500 octets est presque universelle.
+
 
+
Il existe pourtant des cas où la fragmentation est nécessaire. Ainsi une application telle que NFS sur UDP suppose que la fragmentation existe et produit des messages de grande taille. Comme on ne veut pas modifier ces applications, la couche réseau d'IPv6 doit aussi être capable de gérer la fragmentation. Pour réduire le travail des routeurs intermédiaires, la fragmentation se fera chez l'émetteur et le réassemblage chez le récepteur.
+
 
+
[[image:Fig4-9.png|thumb|right|350px|Figure 4-9 ''Format de l'extension de fragmentation'']]
+
 
+
Le format de l'extension de fragmentation est donné figure Format de l'extension de fragmentation. La signification des champs est identique à celle d'IPv4 :
+
+
*Le champ <tt>place du fragment</tt> indique lors du réassemblage où les données doivent être insérées. Ceci permet de parer les problèmes dus au déséquencement dans les réseaux orientés datagrammes. Comme ce champ est sur 13 bits, la taille de tous les segments, sauf du dernier, doit être multiple de 8 octets.
+
*Le bit <tt>M</tt> s'il vaut 1 indique qu'il y aura d'autres fragments émis.
+
*Le champ <tt>identification</tt> permet de repérer les fragments appartenant à un même paquet initial. Il est différent pour chaque paquet et recopié dans ses fragments.
+
*Le bit <tt>DF</tt> (''don't fragment'') n'est plus nécessaire puisque, si un paquet est trop grand, il y aura rejet du paquet par le routeur.
+
 
+
Dans IPv4, la valeur d'une option était codée de manière à indiquer au routeur effectuant la fragmentation si elle devait être copiée dans les fragments. Dans IPv6, l'en-tête et les extensions qui concernent les routeurs intermédiaires (pour l'instant proche-en-proche, routage par la source) sont recopiées dans chaque fragment.
+
  
== Sécurité ==
+
SCTP permet une transition douce d'IPv4 vers IPv6 puisque l'application n'a plus à se préoccuper de la gestion des adresses. Si les deux entités possèdent une adresse IPv6, celle-ci sera privilégiée. De plus, SCTP peut servir de brique de base à la gestion de la multi-domiciliation IPv6. En effet, avec TCP une connexion est identifiée par ses adresses. Si une adresse n'est plus accessible, le fait d'en changer peut conduire à la coupure de la connexion. Il faut avoir recours à des superfuges, comme la mobilité IP pour maintenir la connexion. SCTP brise ce lien entre la localisation de l'équipement et l'identification des associations.
Deux extensions de sécurité -- les extensions d'authentification AH (''Authentication Header'') et de confidentialité ESP (''Encapsulating Security Payload'') -- sont définies par l'IETF. Elles permettent de protéger les communications passées sur les réseaux IPv6 mais aussi IPv4 en assurant les services de confidentialité, authentification, intégrité et détection de rejeux. Le chapite [[Sécurité]], RFC 2402 donne une description détaillée de ces extensions, et présente les modes de protection existants.
+
{{Suivi|Table_des_matières|Début du chapitre|Format du message ICMPv6|Format du message ICMPv6}}

Revision as of 20:42, 23 June 2015

Début du chapitre Table des matières Format du message ICMPv6

Hormis la modification de la taille des adresses, ce qui conduit à une taille d'en-tête de 40 octets (le double de l'en-tête IPv4 sans les options), le protocole IP a subi un toilettage reprenant l'expérience acquise au fil des ans avec IPv4. Le format des en-têtes IPv6 est simplifié et permet aux routeurs de meilleures performances dans leurs traitements :

  • L'en-tête ne contient plus le champ checksum, qui devait être ajusté par chaque routeur en raison 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 checksum de bout en bout incluant un pseudo-en-tête qui prend en compte les adresses source et destination. Le checksum d'UDP, facultatif pour IPv4, devient ainsi obligatoire. Pour ICMPv6, le checksum intègre le pseudo-en-tête, alors que pour ICMPv4, il ne portait que sur le message ICMP.
  • La taille des en-têtes est fixe. Le routeur peut facilement déterminer où commence la zone de données utiles.
  • Les options ont été retirées de l'en-tête et remplacées par de nouveaux en-têtes appelés extensions qui peuvent être facilement ignorées par les routeurs intermédiaires.
  • Les champs sont alignés sur des mots de 64 bits, ce qui optimise leur traitement, surtout avec les nouvelles architectures à 64 bits.
  • La taille minimale des MTU : Maximum Transmission Unit est de 1 280 octets. Le choix de 1 280 comme MTU minimal en IPv6 permet le tunnelage de paquets IPv6. En effet, la taille de 1 500 octets est généralement admise car elle correspond à la valeur imposée par Ethernet. La majorité des autres réseaux offrent une taille supérieure. Pour les réseaux ne le permettant pas, une couche d'adaptation (comme avec les couches d'adaptation AAL d'ATM) ou 6LoWPAN avec les réseaux de capteurs (comme IEEE 802.15.4) devra être mise en oeuvre pour pouvoir transporter les paquets IPv6.
  • La fonction de fragmentation a été retirée des routeurs. Les champs 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 (voir Fragmentation).

L'idée est de retirer du cœur de réseau les traitements compliqués. Les routeurs ne font que forwarder les paquets vers la destination, les autres traitements (fragmentation, ...) seront fait par l'émetteur du paquet.


Le format d'en-tête d'un paquet IPv6 est donné par le RFC 2460 (cf. Format d'un datagramme IPv6).

Format d'un datagramme IPv6
Figure : Format d'un datagramme IPv6

Version 
Le champ version est le seul champ qui occupe la même place dans le paquet IPv6 et dans le paquet IPv4. Sa valeur est 6.
Classe de trafic 
Le premier mot de 32 bits étant exclu du calcul du checksum avec les pseudo-en-têtes, il est plus facile de le faire évoluer. 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 aussi appelé dans les paquets IPv4 octet DiffServ (DS), il prend la place du champ ToS, initialement défini dans la spécification d'IPv4 (cf. figure Format de l'octet classe de trafic). Le champ DS est découpé en deux parties. Le sous-champ DSCP (DiffServ Code Point) contient les valeurs des différents comportements. Les deux derniers bits du champ sont actuellement non utilisés, mais devraient servir aux routeurs pour indiquer un risque de congestion en combinaison avec l'algorithme RED (Random Early Detection).

Format de l'octet classe de trafic
Figure : Format de l'octet classe de trafic

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 seront 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 service soit efficace, il faut offrir des tarifications différentes pour chacune des classes et des mécanismes de contrôle pour vérifier qu'un utilisateur n'utilise pas que les classes les plus élevées ou qu'il dépasse son contrat.
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 de service haute arrive à destination, mais la probabilité est plus importante. L'autre intérêt des classes de service 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 le paquets en fonction de paramètres locaux (trafic du directeur de la société, flux multimédia interactif,...). 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 de son 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 l'instant deux types de comportement sont standardisés :
  • Assured Forwarding : Ce comportement définit quatre classes de services 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.
  • Explicit Forwarding : Ce comportement est comparable à un circuit à débit constant établi 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. En particulier, la valeur 0xE0 correspond à 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.
Identificateur de flux 
Ce champ contient un numéro unique choisi par la source, qui a pour but de faciliter le travail des routeurs et la mise en oeuvre des fonctions de qualité de service comme RSVP. Cet indicateur peut être considéré comme une marque à un contexte dans le routeur. Le routeur peut alors faire un traitement particulier : choix d'une route, traitement en "temps-réel" de l'information.
Avec IPv4, certains routeurs, pour optimiser le traitement, se basent sur les valeurs des champs adresses de la source et de destination, numéros de port de la source et de destination et protocole pour construire un contexte. Ce contexte sert à router plus rapidement les paquets puisqu'il évite de consulter les tables de routage pour chaque paquet. 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. 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.
L'utilisation de ce champ a été rendue confuse car Cisco dans le cadre du Tag Switching a proposé de l'utiliser pour augmenter la vitesse de commutation des paquets. Cette proposition consiste à ne garantir l'unicité de l'identificateur de flux que sur un lien. Le routeur possède dans sa mémoire une table de correspondance qui permet, en fonction du lien d'arrivée et du numéro d'identificateur de flux, de déterminer le lien de sortie et la nouvelle valeur de l'identificateur. Cette proposition se rapproche énormément des techniques utilisées dans les circuits virtuels (ATM, Frame Relay, X.25,...).
Le groupe de travail MPLS (Multi Protocol Label Switching) a intégré les travaux sur le Tag Switching et a précisé la manière dont la commutation des paquets pourra être faite. L'identificateur de flux d'IPv6 n'est plus utilisé, mais un en-tête spécifique est introduit entre l'encapsulation de niveau 2 et celle de niveau 3. L'identificateur de flux n'a plus à être modifié en cours de transmission. Cette évolution clarifie l'utilisation du protocole RSVP (Reservation Protocol) qui peut se baser sur cette valeur, identique tout au long du chemin, pour identifier un flux.
En fait, l'utilisation de l'étiquette de flux est très floue, les micro-flux, c'est-à-dire de flux applicatifs, ne sont pas vus dans le coeur du réseau pour des raisons de scalabilité, 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é et son utilisation pourra être mieux spécifiée dans le futur.
Longueur des données utiles (payload) 
Contrairement à IPv4, ce champ, sur deux octets, ne contient que la taille des données utiles, sans prendre en compte la longueur de l'en-tête. Pour des paquets dont la taille des données serait supérieure à 65 535 ce champ vaut 0 et l'option jumbogramme de l'extension de "proche-en-proche" est utilisée (cf. Jumbogramme) (type 194 ou 0xc2, RFC 2675 ). Cette option est utilisée quand le champ longueur des données du paquet IPv6 n'est pas suffisant pour coder la taille du paquet. Cette option est essentiellement prévue pour la transmission à grand débit entre deux équipements. Si l'option jumbogramme est utilisée, le champ longueur des données utiles dans l'en-tête IPv6 vaut 0. Noter que le type commence par la séquence binaire 11, ce qui permet au routeur ne traitant pas les jumbogrammes d'en informer la source. Celle-ci pourra réémettre l'information sans utiliser cette option.).


En-tête suivant 
Ce champ a une fonction similaire au champ protocole du paquet IPv4. Il identifie le prochain en-tête. Il peut s'agir d'un protocole (de niveau supérieur ICMP, UDP, TCP...) ou de la désignation d'extensions (cf. tableau Valeurs du champ en-tête suivant).
Valeurs du champ en-tête suivant
valeur Extension valeur Protocole
0 Proche-en-proche 4 IPv4
43 Routage 6 TCP
44 Fragmentation 17 UDP
50 Confidentialité 41 IPv6
51 Authentification 58 ICMPv6
59 Fin des en-têtes 132 SCTP
60 Destination 136 UDP-lite
135 Mobilité
140 Shim6

Les extensions contiennent aussi ce champ pour permettre un chaînage.

Nombre de sauts 
Il est décrémenté à chaque nœud 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.
Dans IPv4 ce champ est appelé durée de vie (ou TTL Time To Live). Sa vocation initiale est d'indiquer, en secondes, la durée maximale durant laquelle un paquet peut rester dans le réseau. En pratique, les paquets ne restent que quelques millisecondes dans les routeurs, et donc la décrémentation est arrondie à 1. Par contre, pour une liaison plus lente la décrémentation de ce champ peut être supérieure à 1. Dans IPv6, comme il s'agit d'un nombre de sauts, la décrémentation est toujours de 1.
La valeur initiale de ce champ 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 annonce des routeurs (cf. 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.


Justification des extentions

Enchaînement d'extentions
Figure : Enchaînement d'extentions
La figure "Enchaînement d'extentions" montre la souplesse avec laquelles plusieurs extentions peuvent être chaînées. Chaque extention contient dans son en-tête un champ en-tête suivant et longueur. Le premier paquet ne contient pas d'extention, le champ en-tête suivant pointe sur TCP. Le second paquet contient une extention de routage qui pointe sur TCP. Dans le dernier paquet, une extention de fragmentation est ajoutée après celle de routage.

Si cet enchaînement d'extention offre beaucoup plus de souplesse que les options d'IPv4, il rend difficile la lecture des numéros de port, il faut en effet lire tout l'enchaînement d'extention pour arriver au protocole de niveau 4. Ceci a servi de justification au l'identificateur de flux qui permettait de refleter au niveau 3 un flux particulier et évitait de dérouler l'enchaînement. Bien entendu, les pare-feux devront vérifier les numéros de ports.

Les extentions peuvent être vues comme un protocole 3.5 (entre la couche 3 et la couche 4). En effet, à part l'extention de proche-en-proche, qui est traitée par tous les routeurs traversés, les autres extentions ne sont traitées que par le destinataire du paquet (i.e. celui spécifié dans le champ adresse de destination du paquet IPv6).

Si d'un point de vue théorique les extentions sont supérieurs aux options d'IPv4, dans la réalité très peu sont utilisées à grande échelle et restent du domaine de la recherche.

Interaction avec le niveau supérieur

Checksum

Parmi les différences existant entre les datagrammes IPv4 et IPv6, il y a la disparition du checksum dans les en-têtes IP. Cette somme de contrôle était utilisée pour vérifier la validité de l'en-tête du paquet traité. En IPv4, il est nécessaire de la vérifier et de l'ajuster lors de chaque retransmission par un routeur, ce qui entraîne une augmentation du temps de traitement du paquet.

Cette somme ne vérifie que l'en-tête IPv4, pas le reste du paquet. Aujourd'hui les supports physiques sont de meilleure qualité et savent détecter les erreurs (par exemple, Ethernet a toujours calculé sa propre somme de contrôle ; PPP, qui a presque partout remplacé SLIP, possède un CRC). L'intérêt de la somme de contrôle a diminué et ce champ a été supprimé de l'en-tête IPv6.

Figure 4-10 Champ du pseudo-en-tête


Le checksum sur l'en-tête IPv6 n'existant plus, il faut quand même se prémunir des erreurs de transmission. En particulier, une erreur sur l'adresse de destination va faire router un paquet dans une mauvaise direction. Le destinataire doit donc vérifier que les informations d'en-tête IP sont incorrectes pour éliminer ces paquets. Dans les mises en oeuvre des piles de protocoles Internet, les entités de niveau transport remplissent certains champs du niveau réseau. Il a donc été décidé que tous les protocoles au-dessus d'IPv6 devaient utiliser une somme de contrôle intégrant à la fois les données et les informations de l'en-tête IPv6. La notion de pseudo-en-tête dérive de cette conception. Pour un protocole comme TCP qui possède une somme de contrôle, cela signifie modifier le calcul de cette somme. Pour un protocole comme UDP qui possède une somme de contrôle facultative, cela signifie modifier le calcul de cette somme et le rendre obligatoire.

IPv6 a unifié la méthode de calcul des différentes sommes de contrôle. Celle-ci est calculée sur l'ensemble formé de la concaténation d'un pseudo-en-tête (cf. Champ du pseudo-en-tête) et du paquet du protocole concerné. L'algorithme de calcul du checksum est celui utilisé en IPv4. Il est très simple à mettre en œuvre et ne demande pas d'opérations compliquées. Il s'agit de faire la somme en complément à 1 des mots de 16 bits du pseudo-en-tête, de l'en-tête du protocole de transport, et des données, puis de prendre le complément à 1 du résultat.

Il faut noter que les informations contenues dans le pseudo-en-tête ne seront pas émises telles quelles sur le réseau. Le champ "en-tête suivant" du pseudo-en-tête ne reflète pas celui qui sera émis dans les paquets puisque les extensions ne sont pas prises en compte dans le calcul du checksum. Ainsi, si l'extension de routage est mise en œuvre, l'adresse de la destination est celle du dernier équipement. De même le champ longueur est sur 32 bits pour contenir la valeur de l'option jumbogramme, si celle-ci est présente.

UDP et TCP

Les modifications apportées aux protocoles de niveau 4 UDP et TCP sont minimes. L'un des pré-requis à la mise en œuvre d'IPv6 était de laisser en l'état aussi bien TCP (Transmission Control Protocol) qu'UDP (User Datagram Protocol). Ces protocoles de transport sont utilisés par la très grande majorité des applications réseau et l'absence de modification facilitera grandement le passage de IPv4 à IPv6.

La principale modification à ces protocoles concerne le checksum. Comme il a été précisé Checksum au niveau transport, il a été adapté au format de paquet IPv6 et englobe le pseudo-en-tête. De plus, pour UDP, le checksum qui était facultatif en IPv4, devient obligatoire.

Un autre changement au niveau des protocoles de niveau 4 concerne la prise en compte de l'option jumbogramme de l'extension proche-en-proche. Le RFC 2675 définit le comportement de UDP et de TCP quand les jumbogrammes sont utilisés. En effet, les en-têtes de ces messages contiennent eux aussi un champ longueur codé sur 16 bits et par conséquent insuffisant pour coder la longueur du jumbogramme :

  • Pour le protocole UDP, si la longueur des données excède 65 535 octets, le champ longueur est mis à 0. Le récepteur détermine la longueur des données par la connaissance de la taille dans l'option jumbogramme.
  • Le protocole TCP pose plus de problèmes. En effet, bien que les messages TCP ne contiennent pas de champ longueur, plusieurs compteurs sont codés sur 16 bits.
  • Le champ longueur de la fenêtre de réception ne pose pas de problème depuis que le RFC 1323 a défini l'option TCP window scale qui donne le facteur multiplicatif qui doit être appliqué à ce champ.
  • À l'ouverture de connexion, la taille maximale des segments (MSS) est négociée. Le RFC 2675 précise que si cette taille doit être supérieure à 65 535, la valeur 65 535 est envoyée et le récepteur prend en compte la longueur déterminée par l'algorithme de découverte du MTU.
  • Pour l'envoi de données urgentes avec TCP, on utilise un bit spécifique de l'en-tête (bit URG) ainsi que le champ "pointeur urgent". Ce dernier sert à référencer la fin des données à traiter de manière particulière. Trois cas peuvent se présenter :
    • Le premier, qui est identique à IPv4, est celui où le pointeur indique une position de moins de 65 535.
    • Le second se produit lorsque le déplacement est supérieur à 65 535 et supérieur ou égal à la taille des données TCP envoyées. Cette fois-ci, on place la valeur 65 535 dans le champ "pointeur urgent" et on continue le traitement normal des paquets TCP.
    • Le dernier cas intervient quand le pointeur indique un déplacement de plus de 65 535 qui est inférieur à la taille des données TCP. Un premier paquet est alors envoyé, dans lequel on met la valeur 65 535 dans le champ "pointeur urgent". L'important est de choisir une taille de paquet de manière à ce que le déplacement dans le second paquet, pour indiquer la fin des données urgentes, soit inférieur à 65 535.

Il existe d'autres propositions pour faire évoluer TCP. Il faut remarquer que le travail n'est pas de même ampleur que pour IP. En effet, TCP est un protocole de bout-en-bout, la transition vers une nouvelle génération du protocole peut se faire par négociation entre les deux extrémités. Pour IP, tous les routeurs intermédiaires doivent prendre en compte les modifications.

UDP-lite

UDP-lite permet de remonter aux couches supérieures des données erronées pendant leur transport. Si dans un environnement informatique, une erreur peut avoir des conséquences relativement grave quant à l'intégrité des données et il est normal de rejeter ces paquets, or, la plupart des décodeurs de flux multimédias sont capables de supporter un certains nombre d'erreurs binaires dans un flux de données. Pour améliorer la qualité perçue par l'utilisateur, il est donc préférable d'accepter des paquets erronés plutôt que de rejeter un bloc complet d'information.

En IPv4, l'utilisation du checksum UDP étant optionnelle (la valeur 0 indique que le checksum n'est pas calculé), UDP peut être utilisé pour transporter des flux multimédia. Avec IPv6, l'utilisation du checksum a été rendue obligatoire puisque le niveau 3 n'en possède pas. Pour éviter qu'un paquet comportant des erreurs ne puisse pas être remonté aux couche supérieures, le protocole UDP-lite a été défini RFC 3828. Les modifications sont minimes par rapport à UDP. Le format de la trame reste le même, seule la sémantique du champ longueur est changée. Avec UDP, ce champ est inutile puisqu'il est facilement déduit du champ longueur de l'en-tête IP. UDP-lite le transforme en champ couverture du checksum. Si la longueur est 0, UDP-lite considère que tout le checksum couvre tout le paquet. La valeur 8 indique que seul l'en-tête UDP est protégé par le checksum (ainsi qu'une partie de l'en-tête IP grâce au pseudo-header). Les valeurs comprises entre 1 et 7 sont interdites car le checksum UDP-lite doit toujours couvrir l'en-tête. Une valeur supérieure à 8 indique qu'une partie des données sont protégées. Si la couverture est égale à la longueur du message on se retrouve dans un cas compatible avec UDP.

SCTP

Le protocole SCTP (Stream Control Transmission Protocol) RFC 2960 est fortement lié au protocole IPv6. SCTP est un protocole de niveau 4 initialement conçu pour transporter des informations de signalisation. La fiabilité est donc un prérequis important et la gestion de la multi-domiciliation est prise en compte. L'idée est de permettre aux deux équipements terminaux d'échanger à l'initialisation de la connexion (appelée dans le standard association), l'ensemble de leurs adresses IPv4 et IPv6. Chaque équipement choisi une adresse privilégiée pour émettre les données vers l'autre extrémité et surveille périodiquement l'accessibilité des autres adresses. Si l'équipement n'est plus accessible par l'adresse principale, une adresse secondaire sera choisie.

SCTP permet une transition douce d'IPv4 vers IPv6 puisque l'application n'a plus à se préoccuper de la gestion des adresses. Si les deux entités possèdent une adresse IPv6, celle-ci sera privilégiée. De plus, SCTP peut servir de brique de base à la gestion de la multi-domiciliation IPv6. En effet, avec TCP une connexion est identifiée par ses adresses. Si une adresse n'est plus accessible, le fait d'en changer peut conduire à la coupure de la connexion. Il faut avoir recours à des superfuges, comme la mobilité IP pour maintenir la connexion. SCTP brise ce lien entre la localisation de l'équipement et l'identification des associations.

Début du chapitre Table des matières Format du message ICMPv6
Personal tools