{"id":356,"date":"2017-04-25T11:32:05","date_gmt":"2017-04-25T09:32:05","guid":{"rendered":"http:\/\/www.gatoux.com\/?page_id=356"},"modified":"2017-04-26T11:29:39","modified_gmt":"2017-04-26T09:29:39","slug":"icmp-cest-quoi","status":"publish","type":"page","link":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/icmp-cest-quoi\/","title":{"rendered":"ICMP, c&rsquo;est quoi ?"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Nous avons pu remarquer dans les chapitres pr\u00e9c\u00e9dents qu&rsquo;IP \u00e9tait essentiellement ax\u00e9 sur les fonctions d&rsquo;adressage et de routage. Il est configur\u00e9 pour fonctionner comme si aucun probl\u00e8me ne pouvait survenir sur le r\u00e9seau (<em>perte de datagrammes, congestion, probl\u00e8me de routage, etc<\/em>.). Si un probl\u00e8me survient, sa solution est exp\u00e9ditive : <strong>il ne route pas<\/strong> ! Il a tout juste accept\u00e9 de prendre en charge les probl\u00e8mes de fragmentation !<\/p>\n<p>Ce mode de fonctionnement n&rsquo;est pas un probl\u00e8me en soi (<em>il suffit de regarder la notori\u00e9t\u00e9 et l&rsquo;implantation d&rsquo;IP !<\/em>). Mais il est n\u00e9cessaire de pouvoir dans certains cas informer les \u00e9metteurs du devenir de leurs datagrammes.<\/p>\n<p>C&rsquo;est le r\u00f4le d&rsquo;<strong>ICMP<\/strong> (<strong>I<\/strong>nternet <strong>C<\/strong>ontrol <strong>M<\/strong>essage <strong>P<\/strong>rotocol) qui, comme son nom l&rsquo;indique, est un <strong>protocole d&rsquo;information du contr\u00f4le de r\u00e9seau<\/strong>. ICMP ne r\u00e9soud rien, ou du moins pas grand chose, il informe ! Lorsque certains probl\u00e8mes de routage se pr\u00e9sentent, il \u00e9met un message d&rsquo;information \u00e0 l&rsquo;\u00e9metteur du datagramme en p\u00e9ril !<\/p>\n<p>Dans 80% des cas, l&rsquo;\u00e9metteur s&rsquo;en fiche ! Triste monde &#8230;<\/p>\n<p>Ce n&rsquo;est pas tout \u00e0 fait vrai &#8230; La couche IP de l&rsquo;\u00e9metteur s&rsquo;en fiche ! Mais l&rsquo;information pourra \u00e9ventuellement (<em>cela d\u00e9pend des d\u00e9veloppements<\/em>) exploiter ces infos !<\/p>\n<h2>ICMP, v\u00e9hicul\u00e9 dans IP<\/h2>\n<p>Du point de vue d&rsquo;IP, ICMP est un protocole de couche sup\u00e9rieure presque comme les autres. <strong>Les paquets ICMP sont encapsul\u00e9s dans un datagramme IP<\/strong>. Le champ protocole du paquet IP porte la valeur : (01)h dans ce cas.<\/p>\n<p>La diff\u00e9rence r\u00e9side dans le fait qu&rsquo;IP pourra, de lui-m\u00eame, passer une commande \u00e0 ICMP lorsque certains probl\u00e8mes se produisent, sans qu&rsquo;ICMP ait demand\u00e9 quoique ce soit. Ce n&rsquo;est jamais le cas avec les autres protocoles de couches sup\u00e9rieures (TCP ou UDP) avec lesquels IP ne discute que pour \u00e9mettre ou recevoir des donn\u00e9es.<\/p>\n<p>Les formats des paquets ICMP varient selon le type d&rsquo;informations \u00e0 v\u00e9hiculer. Nous ne les pr\u00e9senterons pas ici. Il est plus int\u00e9ressant d&rsquo;\u00e9tudier certaines fonctions et certains m\u00e9canismes li\u00e9s \u00e0 ICMP. Sachez seulement que, dans tous les paquets, il existe un octet d&rsquo;ent\u00eate indiquant \u00e0 quel type de paquet ICMP nous avons \u00e0 faire. Le tableau suivant liste les principaux paquets ICMP utilis\u00e9s :<\/p>\n<table class=\"TAB_GENE\" border=\"1\" align=\"center\">\n<tbody>\n<tr>\n<th valign=\"top\" width=\"21%\">Hexa<\/th>\n<th valign=\"top\" width=\"21%\">D\u00e9c<\/th>\n<th valign=\"top\" width=\"58%\">Message<\/th>\n<\/tr>\n<tr>\n<td width=\"21%\">00<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">0<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Echo response<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">03<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">3<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Destinataire inaccessible<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">04<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">4<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Source quench<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">05<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">5<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Redirection<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">08<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">8<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Echo<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">0B<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">11<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Temps d\u00e9pass\u00e9<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">0C<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">12<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Probl\u00e8me de param\u00e8tre<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">0D<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">13<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Horloge<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">0E<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">14<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Horloge response<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">0F<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">15<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">Demande d&rsquo;information<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">10<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"21%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">16<\/span><\/p>\n<\/td>\n<td class=\"petittexte\" valign=\"top\" width=\"58%\">\n<p align=\"center\"><span style=\"font-family: Arial,Helvetica,sans-serif; font-size: small;\">R\u00e9ponse d&rsquo;information<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Dans la suite de ce chapitre, nous allons \u00e9tudier le r\u00f4le et quelques applications des paquets \u00ab\u00a0<strong>Echo \/ Echo Response<\/strong>\u00ab\u00a0, \u00ab\u00a0<strong>Destination Unreachable<\/strong>\u00ab\u00a0, \u00ab\u00a0<strong>Time Out<\/strong>\u00a0\u00bb et \u00ab\u00a0<strong>Redirect<\/strong>\u00ab\u00a0. Pour les autres paquets, voici une description rapide :<\/p>\n<ul>\n<li><strong>Source quench<\/strong> : permet \u00e0 un \u00e9quipement de r\u00e9seau (g\u00e9n\u00e9ralement une passerelle) de signifier \u00e0 un \u00e9metteur une congestion du r\u00e9seau, afin de solliciter un ralentissement de l&rsquo;\u00e9mission. A noter qu&rsquo;il n&rsquo;existe aucune primitive permettant de relancer l&rsquo;\u00e9mission, l&rsquo;\u00e9metteur temporise l&rsquo;\u00e9mission de ses datagrammes tant qu&rsquo;il re\u00e7oit des indications de congestion. Une bonne impl\u00e9mentation d&rsquo;IP va violemment ralentir son \u00e9mission \u00e0 r\u00e9ception des paquets Source Quench, puis reprendre progressivement.<\/li>\n<li><strong>Probl\u00e8me de param\u00e8tre<\/strong> : est \u00e9mis par un r\u00e9cepteur ou une passerelle \u00e0 l&rsquo;\u00e9metteur d&rsquo;un paquet IP dont l&rsquo;ent\u00eate comporte une erreur rendant impossible l&rsquo;exploitation du paquet. Les erreurs de \u00ab\u00a0checksum\u00a0\u00bb ne sont pas trait\u00e9es car dans de tels cas, l&rsquo;adresse IP de l&rsquo;\u00e9metteur n&rsquo;est pas forc\u00e9ment fiable ! Il s&rsquo;agit en g\u00e9n\u00e9ral d&rsquo;erreurs dans les options. Le paquet ICMP retourn\u00e9 comporte un champ \u00ab\u00a0pointeur\u00a0\u00bb qui indique la partie du datagramme consid\u00e9r\u00e9e en anomalie. Ce paquet sert tr\u00e8s peu, car les options IP sont tr\u00e8s peu employ\u00e9es.<\/li>\n<li><strong>Horloge \/ Horloge Response<\/strong> : Au d\u00e9part ICMP avait \u00e9t\u00e9 con\u00e7u pour permettre le calcul des temps de travers\u00e9e dans le r\u00e9seau (d\u00e9lais de transit), afin de d\u00e9tecter d&rsquo;\u00e9ventuelles baisses de performances. Une autre fonction a ensuite \u00e9t\u00e9 adjointe, permettant de calculer les diff\u00e9rences d&rsquo;horloge entre les machines \u00e9mettrices et r\u00e9ceptrices. Ce paquet comporte des champs T1, T2, T3 et T4 permettant de stocker les instants d&rsquo;\u00e9mission et r\u00e9ception des paquets aller et retour. Il suffit ensuite d&rsquo;additionner et soustraire ces champs pour obtenir le d\u00e9lai de transit. Ces paquets sont peu utilis\u00e9s \u00e0 ma connaissance. En effet pour \u00eatre efficace, ce protocole n\u00e9cessite de synchroniser les bases temps de tous les \u00e9quipements IP d&rsquo;un r\u00e9seau. Cette synchronisation peut \u00eatre r\u00e9alis\u00e9e par un autre protocole nomm\u00e9 <strong>NTP<\/strong> (<strong>N<\/strong>etwork <strong>T<\/strong>ime <strong>P<\/strong>rotocol). Quoiqu&rsquo;il en soit, on peut tr\u00e8s bien calculer les d\u00e9lais de transit autrement que par ces paquets Horloge\/Horloge R\u00e9ponse, en utilisant le \u00ab\u00a0ping\u00a0\u00bb comme nous le verrons ci-apr\u00e8s.<\/li>\n<li><strong>Demande d&rsquo;information \/ R\u00e9ponse d&rsquo;information<\/strong> : le seul cas d&rsquo;utilisation de ces paquets que je connaisse (sans jamais l&rsquo;avoir vu \u00e0 l\u2019\u0153uvre !) est la r\u00e9cup\u00e9ration d&rsquo;adresse r\u00e9seau. Similaire \u00e0 RARP (que nous n&rsquo;avons pas vu, mais qui permet \u00e0 une station de demander son adresse IP \u00e0 partir de son adresse MAC), ces paquets permettent \u00e0 une machine de demander l&rsquo;adresse r\u00e9seau sur lequel elle se trouve. Le paquet ICMP_INF_REQ est \u00e9mis en broadcast et la r\u00e9ponse est fournie par toutes les passerelles du r\u00e9seau dans des paquets ICMP_INF_RESP. Si vous avez d&rsquo;autres exemples, n&rsquo;h\u00e9sitez pas \u00e0 m&rsquo;envoyer un <a href=\"mailto:jean-luc@gatoux.com\" target=\"_self\">mail <\/a>!<\/li>\n<\/ul>\n<h2>Echo \/ Echo Response : Le ping !<\/h2>\n<h3>C&rsquo;est quoi ?<\/h3>\n<p style=\"padding-left: 30px;\">Si vous pratiquez IP, vous ne pouvez pas ignorer <strong>le fameux PING<\/strong> ! Tous les administrateurs IP, et m\u00eame les utilisateurs, sont des \u00ab\u00a0pingueurs fous\u00a0\u00bb ! La commande PING issue du monde Unix, permet de <strong>tester l&rsquo;accessibilit\u00e9 d&rsquo;un \u00e9quipement IP.<\/strong><\/p>\n<p style=\"padding-left: 30px;\">Sur pratiquement toutes les stations IP vous pouvez entrer la commande <strong>PING<\/strong> &lt;<em>adresse IP de destination<\/em>&gt;. Vous recevrez ensuite des informations \u00e0 l&rsquo;\u00e9cran, dont le format varie en fonction des diff\u00e9rentes impl\u00e9mentations. Ces informations vous renseignent sur votre capacit\u00e9 \u00e0 joindre ou non l&rsquo;adresse vis\u00e9e.<\/p>\n<p style=\"padding-left: 30px;\">Si vous ne connaissez pas cette fonction, un petit exemple, vaut mieux qu&rsquo;un grand discours ! Si vous utilisez un PC sous Windows. Cherchez dans le menu D\u00e9marrer, la fonction Commande MSDOS (souvent dans les accessoires). Dans la fen\u00eatre (noire !), qui s\u00a0\u00bbaffiche entrez : ping 127.0.0.1 (<em>vous pinguez qui l\u00e0 ? &#8230; Si vous ne savez pas r\u00e9pondre, vous \u00eates recal\u00e9 au partiel !<\/em>). En r\u00e9ponse vous obtiendrez selon le cas :<\/p>\n<p style=\"padding-left: 30px;\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-247 aligncenter\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/PING_DOS.gif\" alt=\"\" width=\"650\" height=\"362\" \/><\/p>\n<ul>\n<li><strong>Request Timout<\/strong> : Pas de chance ! Le serveur ne r\u00e9pond pas ! C&rsquo;est du moins ce que l&rsquo;on dit souvent, mais c&rsquo;est un peu simpliste ! Nous allons y revenir ! Dans notre cas, vous n&rsquo;obtiendrez ce r\u00e9sultat que si vous n&rsquo;avez pas de stack IP d&rsquo;initialis\u00e9, ce qui m&rsquo;\u00e9tonnerai beaucoup puisque vous \u00eates connect\u00e9 \u00e0 Internet pour lire cette page !<\/li>\n<li><strong>127.0.0.1<\/strong> et des choses derri\u00e8re &#8230; : Le serveur r\u00e9pond ! Vous obtenez \u00e9galement des informations sur le d\u00e9lai d&rsquo;aller-retour pour atteindre le serveur.<\/li>\n<\/ul>\n<h3>Comment \u00e7a marche ?<\/h3>\n<p style=\"padding-left: 30px;\">Lorsque vous entrez la commande PING &lt;@IP&gt;, votre stack IP demande \u00e0 ICMP d&rsquo;\u00e9mettre un paquet <strong>Echo<\/strong> vers l&rsquo;adresse destination :<\/p>\n<ul>\n<li style=\"padding-left: 30px;\"><strong>l&rsquo;\u00e9metteur formate un paquet ICMP_Echo<\/strong> comportant un num\u00e9ro d&rsquo;identification, un num\u00e9ro de s\u00e9quence et quelques octets de donn\u00e9es al\u00e9atoires. Selon les impl\u00e9mentations, vous pouvez modifier les options de nombre d&rsquo;octets pour visualiser le comportement du r\u00e9seau sur l&rsquo;\u00e9mission de gros paquets. Par exemple, sous Windows vous pouvez modifier la taille par l&rsquo;option -l.<\/li>\n<li style=\"padding-left: 30px;\"><strong>le paquet ICMP est plac\u00e9 dans un paquet IP<\/strong>, d&rsquo;adresse destination \u00e9gale \u00e0 celle que vous avez indiqu\u00e9 et d&rsquo;adresse source \u00e9gale \u00e0 celle de l&rsquo;\u00e9metteur.<\/li>\n<li style=\"padding-left: 30px;\">lorsque le paquet est \u00e9mis, <strong>votre applicatif \u00ab\u00a0pingueur\u00a0\u00bb enclenche un timer<\/strong><\/li>\n<li style=\"padding-left: 30px;\"><strong>puis il \u00e9met un nouveau paquet ICMP_Echo<\/strong> du m\u00eame format que le premier mais ayant un num\u00e9ro d&rsquo;identification diff\u00e9rent. Il enclenche \u00e9galement \u00e0 son \u00e9mission un timer associ\u00e9 au paquet. Il peut r\u00e9p\u00e9ter cette op\u00e9ration plusieurs fois. <em>Sur Windows de base, le programme \u00e9met trois paquets, cependant avec l&rsquo;option -n vous pouvez modifier ce nombre<\/em>.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Pour conna\u00eetre toutes les options du Ping de Windows, entrez simplement \u00ab\u00a0ping\u00a0\u00bb et validez sous les Commandes MSDOS :<\/p>\n<p style=\"padding-left: 30px;\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-234 aligncenter\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/LISTE_PING.gif\" alt=\"\" width=\"652\" height=\"360\" \/><\/p>\n<p style=\"padding-left: 30px;\">Les paquets ICMP_Echo, encapsul\u00e9s dans des paquets IP, sont v\u00e9hicul\u00e9s \u00e0 travers le r\u00e9seau jusqu&rsquo;au destinataire. Quand le r\u00e9cepteur re\u00e7oit les paquets ICMP_Echo, il les transf\u00e8re \u00e0 son programme ICMP. Celui-va r\u00e9pondre :<\/p>\n<ul>\n<li><strong>il v\u00e9rifie le checksum<\/strong>. Si celui-ci est correct, il n&rsquo;y a pas d&rsquo;erreur ! (<em>Sans blagues ?<\/em>). Il passe donc \u00e0 la s\u00e9quence suivante, sinon il jette le paquet et ne r\u00e9pond pas.<\/li>\n<li><strong>il formate un paquet ICMP_Echo_Response<\/strong> ayant les m\u00eames num\u00e9ros d&rsquo;identification et de s\u00e9quence ainsi que les m\u00eames donn\u00e9es que le paquet Echo auquel il r\u00e9pond. Le num\u00e9ro d&rsquo;identification permet de diff\u00e9rencier des s\u00e9quences Echo simultan\u00e9ment lanc\u00e9es depuis la m\u00eame machine vers le m\u00eame destinataire (<em>hyper rare !<\/em>). Le num\u00e9ro de s\u00e9quence permet \u00e0 l&rsquo;\u00e9metteur de rep\u00e9rer quel timer est associ\u00e9 \u00e0 l&rsquo;Echo_Response re\u00e7u. L&rsquo;adresse IP source du paquet IP permet de diff\u00e9rencier plusieurs \u00e9metteurs d&rsquo;Echo pour un m\u00eame destinataire.<\/li>\n<li><strong>le paquet ICMP est ensuite plac\u00e9 dans un paquet IP<\/strong> d&rsquo;adresse source \u00e9gale \u00e0 l&rsquo;adresse de la station (le r\u00e9cepteur du paquet Echo.. Je pr\u00e9cise pour ceux qui aurait du mal \u00e0 suivre !) et d&rsquo;adresse destination \u00e9gale \u00e0 l&rsquo;adresse source du paquet Echo pr\u00e9c\u00e9demment re\u00e7u (<em>qui ait l&rsquo;adresse de l&rsquo;\u00e9metteur du ICMP_Echo&#8230; Je pr\u00e9cise parce que j&rsquo;en vois avec des yeux ronds dans le fond \u00e0 cot\u00e9 du radiateur !<\/em>).<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Le paquet ICMP_Echo_Response, encapsul\u00e9 dans un paquet IP, est v\u00e9hicul\u00e9 \u00e0 travers le r\u00e9seau jusqu&rsquo;au destinataire. Quand celui-ci re\u00e7oit le paquet :<\/p>\n<ul>\n<li><strong>il examine le checksum<\/strong> pour v\u00e9rifier qu&rsquo;il n&rsquo;y a pas eu d&rsquo;erreur. S&rsquo;il d\u00e9tecte un erreur, le paquet est d\u00e9truit, le timer associ\u00e9 est interrompu et vous obtenez une ligne \u00ab\u00a0Request TimeOut\u00a0\u00bb.<\/li>\n<li>si le checksum est bon, <strong>il examine le timer associ\u00e9<\/strong> : si le timer est arriv\u00e9 \u00e0 expiration, le paquet est d\u00e9truit. Une ligne Request Time Out aura \u00e9t\u00e9 pr\u00e9alablement retourn\u00e9 imm\u00e9diatement \u00e0 expiration du timer.<\/li>\n<li>si le timer est toujours valide, <strong>le programme retourne une ligne vous indiquant la valeur du timer \u00e0 la r\u00e9ception du paquet<\/strong>. Vous obtenez ainsi le d\u00e9lai de transit aller-retour du paquet.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">La m\u00eame op\u00e9ration est r\u00e9p\u00e9t\u00e9e pour tous les paquets.<\/p>\n<p style=\"padding-left: 30px;\">Certaines impl\u00e9mentations d&rsquo;IP retournerons une ligne \u00e0 la fin de l&rsquo;\u00e9mission de tous les paquets. Celle-ci indiquera le nombre de paquets perdus (non revenus avant expiration du timer) ainsi que la valeur la plus faible, la plus grande et la moyenne du d\u00e9lai de transit.<\/p>\n<p style=\"padding-left: 30px;\">La valeur du timer est souvent param\u00e9trable, elle est par contre la m\u00eame pour tous les paquets d&rsquo;une m\u00eame s\u00e9quence de \u00ab\u00a0ping\u00a0\u00bb. En effet dans certains cas il peut \u00eatre n\u00e9cessaire d&rsquo;adapter ce timer (cas des liaisons satellites par exemple) \u00e0 la configuration du r\u00e9seau, sous peine de n&rsquo;obtenir que des Request TimeOut, les paquets arrivant tous apr\u00e8s expiration d&rsquo;un timer trop court !<\/p>\n<h3>A quoi \u00e7a sert ?<\/h3>\n<p style=\"padding-left: 30px;\">Nous l&rsquo;avons d\u00e9j\u00e0 dit : Le \u00ab\u00a0ping\u00a0\u00bb sert essentiellement \u00e0 <strong>tester l&rsquo;accessibilit\u00e9 d&rsquo;un \u00e9quipement IP<\/strong>. Si vous avez des r\u00e9ponses positives \u00e0 un \u00ab\u00a0ping\u00a0\u00bb vous savez que la route \u00ab\u00a0aller\u00a0\u00bb dans le r\u00e9seau, l&rsquo;\u00e9quipement vis\u00e9 et la route \u00ab\u00a0retour\u00a0\u00bb (<em>qui peut \u00eatre diff\u00e9rente de la route \u00ab\u00a0aller\u00a0\u00bb !<\/em>) sont actifs.<\/p>\n<p style=\"padding-left: 30px;\">Par contre si vous n&rsquo;avez pas de r\u00e9ponses vous ne savez pas lequel de ces trois \u00e9l\u00e9ments pr\u00e9sente un d\u00e9faut. Dans ce cas, vous allez \u00e9tudier les tables de routage des passerelles pour d\u00e9terminer les chemins emprunt\u00e9s et vous allez ensuite \u00ab\u00a0pinguer\u00a0\u00bb chaque \u00e9lement (<em>passerelle<\/em>) de la route jusqu&rsquo;\u00e0 ce que vous trouviez lequel ne r\u00e9pond pas !<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff0000;\"><strong>ATTENTION<\/strong> <\/span>: IP fonctionne en mode non connect\u00e9 et souvent on impl\u00e9mente dans le r\u00e9seau des politiques de routage dynamique. Ceci suppose que les passerelles choisissent les routes en fonction de crit\u00e8res qui leurs sont propres. En cons\u00e9quence, une route \u00ab\u00a0aller\u00a0\u00bb et une route \u00ab\u00a0retour\u00a0\u00bb pour une m\u00eame destination peuvent \u00eatre diff\u00e9rentes. La recherche d&rsquo;un \u00e9l\u00e9ment d\u00e9faillant dans le r\u00e9seau (<em>routeur ou lien<\/em>) par des \u00ab\u00a0ping\u00a0\u00bb peut, dans ce cas, s&rsquo;av\u00e9rer trompeuse si on ne ma\u00eetrise pas parfaitement le routage. Vous pouvez penser qu&rsquo;un lien \u00ab\u00a0aller\u00a0\u00bb vers un routeur est hors service, alors que c&rsquo;est le lien \u00ab\u00a0retour\u00a0\u00bb, comme dans l&rsquo;exemple ci-dessous :<\/p>\n<p style=\"padding-left: 30px;\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-248 alignleft\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/PING_TOURNE.gif\" alt=\"\" width=\"371\" height=\"166\" \/><\/p>\n<ul>\n<li>Le \u00ab\u00a0<strong>ping<\/strong>\u00a0\u00bb depuis A vers B ne marche pas !<\/li>\n<li>Vous \u00ab\u00a0pinguez\u00a0\u00bb R1 sur son interface E0, il r\u00e9pond (normal vous \u00eates sur le m\u00eame r\u00e9seau local !)<\/li>\n<li>Vous \u00ab\u00a0pinguez\u00a0\u00bb R2 sur son interface E0, il ne r\u00e9pond pas !<\/li>\n<li>Vous en d\u00e9duisez que le probl\u00e8me se situe sur le lien entre R1 et R2 ou \u00e9ventuellement sur R2 !<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">\n<p style=\"padding-left: 30px;\">C&rsquo;est faux ! En fait, le probl\u00e8me se situe sur le retour R3 ! En effet R2 contacte le r\u00e9seau 10.0.0.0 via R3 !<\/p>\n<p style=\"padding-left: 30px;\">Donc &#8230; Prudence avec les localisations de d\u00e9fauts par le \u00ab\u00a0ping\u00a0\u00bb !<\/p>\n<h3>Autres cas d&rsquo;utilisation<\/h3>\n<p style=\"padding-left: 30px;\">Le ping peut \u00e9galement \u00eatre utilis\u00e9 pour :<\/p>\n<ul>\n<li><strong>mesurer des d\u00e9lais de transit<\/strong> : Il existe des outils d&rsquo;administrations qui demandent \u00e0 des routeurs d&rsquo;\u00e9mettre des \u00ab\u00a0ping\u00a0\u00bb et rel\u00e8vent les r\u00e9sultats de d\u00e9lais de transit pour dresser des tableaux de bords, par exemple.<\/li>\n<li><strong>mesurer une fiabilit\u00e9<\/strong> : En \u00e9mettant des longues s\u00e9quences de plusieurs centaines ou milliers de paquets cons\u00e9cutifs (<em>attention aux capacit\u00e9s de gestion des timers simultan\u00e9s<\/em>), vous pouvez mesurer le nombre de paquets perdus et en d\u00e9duire une fiabilit\u00e9 ou un taux de perte de paquets.<\/li>\n<li><strong>simuler une charge r\u00e9seau<\/strong> pour \u00e9valuer l&rsquo;impact sur les d\u00e9lais de transit et accessoirement en d\u00e9duire une bande passante bout en bout.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\"><strong>REMARQUES SUR LE DERNIER CAS<\/strong> :<\/p>\n<p style=\"padding-left: 30px;\">Pour ce type de mesure on pr\u00e9f\u00e9re souvent FTP, mais dans le cas des nouvelles architectures ATM ce n&rsquo;est pas toujours le meilleur choix ! En effet :<\/p>\n<ul>\n<li><strong>vous ne contr\u00f4lez pas la taille des paquets \u00e9mis par FTP<\/strong>, celui-ci ayant tendance \u00e0 remplir au maximum les segments TCP en fonction de la taille de la MTU locale (celle du LAN sur lequel l&rsquo;\u00e9metteur est plac\u00e9). Cette taille peut \u00eatre diff\u00e9rente de celle qu&rsquo;utilise votre application usuelle et dont vous voulez simuler le comportement. Par des \u00ab\u00a0ping\u00a0\u00bb vous pouvez fixer la taille des paquets afin de vous rapprocher de la taille de ceux \u00e9mis par votre application.<\/li>\n<li><strong>En ATM, la gestion de la bande passante est dynamique<\/strong>, c&rsquo;est \u00e0 dire que vous avez un d\u00e9bit minimum garanti mais vous pouvez le d\u00e9passer (<em>on parle de \u00ab\u00a0bursts\u00a0\u00bb<\/em>). Pour cela vous remplissez plus ou moins de cellules ATM dans le train binaire qui se pr\u00e9sente. Par contre si vous d\u00e9passez trop longtemps le d\u00e9bit mini, vos cellules sont marqu\u00e9es comme candidates \u00e0 la suppression (<em>on dit qu&rsquo;on les \u00ab\u00a0tag\u00a0\u00bb<\/em>). Si le r\u00e9seau est surcharg\u00e9, ces cellules sont supprim\u00e9es (<em>on dit qu&rsquo;on les \u00ab\u00a0drop\u00a0\u00bb<\/em>). Or si une cellule manque, le paquet IP est corrompu (<em>ne parlons pas de la couche AAL5 !<\/em>), le segment TCP v\u00e9hiculant le FTP est donc corrompu, et il y a retransmission au niveau TCP ! Mais en ATM les cellules sont toutes petites (<em>48 ou 47 octets utiles selon le cas<\/em>) et si votre paquet a \u00e9t\u00e9 coup\u00e9 en 10 cellules et qu&rsquo;une seule a \u00e9t\u00e9 \u00ab\u00a0dropp\u00e9e\u00a0\u00bb, vous perdez le tout et il faut tout r\u00e9\u00e9mettre ! Votre transfert FTP prend donc plus de temps, donc votre d\u00e9bit utile vous semble plus petit ! En fait, vous avez simplement d\u00e9pass\u00e9 votre contrat de trafic et vous avez enclench\u00e9 les m\u00e9canismes de limitations (<em>on appelle \u00e7a du \u00ab\u00a0shapping\u00a0\u00bb<\/em>) ! Si vous faites le m\u00eame test en TFTP (<em>support\u00e9 par UDP, en mode non connect\u00e9, sans reprise sur erreur<\/em>) ou en utilisant le \u00ab\u00a0ping\u00a0\u00bb ICMP il est fort probable que vous mesuriez une bande passante plus cons\u00e9quente !! Etonnant non ?<\/li>\n<\/ul>\n<h2>Destination inaccessible !<\/h2>\n<p>Nous avons vu dans les chapitres pr\u00e9c\u00e9dents, que les <strong>ma\u00eetres du routage dans un r\u00e9seau IP, sont les routeurs<\/strong> (<em>ou passerelles<\/em>). Ceux-ci routent les paquets en se construisant des tables de routage qui dressent la cartographie du r\u00e9seau. Le routeur est un \u00ab\u00a0<em>bison fut\u00e9<\/em>\u00ab\u00a0, il sait \u00e0 tous moments quelle est la meilleure route pour atteindre une destination !<\/p>\n<p>Mais parfois \u00ab\u00a0<em>bison fut\u00e9<\/em>\u00a0\u00bb a des d\u00e9faillances ! Vous avez tous, un jour de grande affluence, au moment des d\u00e9parts en vacance, suivi un \u00ab\u00a0Itin\u00e9raire Vert\u00a0\u00bb. Certes il \u00e9tait vert dans le sens o\u00f9 il vous a amen\u00e9 en pleine campagne ! Mais vous avez ensuite vu rouge quand il vous a largu\u00e9 en plein milieu de \u00ab\u00a0<em>Trou de nulle part<\/em>\u00a0\u00bb sans aucun panneau pour retrouver son chemin ! Et bien, IP c&rsquo;est pareil ! Un paquet peut tr\u00e8s bien aboutir sur une passerelle qui ignore tout du chemin \u00e0 emprunter pour atteindre le r\u00e9seau inscrit en adresse destination !<\/p>\n<p>Mais la passerelle sait reconna\u00eetre ses erreurs (<em>ce qui n&rsquo;est pas le cas de \u00ab\u00a0bison pas fut\u00e9\u00a0\u00bb !<\/em>), elle envoie \u00e0 l&rsquo;\u00e9metteur un paquet <strong>ICMP Destination Unreachable<\/strong> !!<\/p>\n<p>L&rsquo;\u00e9metteur est ainsi inform\u00e9 que le paquet n&rsquo;a pas pu \u00eatre d\u00e9livr\u00e9 et que la destination est incontactable. Que fait IP ? &#8230; Rien ! S&rsquo;en fiche ! Selon l&rsquo;impl\u00e9mentation il pourra \u00e9ventuellement informer la couche sup\u00e9rieure que son correspondant est parti se coucher ! A elle de d\u00e9cider ce qu&rsquo;elle veut faire ! TCP va insister grossi\u00e9rement en relan\u00e7ant ses informations jusqu&rsquo;\u00e0 ce qu&rsquo;il admette enfin que le destinataire est <strong>VRAIMENT<\/strong> incontactable. UDP, un peu fain\u00e9ant ne fera rien !<\/p>\n<p>Le paquet ICMP Destination Unreachable permet d&rsquo;informer plus pr\u00e9cis\u00e9ment l&rsquo;\u00e9metteur sur la cause de la non d\u00e9livrance du paquet. Un octet de code dans le paquet permet d&rsquo;indiquer :<\/p>\n<p><strong>R\u00e9seau inaccessible<\/strong> (code 0) : si la destination est inaccessible parce que le r\u00e9seau n&rsquo;est pas d\u00e9clar\u00e9 dans une table de routage d&rsquo;une des passerelles travers\u00e9 par le paquet IP<\/p>\n<p><strong>Host inaccessible<\/strong> (code 1) : si la station de destination est incontactable. Le paquet a bien atteint le r\u00e9seau de destination, mais aucune station n&rsquo;a r\u00e9pondu \u00e0 la requ\u00eate ARP de la passerelle du r\u00e9seau de destination.<\/p>\n<p><strong>Protocole inaccessible<\/strong> (code 2) : retourn\u00e9 par la station de destination, si le champ Protocole du paquet IP indique un protocole de niveau sup\u00e9rieur non g\u00e9r\u00e9 par la station. Par exemple si vous envoyez des donn\u00e9es IGRP (protocole de routage) \u00e0 une station qui n&rsquo;est pas un routeur Cisco !<\/p>\n<p><strong>Port inaccessible<\/strong> (code 3) : retourn\u00e9 par une station qui re\u00e7oit un paquet IP, v\u00e9hiculant un message TCP ou UDP dont le num\u00e9ro de port destination est inconnu de la station (<em>L\u00e0, c&rsquo;est du niveau 4 ! Laissez tomber &#8230;<\/em>).<\/p>\n<p><strong>Fragmentation n\u00e9cessaire, mais interdite<\/strong> (code 4) : retourn\u00e9 par une passerelle qui doit fragmenter un paquet, pour pouvoir l&rsquo;encapsuler dans une trame dont la MTU est inf\u00e9rieure \u00e0 la taille du paquet, mais qui ne peut le faire car le bit <strong>DF<\/strong> (Don&rsquo;t Fragment) du paquet est positionn\u00e9 \u00e0 1 ! Le paquet est jet\u00e9, et le paquet ICMP est envoy\u00e9 \u00e0 la station. <strong>Cette technique est utilis\u00e9e par TCP<\/strong> lorsqu&rsquo;il tente de d\u00e9couvrir la taille minimum de la MTU sur une route (<em>j&rsquo;en ai bri\u00e9vement parler dans le chapitre pr\u00e9c\u00e9dent !<\/em>). TCP \u00e9met d&rsquo;abord un paquet \u00e0 la taille de la MTU du r\u00e9seau local, s&rsquo;il re\u00e7oit un ICMP Destination Unreachable code 4, il diminue la taille et ainsi de suite !<\/p>\n<p><strong>Echec du source routing<\/strong> (code 5) : <em>laissez tomber ! Ce sera trop long !<\/em> Sachez que ce message est li\u00e9 au champ Option du paquet IP qui permet de mettre en place un routage impos\u00e9 par la source. L&rsquo;\u00e9metteur indique par quelles passerelles doit passer le paquet &#8230; Bref ! Assez peu utilis\u00e9 !<\/p>\n<p>Pas mal ICMP Destination Unreachable ? <em>On en apprend des choses, hein<\/em> ?<\/p>\n<h2>Time Out : Le TTL est mort !<\/h2>\n<h3>C&rsquo;est quoi ?<\/h3>\n<p style=\"padding-left: 30px;\">Nous avons vu pr\u00e9c\u00e9demment que l&rsquo;ent\u00eate du paquet IP pr\u00e9sentait un champ nomm\u00e9 <strong>TTL<\/strong> (<strong>T<\/strong>ime <strong>T<\/strong>o <strong>L<\/strong>ive). Lorsque dans le chapitre pr\u00e9c\u00e9dent nous avons \u00e9tudi\u00e9 la fragmentation, nous avons \u00e9voqu\u00e9 ce champ et la mani\u00e8re dont il \u00e9tait g\u00e9r\u00e9 par les machines IP. Pour rappel :<\/p>\n<ul>\n<li><strong>le TTL permet d&rsquo;indiquer une dur\u00e9e de vie \u00e0 un paquet IP<\/strong> afin d&rsquo;\u00e9viter que le r\u00e9seau continue d&rsquo;acheminer des paquets perdus<\/li>\n<li><strong>ce TTL est g\u00e9n\u00e9ralement fix\u00e9 \u00e0 255<\/strong> mais peut \u00eatre g\u00e9r\u00e9 par l&rsquo;\u00e9metteur pour diminuer la port\u00e9e d&rsquo;un paquet<\/li>\n<li><strong>un routeur d\u00e9cr\u00e9mente de 1 le TTL<\/strong> de tous paquets qui le traversent<\/li>\n<li>lorsqu&rsquo;un paquet est plac\u00e9 en file d&rsquo;attente, que ce soit dans un routeur ou dans une station \u00e0 l&rsquo;\u00e9mission ou \u00e0 la r\u00e9ception, <strong>le TTL est d\u00e9cr\u00e9ment\u00e9 de 1 toutes les secondes<\/strong>.<\/li>\n<li><strong>La machine qui passe \u00e0 0 le TTL d\u00e9truit le paquet correspondant<\/strong>.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">En cons\u00e9quence, une station ou un routeur peut avoir \u00e0 passer le TTL d&rsquo;un paquet \u00e0 0. Celui qui r\u00e9alise cette op\u00e9ration enverra un paquet ICMP_TIME_OUT \u00e0 l&rsquo;\u00e9metteur du paquet pour l&rsquo;informer de sa destruction. Encore une fois, ce n&rsquo;est pas IP qui r\u00e9agira, il transmettra l&rsquo;information aux couches sup\u00e9rieures qui d\u00e9cideront de la conduite \u00e0 tenir.<\/p>\n<h3>L&rsquo;application au Trace Route<\/h3>\n<p style=\"padding-left: 30px;\">Nous avons pr\u00e9c\u00e9demment \u00e9voqu\u00e9 le \u00ab\u00a0<strong>ping<\/strong>\u00a0\u00bb comme une commande tr\u00e8s utile pour l&rsquo;administration d&rsquo;un r\u00e9seau IP. Une autre commande tr\u00e8s utilis\u00e9e par les fous d&rsquo;IP, est le <strong>TRACE ROUTE<\/strong>.<\/p>\n<p style=\"padding-left: 30px;\">Le \u00ab\u00a0trace route\u00a0\u00bb, comme son nom l&rsquo;indique, permet de tracer la route emprunt\u00e9e par un paquet IP pour atteindre sa destination. En lan\u00e7ant cette commande vous recevez en r\u00e9ponse, la liste des passerelles par lesquelles est pass\u00e9 le paquet. <strong>Ce programme utilise la gestion du TTL et le m\u00e9canisme de l&rsquo;ICMP_TIME_OUT <\/strong>!<\/p>\n<p style=\"padding-left: 30px;\">Le principe est le suivant :<\/p>\n<ul>\n<li>vous entrez sur votre \u00e9quipement IP la commande <strong>trace route &lt;@IPdest&gt;<\/strong><\/li>\n<li>le programme <strong>Trace route formate un paquet IP<\/strong> d&rsquo;@IPsource \u00e9gale \u00e0 votre station et d&rsquo;@IPdest \u00e9gale \u00e0 celle indiqu\u00e9e dans la ligne de commande. <strong>Le TTL du premier paquet est fix\u00e9 \u00e0 1<\/strong> (au lieu de 255).<\/li>\n<li><strong>le paquet est \u00e9mis vers la Gateway Default<\/strong> de votre station pour \u00eatre rout\u00e9 dans le r\u00e9seau<\/li>\n<li><strong>quand le routeur re\u00e7oit le paquet il d\u00e9cr\u00e9mente de 1 le TTL<\/strong>. Il le passe donc \u00e0 0, puisqu&rsquo;il \u00e9t\u00e9 fix\u00e9 \u00e0 1 !<\/li>\n<li><strong>le routeur d\u00e9truit donc le paquet et \u00e9met un paquet ICMP_TIME_OUT<\/strong> vers l&rsquo;\u00e9metteur du paquet. Ce paquet est encapsul\u00e9 dans un paquet IP ayant pour adresse source l&rsquo;adresse de l&rsquo;interface de sortie du routeur vers votre station.<\/li>\n<li><strong>l&rsquo;\u00e9metteur re\u00e7oit le paquet ICMP \u00e9mis dans le paquet IP<\/strong>. Le paquet IP a pour adresse source l&rsquo;adresse de la passerelle qui a d\u00e9truit le paquet. Il peut donc vous renvoyez une ligne \u00e0 l&rsquo;\u00e9cran vous indiquant l&rsquo;adresse de la premi\u00e8re passerelle travers\u00e9e par le paquet.<\/li>\n<li><strong>puis l&rsquo;\u00e9metteur formate un deuxi\u00e8me paquet IP avec un TTL fix\u00e9 \u00e0 2<\/strong>. Cette fois le premier routeur va passer le TTL \u00e0 1 et enverra le paquet au prochain routeur indiqu\u00e9 dans sa table de routage, pour la route concern\u00e9e par le paquet IP.<\/li>\n<li><strong>le deuxi\u00e8me routeur passe le TTL \u00e0 0<\/strong> et retourne donc un ICMP_TIME_OUT qui sera re\u00e7u par l&rsquo;\u00e9metteur, etc &#8230;<\/li>\n<li><strong>le process est termin\u00e9e lorsque le paquet atteint la station de destination<\/strong>. En effet dans ce cas, l&rsquo;adresse source du paquet IP v\u00e9hiculant le paquet ICMP_TIME_OUT est la m\u00eame que l&rsquo;adresse indiqu\u00e9e dans la ligne de commande du \u00ab\u00a0trace route\u00a0\u00bb.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-302 aligncenter\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/TRACE_ROUTE.gif\" alt=\"\" width=\"547\" height=\"338\" \/><\/p>\n<p style=\"padding-left: 30px;\">Chaque passerelle de la route emprunt\u00e9e par les paquets IP pour atteindre l&rsquo;adresse destination, aura donc, au final, transmis un paquet ICMP_TIME_OUT dans un paquet IP ayant pour adresse source l&rsquo;adresse de l&rsquo;interface de sortie du routeur. <strong>Vous avez ainsi le chemin emprunt\u00e9<\/strong> !<\/p>\n<h3>Quelques petites pr\u00e9cisions<\/h3>\n<p style=\"padding-left: 30px;\">Lorsque le programme \u00ab\u00a0trace route\u00a0\u00bb \u00e9met un paquet il lui associe un timer (un peu comme dans le ping). Ce timer permet de mesurer le d\u00e9lai aller-retour pour atteindre la passerelle qui placera le TTL \u00e0 0. <strong>Vous pouvez ainsi obtenir le d\u00e9lai de transit, tron\u00e7on par tron\u00e7on pour une direction donn\u00e9e<\/strong>. Le timer permet \u00e9galement de stopper le processus lorsque la route est invalide et que les passerelles ne r\u00e9pondent pas (<em>dans ce cas m\u00eame un \u00ab\u00a0ping\u00a0\u00bb ne passerai pas, bien s\u00fbr !<\/em>).<\/p>\n<p style=\"padding-left: 30px;\">La station \u00e9mettrice peut \u00e9mettre simultan\u00e9ment des paquets IP de donn\u00e9es et des paquets relevant pas du programme trace route pour une m\u00eame destination. Ces paquets pourrait tr\u00e8s bien avoir leur TTL plac\u00e9 \u00e0 0 pendant le trajet, pour une raison quelconque. La machine IP qui passerai ce TTL \u00e0 0, retournera \u00e9galement un ICMP_TIME_OUT ! Comment l&rsquo;\u00e9metteur peut-il diff\u00e9rencier les ICMP_TIME_OUT relevant du process \u00ab\u00a0trace route\u00a0\u00bb des paquets relevant du transfert de donn\u00e9es utiles ? En fait, <strong>lorsqu&rsquo;une station formate un ICMP_TIME_OUT elle recopie dans ce paquet l&rsquo;ent\u00eate et les 8 premiers octets du paquet IP qu&rsquo;elle d\u00e9truit<\/strong>. Il y a donc suffisamment d&rsquo;information dans ce paquet pour que la station \u00e9mettrice du paquet d\u00e9truit puisse identifier le paquet concern\u00e9.<\/p>\n<p style=\"padding-left: 30px;\"><strong>Le message ICMP_TIME_OUT permet de diff\u00e9rencier deux causes de destruction<\/strong> du paquet par expiration du TTL, gr\u00e2ce \u00e0 un octet de code :<\/p>\n<ul>\n<li><strong>Champ TTL \u00e9puis\u00e9<\/strong> (code 0) : est indiqu\u00e9 lorsqu&rsquo;une machine IP a re\u00e7u le paquet avec un TTL \u00e0 1 et a donc d\u00fb le placer \u00e0 0. On suppose qu&rsquo;une boucle dans le r\u00e9seau a fait tourn\u00e9 le paquet trop longtemps.<\/li>\n<li><strong>Attente trop longue au r\u00e9-assemblage<\/strong> (code 1) : est indiqu\u00e9 par une machine qui d\u00e9truit un paquet IP parce qu&rsquo;elle n&rsquo;a pas re\u00e7u dans les temps tous les fragments permettant de le reconstituer. Ce code est donc forc\u00e9ment \u00e9mis par le destinataire du paquet (et pas par une passerelle) puisque seul le destinataire op\u00e8re le r\u00e9-assemblage.<\/li>\n<\/ul>\n<h2>Redirect : Tu te trompes de route !<\/h2>\n<h3>La Gateway de sortie du LAN<\/h3>\n<p style=\"padding-left: 30px;\">Nous avons \u00e9tudi\u00e9 au chapitre 5, les bases du routage IP. Dans le paragraphe \u00ab\u00a0<strong>Sortir du r\u00e9seau<\/strong>\u00a0\u00bb nous avons expliqu\u00e9 comment une station contactait sa passerelle de sortie (<em>Gateway Default<\/em>) pour \u00e9mettre des paquets en dehors du r\u00e9seau local.<\/p>\n<p style=\"padding-left: 30px;\">Mais <strong>que se passe-t-il s&rsquo;il y a plusieurs routeurs sur le LAN<\/strong>, chacun d&rsquo;eux desservant une ou des destination(s) particuli\u00e8re(s) ?<\/p>\n<p style=\"padding-left: 30px;\">Peu de stations offrent la possibilit\u00e9 de d\u00e9clarer une passerelle sp\u00e9cifique pour une route donn\u00e9e ! A ma connaissance, seules les stations Unix (<em>et s\u00fbrement Linux !<\/em>) permettent de d\u00e9finir une table de routage au sein d&rsquo;un host IP qui n&rsquo;est pas une passerelle :<\/p>\n<ul>\n<li><strong>En environnement Windows 95 vous ne pouvez d\u00e9finir qu&rsquo;une passerelle par d\u00e9faut<\/strong> qui sera syst\u00e9matiquement utilis\u00e9e pour acheminer le trafic sortant du LAN (<em>Merci Bilou ! Tu ne nous simplifie pas la vie, tu sais ?<\/em>).<\/li>\n<li><strong>En environnement Windows NT 4 et 5 Workstation vous pouvez d\u00e9finir sur une station plusieurs Gateway Default<\/strong> ! Mais pas pour des routes sp\u00e9cifiques ! Si la passerelle par d\u00e9faut passe hors service alors qu&rsquo;elle a d\u00e9j\u00e0 \u00e9t\u00e9 utilis\u00e9e par la station (la correspondance ARP est m\u00e9moris\u00e9e), il faudra rebooter la station pour pouvoir utiliser la deuxi\u00e8me Gateway (Franchement Bilou ! A quoi tu penses ? ).<\/li>\n<li><strong>En environnement NT 4 et 5 Server<\/strong> (peut-\u00eatre NT 3 aussi !), vous pouvez d\u00e9finir une table de routage dans le serveur (<em>Enfin Bilou ! Il \u00e9tait temps de te r\u00e9veiller !<\/em>).<\/li>\n<\/ul>\n<h3>Le probl\u00e8me<\/h3>\n<p style=\"padding-left: 30px;\">Donc, comme dans le sch\u00e9ma suivant, supposons que A veuille \u00e9mettre un paquet \u00e0 B. A a pour Gateway Default R1, qui malheureusement ne peut pas desservir le r\u00e9seau de B (<em>pas de chance !<\/em>).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-256 aligncenter\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/REDIRECT1.gif\" alt=\"\" width=\"439\" height=\"293\" \/><\/p>\n<p style=\"padding-left: 30px;\">Mais R1 n&rsquo;est pas totalement stupide ! Dans sa table de routage il voit bien que B peut \u00eatre atteint en passant par R2 (enfin, si votre plan de routage est bien fait !) ! Quand R1 recevra le paquet \u00e0 destination de B, il va donc le transmettre \u00e0 R2 !<\/p>\n<p style=\"padding-left: 30px;\">Mais R1 n&rsquo;aime pas travailler pour rien ! Il a bien remarqu\u00e9, qu&rsquo;il a \u00e9t\u00e9 oblig\u00e9 de r\u00e9\u00e9mettre le paquet par l&rsquo;interface sur laquelle il l&rsquo;a re\u00e7u ! Il se dit donc, bien l\u00e9gitimement, que si A \u00e9t\u00e9 un peu moins stupide il aurait envoy\u00e9 son paquet directement \u00e0 R2 !<\/p>\n<h3>La solution<\/h3>\n<p style=\"padding-left: 30px;\">Heureusement R1 (<em>bonne \u00e2me !<\/em>) va tenter d&rsquo;instruire A en lui \u00e9mettant un paquet ICMP_Redirect, lui donnant l&rsquo;adresse de Gateway \u00e0 contacter pour \u00e9mettre vers le r\u00e9seau de B !<\/p>\n<p style=\"padding-left: 30px;\">A va mettre \u00e0 jour sa table de routage ! Au prochain paquet \u00e0 \u00e9mettre vers le r\u00e9seau de B, il lancera une s\u00e9quence ARP pour conna\u00eetre l&rsquo;adresse MAC de R2, puis lui enverra le paquet !<\/p>\n<p style=\"padding-left: 30px;\">Super non ? &#8230; Pas tant que \u00e7a ! R\u00e9fl\u00e9chissons !<\/p>\n<h3>L&rsquo;impact n\u00e9gatif<\/h3>\n<p style=\"padding-left: 30px;\">Nous venons d&rsquo;admettre que l&rsquo;ICMP_Redirect a pour effet de mettre \u00e0 jour la table de routage de l&rsquo;\u00e9metteur ! Mais nous avons aussi dit que peu de stations g\u00e8rent une table de routage (les serveurs NT et les serveurs et stations Unix !). Autrement dit, seul ce type d&rsquo;\u00e9quipement IP (<em>en dehors des passerelles bien s\u00fbr !<\/em>), exploiterons l&rsquo;ICMP_Redirect ! Toutes les autres stations vont continuer (<em>b\u00eatement<\/em> !) d&rsquo;\u00e9mettre leur paquet \u00e0 la Gateway Default !<\/p>\n<p style=\"padding-left: 30px;\">Dans cette configuration, \u00e0 chaque fois la passerelle va donc \u00e9mettre un ICMP_Redirect, apr\u00e8s avoir \u00e9mis le paquet \u00e0 la bonne passerelle ! Donc au total trois paquets sont \u00e9mis sur le LAN alors qu&rsquo;il ne devrait y en avoir qu&rsquo;un !! (<em>Le LAN est super content ! Cela occupe sa bande passante, qui justement s&rsquo;ennuyait !!<\/em>). Bien s\u00fbr ce fonctionnement a un impact sur les d\u00e9lais de transit puisque le paquet traverse un routeur de trop (<em>R1<\/em>) et deux fois le LAN au lieu d&rsquo;une fois !<\/p>\n<p style=\"padding-left: 30px;\">Dans un cas d&rsquo;exploitation r\u00e9el, j&rsquo;ai l&rsquo;exemple d&rsquo;un client qui a gagn\u00e9 20% sur ses d\u00e9lais de transit en modifiant la Gateway de ses serveurs. A priori la fonction ICMP_Redirect n&rsquo;\u00e9tait pas active sur ses routeurs, ou plut\u00f4t son serveur n&rsquo;interpr\u00e9tait pas les paquets ICMP_Redirect !<\/p>\n<h3>Une solution pour r\u00e9soudre le probl\u00e8me<\/h3>\n<p style=\"padding-left: 30px;\">Il n&rsquo;y a pas beaucoup de solutions pour am\u00e9liorer ce fonctionnement. Le probl\u00e8me est qu&rsquo;un routeur est oblig\u00e9 de r\u00e9\u00e9mettre un paquet sur le LAN par lequel il l&rsquo;a re\u00e7u !<\/p>\n<p style=\"padding-left: 30px;\">Si vous d\u00e9sactivez l&rsquo;ICMP_Redirect sur vos routeurs, vous n&rsquo;aurez plus de paquets ICMP sur le LAN mais vous aurez toujours le rebond entre routeurs par le m\u00eame LAN !<\/p>\n<p style=\"padding-left: 30px;\">La seule solution est donc d&rsquo;interconnecter les routeurs entre-eux (<em>on appelle \u00e7a une liaison \u00ab\u00a0back to back\u00a0\u00bb <\/em>!) et de d\u00e9clarer l&rsquo;un des routeurs (disons, R1 ?) en Gateway Default ! Dans le sch\u00e9ma suivant, comme pr\u00e9c\u00e9demment, A envoie son paquet pour B \u00e0 R1, R1 le renvoi \u00e0 R2 par le lien R1-R2 et non pas par le LAN ! Donc plus d&rsquo;ICMP_Redirect et plus de double charge du LAN !<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-257 aligncenter\" src=\"http:\/\/www.gatoux.com\/wp-content\/uploads\/2017\/04\/REDIRECT2.gif\" alt=\"\" width=\"439\" height=\"293\" \/><\/p>\n<p style=\"text-align: left; padding-left: 30px;\" align=\"center\">Le probl\u00e8me est o\u00f9 cette fois ? &#8230; <strong>Qu&rsquo;arrive-t-il si R1 est HS ?<\/strong> Plus personne ne sort du r\u00e9seau quelque soit la destination demand\u00e9e ! Mais on ne peut pas tout voir dans ce cours ! J&rsquo;ai aussi le droit de garder quelques petits trucs pour les prochains ! Rassurez-vous, il y a des solutions ! Mais ce sera pour un cours sur le routage !<\/p>\n<h3 style=\"text-align: left;\" align=\"center\">Quelques petites pr\u00e9cisions<\/h3>\n<p style=\"text-align: left; padding-left: 30px;\" align=\"center\">Comme pour le paquet ICMP_Destination_Unreachable, <strong>le paquet ICMP_Redirect poss\u00e9de un octet de code qui permet de pr\u00e9ciser la nature de la redirection<\/strong> :<\/p>\n<ul>\n<li>\n<div style=\"text-align: left;\" align=\"left\"><strong>rediriger pour le r\u00e9seau demand\u00e9 <\/strong>(code 0) : le plus courant. Dans notre exemple nous avons dit que R1 retournait \u00e0 A un Redirect pour le r\u00e9seau de B (pas pour la station). En effet R1 a bien remarqu\u00e9, dans sa table de routage, que R2 desservait tout le r\u00e9seau de B.<\/div>\n<\/li>\n<li>\n<div align=\"left\"><strong>ne rediriger que pour le host demand\u00e9<\/strong> (code 1) : nous n&rsquo;en avons jamais parl\u00e9, mais vous pouvez tr\u00e8s bien d\u00e9finir, dans une table de routage, une route sp\u00e9cifique pour une station sp\u00e9cifique, au lieu d&rsquo;un r\u00e9seau complet. Cela est parfois employ\u00e9 pour l&rsquo;acc\u00e8s des stations d&rsquo;administrations \u00e0 qui on attribue une route sp\u00e9ciale avec acc\u00e8s par RNIS, par exemple. Donc si B avait eu une route d\u00e9di\u00e9e dans la table de routage de R1, celui aurait retourn\u00e9 un Redirect code 1.<\/div>\n<\/li>\n<li>\n<div align=\"left\"><strong>ne rediriger que pour le r\u00e9seau et le TOS demand\u00e9s<\/strong> (code 2) : nous avons peu \u00e9voqu\u00e9 le <strong>TOS<\/strong> (<strong>T<\/strong>ype <strong>O<\/strong>f <strong>S<\/strong>ervice) qui est encore tr\u00e8s peu utilis\u00e9. Ce champ, plac\u00e9 dans l&rsquo;ent\u00eate IP, permet d&rsquo;indiquer une priorit\u00e9 \u00e0 un paquet. Certains protocoles de routage, comme OSPF, permettent de dresser des tables de routage diff\u00e9rentes en fonction des TOS. Autrement dit, les routes de deux paquets IP pour un m\u00eame destinataire, mais ayant des champs TOS diff\u00e9rents, peuvent \u00eatre diff\u00e9rentes ! Le Redirect permet de tenir compte de cette particularit\u00e9 en indiquant que la redirection est uniquement valable pour les paquets ayant un TOS et une destination identique.<\/div>\n<\/li>\n<li>\n<div align=\"left\"><strong>ne rediriger que pour le host et le TOS demand\u00e9s<\/strong> (code 3) : vous avez bien compris que code 3 = code 1 mais en ajoutant le crit\u00e8re du TOS !<\/div>\n<\/li>\n<\/ul>\n<p style=\"text-align: left; padding-left: 30px;\" align=\"center\">Afin que la station \u00e9mettrice identifie le paquet pour lequel elle re\u00e7oit un ICMP_Redirect, le routeur recopie dans l&rsquo;ICMP l&rsquo;ent\u00eate IP et les 8 premiers octets de donn\u00e9es du paquet qu&rsquo;il place en redirection. Ainsi la station \u00e9mettrice peut notamment retrouver l&rsquo;adresse IP de destination en cause !<\/p>\n<h2>Conclusion du chapitre<\/h2>\n<p>Et voil\u00e0 ! Nous en avons termin\u00e9 avec cette pr\u00e9sentation sommaire des principales fonctions d&rsquo;ICMP. J&rsquo;ai tenu \u00e0 illustrer certaines d&rsquo;entre-elles par des cas r\u00e9els d&rsquo;utilisation car il n&rsquo;est pas toujours \u00e9vident d&rsquo;en comprendre l&rsquo;utilit\u00e9 !!<\/p>\n<p>Il reste un grand flou sur la mani\u00e8re dont les stations \u00e9mettrices exploitent les informations transmises par ICMP. Les programmes \u00ab\u00a0<strong>ping<\/strong>\u00a0\u00bb et \u00ab\u00a0<strong>trace route<\/strong>\u00a0\u00bb sont clairs, mais restent des programmes essentiellement d\u00e9di\u00e9s \u00e0 l&rsquo;administration. Un \u00ab\u00a0ping\u00a0\u00bb ou un \u00ab\u00a0trace route\u00a0\u00bb n&rsquo;a pas de r\u00e9elle valeur sur un transfert de donn\u00e9es utiles. Ce que fait une station lorsqu&rsquo;elle re\u00e7oit un ICMP Source Quench, un ICMP Time_Out, ou un quelconque autre ICMP, d\u00e9pendra :<\/p>\n<ul>\n<li>de l&rsquo;impl\u00e9mentation IP mise en oeuvre dans le stack install\u00e9 sur la machine (<em>existe-t-il des primitives pour remonter les informations aux couches sup\u00e9rieures ?<\/em>)<\/li>\n<li>de l&rsquo;impl\u00e9mentation des couches TCP et UDP du stack install\u00e9 (<em>si des primitives ICMP remontent d&rsquo;IP, TCP et UDP en tiennent-ils compte ?<\/em>)<\/li>\n<li>de l&rsquo;impl\u00e9mentation des applications de couches sup\u00e9rieures (<em>si TCP ou UDP retournent des informations issues des primitives ICMP, les applications les exploitent-elles ?<\/em>).<\/li>\n<\/ul>\n<p>J&rsquo;avoue manquer d&rsquo;informations sur le sujet !<\/p>\n<p>IP se termine avec ce chapitre ! Il y a sans aucun doute beaucoup de choses \u00e0 dire encore, mais l&rsquo;essentiel a \u00e9t\u00e9 pr\u00e9sent\u00e9 ! Le reste viendra avec l&rsquo;exp\u00e9rience ! Sur les prochains cours, je pense m&rsquo;attacher plus aux principes de routages IP, qui est un sujet v\u00e9ritablement passionnant !<\/p>\n<p>Le chapitre suivant vous propose trois organigrammes pour r\u00e9sumer le contenu de ce cours !<\/p>\n<h5 align=\"center\"><a href=\"http:\/\/www.gatoux.com\/index.php\/la-fragmentation-ip\/\">Page Pr\u00e9c\u00e9dente<\/a> | <a href=\"http:\/\/www.gatoux.com\/index.php\/petit-resume\/\">Page Suivante<\/a><\/h5>\n<p style=\"text-align: left; padding-left: 30px;\" align=\"center\">\n","protected":false},"excerpt":{"rendered":"<p>Introduction Nous avons pu remarquer dans les chapitres pr\u00e9c\u00e9dents qu&rsquo;IP \u00e9tait essentiellement ax\u00e9 sur les fonctions d&rsquo;adressage et de routage. Il est configur\u00e9 pour fonctionner comme si aucun probl\u00e8me ne pouvait survenir sur le r\u00e9seau (perte de datagrammes, congestion, probl\u00e8me de routage, etc.). Si un probl\u00e8me survient, sa solution est exp\u00e9ditive : il ne route\u2026 <span class=\"read-more\"><a href=\"https:\/\/racine.gatoux.com\/lmdr\/index.php\/icmp-cest-quoi\/\">Lire la suite &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":28,"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-356","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages\/356","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=356"}],"version-history":[{"count":6,"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages\/356\/revisions"}],"predecessor-version":[{"id":451,"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/pages\/356\/revisions\/451"}],"wp:attachment":[{"href":"https:\/\/racine.gatoux.com\/lmdr\/index.php\/wp-json\/wp\/v2\/media?parent=356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}