{"id":354,"date":"2017-04-25T11:31:29","date_gmt":"2017-04-25T09:31:29","guid":{"rendered":"http:\/\/www.gatoux.com\/?page_id=354"},"modified":"2024-03-02T12:55:34","modified_gmt":"2024-03-02T11:55:34","slug":"la-fragmentation-ip","status":"publish","type":"page","link":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/la-fragmentation-ip\/","title":{"rendered":"La fragmentation IP"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Arriv\u00e9 \u00e0 ce stade du cours, vous commencez \u00e0 \u00eatre tr\u00e8s instruits ! Vous savez :<\/p>\n<ul>\n<li><strong>qu&rsquo;IP est un protocole de niveau 3<\/strong> qui est donc encapsul\u00e9 dans un protocole de niveau 2 (voir le chapitre 4 du mod\u00e8le OSI)<\/li>\n<li><strong>qu&rsquo;IP est con\u00e7u pour fonctionner sur divers types de r\u00e9seaux physiques<\/strong> (Liaisons Lou\u00e9es, R\u00e9seaux locaux Ethernet, Token Ring, FDDI voir m\u00eame liaisons satellites)<\/li>\n<li><strong>que chaque r\u00e9seau physique impl\u00e9mente un protocole de niveau 2 <\/strong>qui lui est propre (MAC Ethernet, MAC Token Ring, HDLC pour les liaisons lou\u00e9es, etc.). Si vous n&rsquo;en \u00eates plus convaincu, rendez vous aux chapitre 4 et chapitre 7 du cours sur le mod\u00e8le OSI.<\/li>\n<\/ul>\n<p>Que se passe-t-il quand un paquet IP est rout\u00e9 \u00e0 travers plusieurs r\u00e9seaux de types diff\u00e9rents ? Il est encapsul\u00e9 dans diverses couches de niveaux 2 successives. Mais ces couches peuvent mettre en oeuvre des protocoles de niveau 2 diff\u00e9rents, si les r\u00e9seaux physiques sont diff\u00e9rents. Par exemple, en passant d&rsquo;un LAN Ethernet \u00e0 un LAN Token Ring vous changez de protocole de niveau 2. L&rsquo;un utilise le MAC Ethernet et l&rsquo;autre le MAC Token Ring, qui sont totalement diff\u00e9rents.<\/p>\n<p>Si ces protocoles sont diff\u00e9rents, leurs caract\u00e9ristiques le sont \u00e9galement (<em>la palisse !<\/em>). Une des caract\u00e9ristiques qui risque fort de diff\u00e9rer et qui nous int\u00e9resse ici est <strong>la taille de la MTU<\/strong> !<\/p>\n<p>Qu&rsquo;est-ce donc encore que ce truc ? La <strong>MTU<\/strong>, pour <strong>M<\/strong>aximum <strong>T<\/strong>ransmission <strong>U<\/strong>nit est la taille du champ information de la trame. C&rsquo;est \u00e0 dire la taille du champ o\u00f9 l&rsquo;on va placer le paquet IP ! Vous voyez o\u00f9 je veux en venir ?<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-148 alignleft\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/S1P5I3.gif\" alt=\"\" width=\"353\" height=\"212\" \/><\/p>\n<p>Si au cours du transfert du paquet IP une passerelle doit le r\u00e9-encapsuler dans une trame ayant un champ information plus petit que la taille du paquet IP, elle va devoir sortir la presse ou la tron\u00e7onneuse !<\/p>\n<p>IP n&rsquo;a pas choisi la presse, il pr\u00e9f\u00e8re la tron\u00e7onneuse ! Mais rassurez-vous, il est respectueux de vos paquets de donn\u00e9es ch\u00e9ris ! Il fait \u00e7a bien, sans effusions de sang inutiles ! C&rsquo;est propre, net et sans cicatrice !<\/p>\n<p>IP a donc pr\u00e9vu un m\u00e9canisme de fragmentation qui lui permet de d\u00e9couper un paquet en plusieurs fragments, puis lui permet de reconstituer le paquet original \u00e0 l&rsquo;arriv\u00e9e !<\/p>\n<h2>IP : un protocole en mode non connect\u00e9 !<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-242 alignleft\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/NOCIRCUIT.gif\" alt=\"\" width=\"414\" height=\"238\" \/>Mais avant d&rsquo;\u00e9tudier la m\u00e9thode de fragmentation, il faut se rappeler un point important : <strong>IP est un protocole de niveau 3 en mode non connect\u00e9<\/strong>. Je vous invite \u00e0 r\u00e9viser cette notion dans le chapitre 8 du cours OSI.<\/p>\n<p>Un protocole non connect\u00e9, comme son nom l&rsquo;indique, n&rsquo;\u00e9tabli pas de connexion avec son correspondant avant d&rsquo;entamer un transfert de donn\u00e9es. Le chemin parcouru par les donn\u00e9es dans le r\u00e9seau n&rsquo;est donc pas pr\u00e9alablement fix\u00e9 ! Pire ! <strong>Ce chemin peut varier d&rsquo;un paquet \u00e0 l&rsquo;autre !<\/strong><\/p>\n<p>A chaque chemin correspond un d\u00e9lai d&rsquo;acheminement qui lui est propre. Celui-ci est fonction du nombre de passerelles \u00e0 traverser, des d\u00e9bits et de la charge des liaisons, des d\u00e9lais de transit sur ces liaisons (<em>surtout sensible dans le cas des liaisons satellites 2*36 000 Km = 72 000 Km de long. Vous savez que l&rsquo;altitude d&rsquo;un satellite g\u00e9o-stationnaire est de 36 000 Km n&rsquo;est ce pas ?<\/em>).<\/p>\n<p>En cons\u00e9quence, il est possible qu&rsquo;un paquet IP \u00e9mis apr\u00e8s un autre, arrive \u00e0 destination avant l&rsquo;autre (je vous accorde que ce n&rsquo;est pas souvent, mais \u00e7a peut arriver !). On dit qu&rsquo;en mode non connect\u00e9 le s\u00e9quencement des paquets en r\u00e9ception n&rsquo;est pas garanti identique au s\u00e9quencement des paquets \u00e0 l&rsquo;\u00e9mission. En v\u00e9rit\u00e9, comme on aime pas les phrases longues on dit : <strong>il n&rsquo;y a pas de garantie du s\u00e9quencement<\/strong> ! (<em>c&rsquo;est plus court non ?<\/em>).<\/p>\n<p>Retenez-bien cette contrainte ! Parce que dans le cas de la fragmentation, c&rsquo;est loin de nous simplifier la vie !<\/p>\n<h2>Fragmentation et en-t\u00eate IP<\/h2>\n<p>Rappelez-vous le format du paquet IP (<em>je sais &#8230; C&rsquo;est loin d\u00e9j\u00e0 !<\/em>). Les octets 5 \u00e0 8 de l&rsquo;ent\u00eate se nomment <strong>Identificateur<\/strong>, <strong>Flag<\/strong> et <strong>Fragment Offset<\/strong>. Nous avions dit que ces octets \u00e9taient r\u00e9serv\u00e9s \u00e0 la fragmentation (<em>ou segmentation, comme vous voulez !<\/em>).<\/p>\n<p>Expliquons un peu mieux \u00e0 quoi servent ces octets :<\/p>\n<ul>\n<li><strong>le champ Identificateur<\/strong> (2 octets) : c&rsquo;est un <strong>num\u00e9ro d&rsquo;identification<\/strong> inscrit par l&rsquo;\u00e9metteur du paquet. Tous paquets \u00e9mis par une m\u00eame machine \u00e0 l&rsquo;attention d&rsquo;un m\u00eame destinataire porte un num\u00e9ro d&rsquo;identification diff\u00e9rent. En cas de fragmentation, ce num\u00e9ro d&rsquo;identification est recopi\u00e9 dans tous les fragments du paquet d&rsquo;origine. Ceci permettra au destinataire de rep\u00e9rer tous les fragments d&rsquo;un m\u00eame paquet et de reconstituer le paquet d&rsquo;origine.<\/li>\n<li><strong>le champ Flag <\/strong>(3 bits) : il permet de <strong>g\u00e9rer la fragmentation<\/strong> :\n<ul>\n<li><strong>bit 0<\/strong>: <strong>r\u00e9serv\u00e9<\/strong> &#8211; toujours positionn\u00e9 \u00e0 0<\/li>\n<li><strong>bit 1<\/strong> : dit <strong>bit DF<\/strong> (<strong>D<\/strong>on&rsquo;t <strong>F<\/strong>ragment) &#8211; S&rsquo;il est positionn\u00e9 \u00e0 0, la fragmentation est autoris\u00e9e &#8211; S&rsquo;il est positionn\u00e9 \u00e0 1 la fragmentation est interdite. Dans ce dernier cas, si le paquet est trop volumineux pour \u00eatre encapsul\u00e9 dans une trame, dont le MTU est inf\u00e9rieur \u00e0 la taille du paquet, la passerelle qui devrait r\u00e9aliser la fragmentation retournera \u00e0 l&rsquo;\u00e9metteur du paquet un ICMP \u00ab\u00a0Paquet non fragmentable\u00a0\u00bb.<\/li>\n<li><strong>bit 2<\/strong> : dit bit <strong>MF <\/strong>(<strong>M<\/strong>ore <strong>F<\/strong>ragment) &#8211; S&rsquo;il est positionn\u00e9 \u00e0 0 il indique que le paquet re\u00e7u est le dernier du paquet d&rsquo;origine. S&rsquo;il est positionn\u00e9 \u00e0 1, il indique que le paquet re\u00e7u est un fragment du paquet d&rsquo;origine mais pas le dernier fragment. Un paquet qui n&rsquo;a pas \u00e9t\u00e9 fragment\u00e9 aura donc toujours ce bit \u00e0 0.<\/li>\n<\/ul>\n<\/li>\n<li><strong>le champ Fragment Offset<\/strong> : indique la position du premier octet de donn\u00e9es du paquet re\u00e7u dans la partie donn\u00e9e du paquet d&rsquo;origine. Le premier fragment \u00e0 donc toujours la valeur 0 (position du premier octet), de m\u00eame que tous paquets non fragment\u00e9s.<\/li>\n<\/ul>\n<p>Cela vous para\u00eet un peu n\u00e9buleux ? Pas clair ? La d\u00e9monstration par l&rsquo;exemple sera sans doute plus efficace !<\/p>\n<h2>Comment \u00e7a marche ?<\/h2>\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" align=\"center\" bgcolor=\"#ff0000\">\n<tbody>\n<tr>\n<td align=\"center\">\n<h6 align=\"center\"><span style=\"color: #ffcc00; font-size: small;\">ATTENTION !<\/span><\/h6>\n<p><span style=\"color: #ffffff;\">L&rsquo;offset est en r\u00e9alit\u00e9 calcul\u00e9 en mot de 20 octets et non pas \u00e0 l&rsquo;octet pr\u00eat ! Pour des raisons de simplification j&rsquo;ai ci-dessous consid\u00e9r\u00e9 que l&rsquo;on pouvait tron\u00e7onner par paquet de 1000 octets et que l&rsquo;offset serait de 0, 1000, 2000, etc. alors que l&rsquo;offset serait de 0, 50, 100, etc. La logique ci-dessous est donc correcte mais fausse dans ses valeurs d&rsquo;offset. A vous de corriger pour vous entra\u00eener !<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Supposons que deux stations, A et B, \u00e9mettent des paquets vers un serveur S. Les paquets transitent \u00e0 travers un r\u00e9seau dans lequel il est n\u00e9cessaire de fragmenter les paquets d&rsquo;origine qui sont trop volumineux pour passer sur un des supports du r\u00e9seau. Imaginons que les paquets de d\u00e9parts ont une taille de 4024 octets (<em>4000 octets de donn\u00e9es et 24 octets d&rsquo;ent\u00eate IP<\/em>). Dans le r\u00e9seau une MTU d&rsquo;un support est limit\u00e9e \u00e0 1024 octets !<\/p>\n<p>La station A \u00e9met deux paquets \u00e0 la suite pour S et la station B n&rsquo;en \u00e9met qu&rsquo;un ! Enfin, pour faire simple, apr\u00e8s l&rsquo;endroit de fragmentation dans le r\u00e9seau, le s\u00e9quencement des paquets n&rsquo;est pas respect\u00e9 suite \u00e0 une reconfiguration automatique du routage. Cela a eu pour effet d&rsquo;envoyer les premiers paquets sur une route charg\u00e9e alors que les paquets suivants ont emprunt\u00e9 une route non charg\u00e9e. En cons\u00e9quence les paquets arrivent dans le d\u00e9sordre au serveur !<\/p>\n<p><strong>Question<\/strong> : Combien de fragment vont \u00eatre g\u00e9n\u00e9r\u00e9 par paquet de 4 000 octets \u00e9mis ?<\/p>\n<p style=\"padding-left: 30px;\"><strong>R\u00e9ponse<\/strong> : Chaque fragment ne peut d\u00e9passer 1024 octets dont 24 octets d&rsquo;en-t\u00eate, il v\u00e9hiculera donc 1 000 octets utiles. Comme le paquet d&rsquo;origine fait 4024 octets dont 24 octets d&rsquo;ent\u00eate, il a 4 000 octets utiles. Il faut donc 4000\/1000 fragments soit 4 fragments par paquet de 4024 octets. Comme il y a trois paquets \u00e9mis au total par A et B, le serveur recevra 12 paquets !<\/p>\n<p><strong><span style=\"color: #ff0000;\">Emission de A<\/span><\/strong> :<\/p>\n<p style=\"padding-left: 30px;\">A envoie son premier paquet <strong>PA1 <\/strong>vers <strong>S<\/strong>. Ce paquet fait 4024 octets, \u00e0 l&rsquo;adresse IP source <strong>@IPA<\/strong> et l&rsquo;adresse destination <strong>@IPS<\/strong> du serveur. Le paquet n&rsquo;est pas fragment\u00e9, c&rsquo;est le paquet originel donc <strong>MF(PA1) = 0<\/strong> et <strong>Offset(PA1) = 0<\/strong>. Un num\u00e9ro d&rsquo;identification est fix\u00e9 <strong>ID(PA1) = 1000<\/strong>. La fragmentation est autoris\u00e9e donc <strong>DF(PA1) = 0<\/strong>.<\/p>\n<p style=\"padding-left: 30px;\">Puis imm\u00e9diatement \u00e0 la suite <strong>A<\/strong> envoie son deuxi\u00e8me paquet <strong>PA2<\/strong> vers <strong>S<\/strong>. Ce paquet fait 4024 octets, \u00e0 l&rsquo;adresse IP source <strong>@IPA<\/strong> et l&rsquo;adresse destination <strong>@IPS<\/strong> du serveur. Le paquet n&rsquo;est pas fragment\u00e9, c&rsquo;est le paquet originel donc <strong>MF(PA2) = 0<\/strong> et <strong>Offset(PA2) = 0<\/strong>. Le num\u00e9ro d&rsquo;identification est incr\u00e9ment\u00e9 car c&rsquo;est le deuxi\u00e8me paquet \u00e0 destination de S, il est fix\u00e9 \u00e0 <strong>ID(PA2) = 1001<\/strong>. La fragmentation est autoris\u00e9e donc <strong>DF(PA2) = 0.<\/strong><\/p>\n<p><span style=\"color: #ff0000;\"><strong>Emission de B<\/strong> <\/span>:<\/p>\n<p style=\"padding-left: 30px;\">Juste apr\u00e8s que A est envoy\u00e9 son premier paquet, et avant que A n&rsquo;envoie son deuxi\u00e8me paquet, <strong>B \u00e9met son propre paquet<\/strong>. Elle \u00e9met <strong>PB1<\/strong> vers <strong>S<\/strong>. Ce paquet fait 4024 octets, \u00e0 l&rsquo;adresse IP source <strong>@IPB<\/strong> et l&rsquo;adresse destination <strong>@IPS<\/strong> du serveur. Le paquet n&rsquo;est pas fragment\u00e9, c&rsquo;est le paquet originel donc <strong>MF(PB1) = 0<\/strong> et <strong>Offset(PB1) = 0<\/strong>. Un num\u00e9ro d&rsquo;identification est fix\u00e9 <strong>ID(PB1) = 1000<\/strong> (<em>Je fais expr\u00e8s de prendre le m\u00eame que A, bien que les chances que cela se produise sont tr\u00e8s faibles, pour vous montrer que c&rsquo;est pas grave !<\/em>). La fragmentation est autoris\u00e9e donc <strong>DF(PB1) = 0.<\/strong><\/p>\n<p>Dans le r\u00e9seau <span style=\"color: #ff0000;\"><strong>une passerelle re\u00e7oit les paquets<\/strong> <\/span>dans l&rsquo;ordre <strong>PA1<\/strong>, <strong>PB1<\/strong>, <strong>PA2<\/strong>, elle doit les fragmenter :<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #ff0000;\">Fragmentation de PA1 :<\/span><\/strong><\/p>\n<ul dir=\"ltr\">\n<li style=\"list-style-type: none;\">\n<ul>\n<li>La passerelle tron\u00e7onne la partie Data du paquet re\u00e7u en 4 paquets de 1000 octets (<em>dingue \u00e7a ! Ca tombre juste ! Trop fort !<\/em>).<\/li>\n<li>Puis elle envoie le <strong>premier fragment<\/strong> <strong>F1PA1<\/strong> avec adresse source <strong>@IPA<\/strong> et adresse destination <strong>@IPS<\/strong>. Le bit <strong>DF(F1PA1) = 0<\/strong>, il est toujours recopi\u00e9 \u00e0 sa valeur d&rsquo;origine. Le bit <strong>MF(F1PA1) = 1<\/strong>, car le premier fragment n&rsquo;est pas le dernier (<em>sans blague ?<\/em>) du paquet d&rsquo;origine. Elle recopie la valeur de l&rsquo;ID du paquet d&rsquo;origine soit <strong>ID(F1PA1) = 1000<\/strong>. Puis elle positionne \u00e0 0 l&rsquo;offset car c&rsquo;est bien la position du premier octet de donn\u00e9es du fragment dans le paquet d&rsquo;origine, <strong>Offset(F1PA1) = 0<\/strong>.<\/li>\n<li>La passerelle \u00e9met ensuite le <strong>deuxi\u00e8me fragment F2PA1<\/strong> avec les m\u00eames caract\u00e9ristiques que le premier fragment F1PA1, sauf l&rsquo;Offset(F2PA1) \u00e9gal \u00e0 l&rsquo;Offset(F1PA1) + nombre d&rsquo;octets utiles v\u00e9hicul\u00e9s par F1PA1. Soit <strong>Offset(F2PA1) = Offset(F1PA1) + 1000 = 0 + 1000 = 1000<\/strong>.<\/li>\n<li>La passerelle \u00e9met le <strong>troisi\u00e8me fragment<\/strong> sur les m\u00eame caract\u00e9ristiques que les deux premiers avec seulement l&rsquo;Offset(F3PA1) qui diff\u00e9re. <strong>Offset(F3PA1) = 2000 (Offset(F2PA1) + 1000)<\/strong>.<\/li>\n<li>Enfin elle \u00e9met le <strong>dernier fragment F4PA1<\/strong> du paquet PA1. Celui est \u00e9galement identique aux pr\u00e9c\u00e9dents hormis : <strong>l&rsquo;Offset(F4PA1) = 3000 (Offset(F3PA1) + 1000) et <\/strong>le bit <strong>MF(F4PA1) = 0<\/strong>. En effet F4PA1 est le dernier fragment du paquet d&rsquo;origine, le bit MF est donc positionn\u00e9 \u00e0 0.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #ff0000;\">Fragmentation de PA2<\/span><\/strong>, le principe est le m\u00eame que pour PA1 :<\/p>\n<ul dir=\"ltr\">\n<li style=\"list-style-type: none;\">\n<ul>\n<li>F1PA2 : IPsource = @IPA &#8211; IPdest. = @IPS &#8211; DF = 0 &#8211; MF = 1 &#8211; ID = 1001 &#8211; Offset = 0<\/li>\n<li>F2PA2 : IPsource = @IPA &#8211; IPdest. = @IPS &#8211; DF = 0 &#8211; MF = 1 &#8211; ID = 1001 &#8211; Offset = 1000<\/li>\n<li>F3PA2 : IPsource = @IPA &#8211; IPdest. = @IPS &#8211; DF = 0 &#8211; MF = 1 &#8211; ID = 1001 &#8211; Offset = 2000<\/li>\n<li>F4PA2 : IPsource = @IPA &#8211; IPdest. = @IPS &#8211; DF = 0 &#8211; MF = 0 &#8211; ID = 1001 &#8211; Offset = 3000<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #ff0000;\">Fragmentation de PB1<\/span><\/strong>, c&rsquo;est le m\u00eame m\u00e9canisme ! Je vous laisse faire ?<\/p>\n<p>Il y a donc 12 fragments \u00e9mis par la passerelle vers le serveur S. Sur le chemin, entre la passerelle et le serveur, une reconfiguration dynamique du routage a lieu apr\u00e8s le passage de F1PA1 \u00e0 F2PA2. Les fragments F3PA2 a F3PB1 sont \u00e9mis sur une route diff\u00e9rente, plus rapide. Le serveur re\u00e7oit donc dans l&rsquo;ordre : F3PA2, F4PA2, F1PB1 \u00e0 F4PB1 puis F1PA1 \u00e0 F2PA2. Le quart\u00e9 dans le d\u00e9sordre !<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #ff0000;\">R\u00e9assemblage des paquets par le serveur :<\/span><\/strong><\/p>\n<p style=\"padding-left: 60px;\">Toute machine IP maintien des buffers m\u00e9moire dans lesquels elle stocke les paquets en attente de r\u00e9assemblage. La zone m\u00e9moire allou\u00e9e a une taille d\u00e9finie par la taille du paquet. Cette taille varie en fonction des fragments qui arrivent au fil de l&rsquo;eau. Le d\u00e9but de la zone est marqu\u00e9 par le premier fragment, la fin de zone par le dernier fragment. <strong>Il y a une zone m\u00e9moire par couple ID-@SourceIP<\/strong>.<\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #ff0000;\"><strong>IMPORTANT<\/strong> <\/span>: <strong>La m\u00e9thode de gestion de l&rsquo;allocation m\u00e9moire pr\u00e9sent\u00e9e ici est une supposition<\/strong>. Il n&rsquo;existe, \u00e0 ma connaissance, pas de description normalis\u00e9e de ces op\u00e9rations. En cons\u00e9quence cette m\u00e9thode peut diff\u00e9rer d&rsquo;une impl\u00e9mentation IP \u00e0 une autre. Quelle qu&rsquo;elle soit pr\u00e9cis\u00e9ment, le principe est bien de stocker les fragments en tampon, jusqu&rsquo;\u00e0 reconstitution compl\u00e9te du paquet originel.<\/p>\n<p style=\"padding-left: 60px;\"><strong>Logique appliqu\u00e9e :<\/strong><\/p>\n<p style=\"padding-left: 60px;\">Lorsque le serveur re\u00e7oit un paquet, il examine l&rsquo;adresse source (on suppose que l&rsquo;adresse destination a d\u00e9j\u00e0 \u00e9t\u00e9 valid\u00e9e), l&rsquo;ID, l&rsquo;offset et le bit MF :<\/p>\n<ul>\n<li>si <strong>MF = 0<\/strong> et <strong>Offset = 0<\/strong> : <strong>ce n&rsquo;est pas un fragment, c&rsquo;est un paquet originel<\/strong>. Le serveur place ce paquet sur la file d&rsquo;attente du protocole sup\u00e9rieur v\u00e9hicul\u00e9 par le paquet. Ce protocole est indiqu\u00e9 dans le champ Protocole de l&rsquo;ent\u00eate IP.<\/li>\n<li>si <strong>MF = 0<\/strong> et <strong>Offset &lt;&gt; 0<\/strong>, <strong>le paquet est le dernier fragment d&rsquo;un paquet originel<\/strong>. Le serveur examine le couple ID-@SourceIP du fragment :\n<ul>\n<li>s&rsquo;il a d\u00e9j\u00e0 en buffer une zone m\u00e9moire pour ce couple, il place le paquet en fin de file de buffer.<\/li>\n<li>s&rsquo;il n&rsquo;a pas de couple ID-@IPsource identique en buffer, il cr\u00e9e une zone m\u00e9moire en buffer et place le paquet en fin de file.<\/li>\n<\/ul>\n<\/li>\n<li>si <strong>MF = 1<\/strong> et <strong>Offset = 0<\/strong>, <strong>le paquet est le premier fragment d&rsquo;un paquet originel<\/strong>. Le serveur examine le couple ID-@SourceIP :\n<ul>\n<li>s&rsquo;il a d\u00e9j\u00e0 en buffer une zone m\u00e9moire pour ce couple, il place le paquet en d\u00e9but de file de buffer.<\/li>\n<li>s&rsquo;il n&rsquo;a pas de couple ID-@IPsource identique en buffer, il cr\u00e9e une zone m\u00e9moire en buffer et place le paquet en d\u00e9but de file.<\/li>\n<\/ul>\n<\/li>\n<li>si <strong>MF = 1<\/strong> et <strong>Offset &lt;&gt; 0<\/strong>, <strong>le paquet est un des fragments d&rsquo;un paquet originel<\/strong>. Le serveur examine le couple ID-@SourceIP du fragment :\n<ul>\n<li>s&rsquo;il a d\u00e9j\u00e0 en buffer une zone m\u00e9moire pour ce couple, il place le paquet \u00e0 l&rsquo;offset indiqu\u00e9 dans le buffer, en d\u00e9calant \u00e9ventuellement la zone m\u00e9moire des fragments suivants d\u00e9j\u00e0 en place.<\/li>\n<li>s&rsquo;il n&rsquo;a pas de couple ID-@IPsource identique en buffer, il cr\u00e9e une zone m\u00e9moire en buffer. Cette zone a la taille de la valeur d&rsquo;offset + la taille du fragment.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"padding-left: 60px;\">Le serveur consid\u00e8re la file d&rsquo;attente compl\u00e8te quand il a plac\u00e9 le premier et le dernier fragment ainsi que tous les fragments interm\u00e9diaires (v\u00e9rification de la valeur d&rsquo;offset + longueur de chaque fragment). Il remonte alors la partie Data au protocole identifi\u00e9 par le champ Protocole de l&rsquo;ent\u00eate IP du paquet originel reconstitu\u00e9.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff0000;\"><strong>S\u00e9quencement de reconstitution des paquets de A et B<\/strong> <\/span>:<\/p>\n<ul>\n<li><strong>R\u00e9ception de F3PA2<\/strong> : MF = 1 &#8211; ID = 1001 &#8211; IPsource = IPA &#8211; Offset = 2000 :\n<ul>\n<li>Zone m\u00e9moire 1001-IPA inexistante -&gt; Cr\u00e9ation d&rsquo;une zone de 2000 + 1000 + 24 octets (ent\u00eate IP) = 3024 octets.<\/li>\n<li>Recopie de l&rsquo;ent\u00eate IP de F3PA2 sur les 24 premiers octets en pla\u00e7ant DF, MF et Offset \u00e0 0. Les autres champs gardent leur valeur.<\/li>\n<li>Placement des donn\u00e9es de F3PA2 \u00e0 l&rsquo;offset 2000.<\/li>\n<\/ul>\n<\/li>\n<li><strong>R\u00e9ception de F4PA2<\/strong> : MF = 0 &#8211; ID = 1001 &#8211; IPsource = IPA &#8211; Offset = 3000 :\n<ul>\n<li>Zone m\u00e9moire 1001-IPA existante -&gt; Extension de la zone m\u00e9moire de 1000 octets \u00e0 partir de l&rsquo;offset 3000.<\/li>\n<li>Placement des donn\u00e9es de F4PA2 \u00e0 l&rsquo;offset 3000.<\/li>\n<\/ul>\n<\/li>\n<li><strong>R\u00e9ception de F1PB1<\/strong> : MF = 1 &#8211; ID = 1000 &#8211; IPsource = IPB &#8211; Offset = 0 :\n<ul>\n<li>Zone m\u00e9moire 1000-IPB inexistante -&gt; Cr\u00e9ation d&rsquo;une zone de 1000 + 24 octets (ent\u00eate IP) = 1024 octets.<\/li>\n<li>Recopie de l&rsquo;ent\u00eate IP de F1PB1 sur les 24 premiers octets en pla\u00e7ant DF, MF et Offset \u00e0 0. Les autres champs gardent leur valeur.<\/li>\n<li>Placement des donn\u00e9es de F1PB1 \u00e0 l&rsquo;offset 0.<\/li>\n<\/ul>\n<\/li>\n<li><strong>R\u00e9ception de F2PB1, F3PB1<\/strong> : <em>Je vous laisse faire<\/em> !<\/li>\n<li><strong>R\u00e9ception de F4PB1<\/strong> : MF = 0 &#8211; ID = 1000 &#8211; IPsource = IPB &#8211; Offset = 3000 :\n<ul>\n<li>Zone m\u00e9moire 1000-IPB existante -&gt; Extension de la zone m\u00e9moire de 1000 octets \u00e0 partir de l&rsquo;offset 3000.<\/li>\n<li>Placement des donn\u00e9es de F4PB1 \u00e0 l&rsquo;offset 3000.<\/li>\n<li>Le paquet est compl\u00e9tement reconstitu\u00e9 -&gt; File d&rsquo;attente du protocole de couche sup\u00e9rieure.<\/li>\n<\/ul>\n<\/li>\n<li><strong>R\u00e9ception de F1PA1 \u00e0 F4PA1<\/strong> : <em>Je vous laisse faire, vous savez comment cela se passe maintenant !<\/em><\/li>\n<li><strong>R\u00e9ception de F1PA2<\/strong> : MF = 1 &#8211; ID = 1001 &#8211; IPsource = IPA &#8211; Offset = 0 :\n<ul>\n<li>Zone m\u00e9moire 1001-IPA existante -&gt; Placement des donn\u00e9es de F1PA2 \u00e0 l&rsquo;offset 0. La zone m\u00e9moire avait \u00e9t\u00e9 dimensionn\u00e9 correstement par l&rsquo;arriv\u00e9e de F3PA2. Il n&rsquo;est pas n\u00e9cessaire de l&rsquo;\u00e9tendre.<\/li>\n<\/ul>\n<\/li>\n<li><strong>R\u00e9ception de F2PA2<\/strong> : <em>Vous \u00eates grand maintenant &#8230; Je vous laisse faire !<\/em><\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Voil\u00e0 ! Tous les paquets ont \u00e9t\u00e9 reconstitu\u00e9s par le serveur ! Vous avez pu remarquer que c&rsquo;\u00e9tait du travail n&rsquo;est-ce-pas ? Pendant que le serveur g\u00e9re ces files il ne fait pas vraiment ce pour quoi il est pay\u00e9 (<em>pas cher, c&rsquo;est vrai !<\/em>).<\/p>\n<p><strong>REMARQUE<\/strong> : Nous ne traitons pas dans ce cours des interactions de ce m\u00e9canisme avec la couche TCP, mais pour information, sachez qu&rsquo;en fait l&rsquo;en-t\u00eate TCP (ou UDP) comportant par exemple les num\u00e9ros de ports sera v\u00e9hicul\u00e9e dans le dernier paquet (MF=0) avec les \u00e9ventuelles donn\u00e9es r\u00e9siduelles.<\/p>\n<h2>Trois remarques sur la fragmentation<\/h2>\n<h3>Si on peut l&rsquo;\u00e9viter, tant mieux !<\/h3>\n<p style=\"padding-left: 30px;\">Il est \u00e9vident qu&rsquo;il \u00e9tait imp\u00e9ratif d&rsquo;inclure un m\u00e9canisme de fragmentation dans le protocole IP, notamment en raison du fait qu&rsquo;il peut \u00eatre v\u00e9hicul\u00e9 dans diff\u00e9rents protocoles de couche 2, ne pr\u00e9sentant pas toujours les m\u00eames MTU. Cependant si on peut \u00e9viter de fragmenter c&rsquo;est pr\u00e9f\u00e9rable. En effet :<\/p>\n<ul>\n<li><strong>les passerelles assurant la fragmentation doivent g\u00e9rer les modifications d&rsquo;ent\u00eate<\/strong> (DF, MF, ID, Offset, etc.) ce qui mobilise du temps CPU qu&rsquo;elles ne passent pas \u00e0 commuter !<\/li>\n<li><strong>les stations destinataires sont oblig\u00e9s de g\u00e9rer le r\u00e9assemblage des paquets<\/strong> ce qui mobilise du temps CPU et de la m\u00e9moire.<\/li>\n<li><strong>si vous perdez un fragment<\/strong> (voir le cas du TTL ci-dessous par exemple), <strong>tout le paquet IP originel est perdu<\/strong> parce qu&rsquo;il n&rsquo;aura pas pu \u00eatre reconstitu\u00e9 compl\u00e9tement. Par contre les ressources r\u00e9seaux et machines auront \u00e9t\u00e9 utilis\u00e9es pour acheminer les autres fragments \u00e0 bon port.<\/li>\n<li>enfin, et l\u00e0 je vous demande me croire sur parole, on peut d\u00e9montrer que dans le cas de l&#8217;emploi d&rsquo;une couche 4 TCP, la <strong>fragmentation IP diminue nettement le rendement du protocole<\/strong> (sous-emploi du fen\u00eatrage). Au point, que certaines impl\u00e9mentations de TCP proc\u00e9de \u00e0 un test avant l&rsquo;\u00e9mission de leurs segments vers le destinataire. TCP recherche la MTU minimum de la route et adapte la taille de ses messages en cons\u00e9quence.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Toutes ses raisons expliquent que l&rsquo;on utilise tr\u00e8s rarement, pour ne pas dire jamais, la taille maximum du paquet IP. La majorit\u00e9 des stacks IP proposent des tailles standards comprises en 128 et 512, voir 1024 octets. La fragmentation est ainsi plus rarement employ\u00e9e et les buffers des stations sont moins sollicit\u00e9s.<\/p>\n<h3>L&rsquo;influence du TTL<\/h3>\n<p style=\"padding-left: 30px;\">Au chapitre 3, dans la description de l&rsquo;ent\u00eate IP, nous avons pr\u00e9sent\u00e9 le champ <strong>TTL<\/strong> (<strong>T<\/strong>ime <strong>T<\/strong>o <strong>L<\/strong>ive). Ce champ, d\u00e9fini sur un octet, permet d&rsquo;indiquer <strong>une dur\u00e9e de vie<\/strong> au datagramme \u00e9mis.<\/p>\n<p style=\"padding-left: 30px;\">En effet, le mode non connect\u00e9, sans contr\u00f4le du s\u00e9quencement, ni reprise sur erreur du protocole IP, induit qu&rsquo;<strong>un paquet peut \u00eatre supprim\u00e9 sans avertir qui que ce soit<\/strong>. Les principes de routage dynamique peuvent \u00e9galement conduire \u00e0 g\u00e9n\u00e9rer des boucles (momentan\u00e9ment, rassurez-vous !) dans le r\u00e9seau. Pour \u00e9viter qu&rsquo;un paquet tourne ind\u00e9finiment dans le r\u00e9seau ou soit conserv\u00e9 en file d&rsquo;attente ind\u00e9finiment, on lui donne une dur\u00e9e de vie par le champ TTL.<\/p>\n<p style=\"padding-left: 30px;\"><strong>A l&rsquo;\u00e9mission le TTL est g\u00e9n\u00e9ralement fix\u00e9 \u00e0 sa valeur maximum, soit 255<\/strong>.<\/p>\n<p style=\"padding-left: 30px;\"><strong>Chaque fois que le paquet va traverser une passerelle, celle-ci d\u00e9cr\u00e9mente le TTL de 1<\/strong>. Donc en th\u00e9orie un paquet IP ne pourra jamais traverser plus de 255 routeurs ! C&rsquo;est d\u00e9j\u00e0 bien suffisant ! Mais s&rsquo;il \u00e9tait n\u00e9cessaire de d\u00e9passer cette limite on pourrait utiliser une astuce nomm\u00e9e : <strong>tunneling<\/strong> (<em>mais ne nous \u00e9loignons pas du sujet ! Je peux pas tout vous dire ! Il faut laisser un peu de travail \u00e0 d&rsquo;autres !<\/em>).<\/p>\n<p style=\"padding-left: 30px;\">Lorsqu&rsquo;une passerelle passe le TTL \u00e0 0, elle d\u00e9truit le paquet et \u00e9ventuellement envoie un paquet <strong>ICMP Time Exceded<\/strong> \u00e0 l&rsquo;\u00e9metteur du paquet pour l&rsquo;informer de sa destruction.<\/p>\n<p style=\"padding-left: 30px;\">Lorsqu&rsquo;une passerelle fragmente un paquet, tous les fragments partent avec la valeur du TTL d&rsquo;arriv\u00e9e (paquet originel) <strong>moins 1<\/strong> !<\/p>\n<p style=\"padding-left: 30px;\">Que se passe-t-il si une station de destination re\u00e7oit 3 fragments sur 4 ? Si le dernier fragment n&rsquo;arrive jamais ? La station conserve-t-elle ind\u00e9finiment les 3 fragments re\u00e7us en zone m\u00e9moire tampon ? Vous imaginez bien que non !! Si cela se produit trop fr\u00e9quemment, elle risque de saturer ses buffers !<\/p>\n<p style=\"padding-left: 30px;\">C&rsquo;est pourquoi la station va continuer de d\u00e9cr\u00e9menter le TTL de l&rsquo;ent\u00eate qu&rsquo;elle a stock\u00e9 en d\u00e9but de zone m\u00e9moire. Cette ent\u00eate est celle du premier fragment re\u00e7u, donc le plus ancien en m\u00e9moire. <strong>Toutes les secondes elle d\u00e9cr\u00e9mente ce TTL<\/strong>. S&rsquo;il atteint la valeur 0 avant que l&rsquo;ensemble du paquet originel ait \u00e9t\u00e9 reconstitu\u00e9, l&rsquo;ensemble de la file m\u00e9moire est effac\u00e9e !<\/p>\n<p style=\"padding-left: 30px;\">La station pourra \u00e9galement retourner un ICMP Time Exceded \u00e0 l&rsquo;\u00e9metteur pour l&rsquo;informer de la destruction de son paquet !<\/p>\n<p style=\"padding-left: 30px;\">Bien s\u00fbr, si le dernier fragment arrive apr\u00e8s la destruction de sa file (\u00e0 la bourre le fragment !), il sera stock\u00e9, comme pr\u00e9c\u00e9demment dans une nouvelle file, en attente des autres fragments, qui n&rsquo;arriveront jamais puisqu&rsquo;ils ont \u00e9t\u00e9 d\u00e9truit ! Mais \u00e0 expiration de son TTL, il sera \u00e9galement d\u00e9truit !<\/p>\n<p style=\"padding-left: 30px;\"><strong>REMARQUE<\/strong> : Le principe de d\u00e9cr\u00e9mentation du TTL toutes les secondes est \u00e9galement appliqu\u00e9e dans les files d&rsquo;attentes des passerelles. Tant qu&rsquo;un paquet IP reste en m\u00e9moire (<em>surcharge du lien de sortie, surcharge CPU, ou autres<\/em>), son TTL est d\u00e9cr\u00e9ment\u00e9. Cependant si vous avez souvent des paquets qui restent bloqu\u00e9s plus d&rsquo;une seconde dans votre routeur, je vous conseille de revoir le dimensionnement de votre r\u00e9seau ! Une seconde de transfert dans une passerelle est un d\u00e9lai intol\u00e9rable ! Les moyennes accept\u00e9es sont plut\u00f4t de 2 milli-secondes !<\/p>\n<h3>Pourquoi est-ce toujours la station de destination qui r\u00e9assemble ?<\/h3>\n<p style=\"padding-left: 30px;\">Tout au long de ce chapitre nous avons constamment \u00e9voqu\u00e9 les op\u00e9rations de r\u00e9assemblage du paquet originel sur la station de destination du paquet. On aurait pu penser que le r\u00e9assemblage aurait \u00e9t\u00e9 effectu\u00e9 par un \u00e9quipement plus proche de la passerelle qui a r\u00e9alis\u00e9 la fragmentation, par exemple son voisin direct ! Pourquoi n&rsquo;est-ce jamais le cas ?<\/p>\n<p style=\"padding-left: 30px;\">Il y a deux bonnes raisons \u00e0 cela :<\/p>\n<ul>\n<li>la premi\u00e8re vraie, bonne raison, est que <strong>vous ne pouvez pas garantir qu&rsquo;une autre passerelle du r\u00e9seau verra passer tous les fragments d&rsquo;un paquet<\/strong> ! Dans notre exemple pr\u00e9c\u00e9dent, supposons qu&rsquo;une passerelle plac\u00e9e sur la route emprunt\u00e9e par F1PA1 \u00e0 F2PA2, apr\u00e8s la passerelle ayant r\u00e9alis\u00e9e la fragmentation, tente de reconstituer les paquets car sa MTU de sortie permet d&rsquo;accueillir des paquets plus gros :\n<ul>\n<li>Elle pourra reconstituer le paquet PA1, puisqu&rsquo;elle voit passer F1PA1 \u00e0 F4PA1.<\/li>\n<li>Mais elle ne pourra pas reconstituer PA2 puisqu&rsquo;elle ne voit passer que F1PA2 et F2PA2, les autres fragments empruntant une autre route !<\/li>\n<li>De plus comment peut-elle conna\u00eetre la taille du paquet originel, pour \u00eatre en mesure d&rsquo;affirmer que son lien de sortie \u00e0 une MTU suffisante au transfert du paquet originel sans le fragmenter ? Elle devrait attendre tous les fragments, pour conna\u00eetre la taille du paquet global, et finalement se rendre compte qu&rsquo;elle va devoir le fragmenter !<\/li>\n<\/ul>\n<\/li>\n<li>la deuxi\u00e8me raison est que m\u00eame si une MTU de sortie peut prendre en charge des plus gros paquets, <strong>la passerelle ne conna\u00eet pas la taille des MTU des autres supports qui constituent le reste de la route<\/strong> ! Elle risque de passer du temps, de consommer des ressources pour r\u00e9assembler un paquet, qui sera peut-\u00eatre de nouveau fragment\u00e9 par la prochaine passerelle !! Pas vraiment rentable tout \u00e7a !<\/li>\n<\/ul>\n<h2>Conclusion du chapitre<\/h2>\n<p>Nous en resterons l\u00e0, pour le chapitre de la fragmentation. Il y a encore sans doute beaucoup \u00e0 dire, mais nous avons \u00e9voqu\u00e9, je pense, l&rsquo;essentiel !<\/p>\n<p>Nous avons jusqu&rsquo;ici d\u00e9crit les m\u00e9canismes majeurs du protocole IP :<\/p>\n<ul>\n<li>l&rsquo;adressage<\/li>\n<li>le routage de base<\/li>\n<li>l&rsquo;interaction avec le niveau 2 des LAN<\/li>\n<li>la fragmentation<\/li>\n<\/ul>\n<p>Dans aucun des chapitres nous n&rsquo;avons \u00e9voqu\u00e9 de contr\u00f4le d&rsquo;erreur (<em>hormis le checksum sur l&rsquo;ent\u00eate<\/em>) ou de reprise sur erreur. Nous savons \u00e9galement qu&rsquo;IP fonctionne en mode non connect\u00e9. En fait <strong>IP est un protocole de niveau 3 dit non fiable ou aussi appel\u00e9 \u00ab\u00a0best effort\u00a0\u00bb<\/strong>. Il fait du mieux qu&rsquo;il peut, mais il peut peu !<\/p>\n<p>Nous avons \u00e9voqu\u00e9 les pertes de paquets mais pas de r\u00e9cup\u00e9ration ! Enfin souvent lorsque des erreurs survenaient nous \u00e9voquions ICMP mais pas IP !<\/p>\n<p>Le chapitre suivant, vous pr\u00e9sente donc succinctement ICMP et certaines de ces fonctions.<\/p>\n<h5 align=\"center\"><a href=\"http:\/\/www.gatoux.com\/index.php\/arp-qui-es-tu\/\">Page Pr\u00e9c\u00e9dente<\/a> | <a href=\"http:\/\/www.gatoux.com\/index.php\/icmp-cest-quoi\/\">Page Suivante<\/a><\/h5>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Arriv\u00e9 \u00e0 ce stade du cours, vous commencez \u00e0 \u00eatre tr\u00e8s instruits ! Vous savez : qu&rsquo;IP est un protocole de niveau 3 qui est donc encapsul\u00e9 dans un protocole de niveau 2 (voir le chapitre 4 du mod\u00e8le OSI) qu&rsquo;IP est con\u00e7u pour fonctionner sur divers types de r\u00e9seaux physiques (Liaisons Lou\u00e9es, R\u00e9seaux\u2026 <span class=\"read-more\"><a href=\"https:\/\/racine.gatoux.com\/lmdr\/index.php\/la-fragmentation-ip\/\">Lire la suite &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":27,"comment_status":"closed","ping_status":"closed","template":"page-templates\/full-width.php","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"class_list":["post-354","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages\/354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/comments?post=354"}],"version-history":[{"count":6,"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages\/354\/revisions"}],"predecessor-version":[{"id":722,"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages\/354\/revisions\/722"}],"wp:attachment":[{"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/media?parent=354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}