|
|
ÉLÉMENTS DE CORRIGÉ
Partie 1
1.1-
Passerelle R1 :
La route par défaut est un cas particulier, sa métrique est de 1. Passerelle R2
Remarque : R2 ne sait pas aller au réseau 200.100.50.0 1.2-
1.3-Message RIP diffusé par R1
1.4-Passerelle R2
Partie 2
2.1-
Type octet : intervalle (1..255) structure adresse_IP octet1 : octet octet2 : octet octet3 : octet octet4 : octet fin structure 2.2- Datagramme IP transmis de R3 à R1
2.3-R2 reçoit un paquet dont l'adresse IP de destinataire est 200.100.40.2 donc l'exécution de la fonction TEST_ADR_RES renvoie VRAI car le routage n'est pas nécessaire. La procédure TRAIT_PAQ permet d'analyser le protocole de transport, ici 17, ce qui permet l'exécution de la procédure TRAIT_UDP puis TRAIT_RIP car il s'agit d'un message RIP transporté par le datagramme UDP. PARTIE 3
Fonction TEST_ADR_DEST (entrée adr : adresse_IP) : booléen /* pour déterminer si le paquet est adressé à l'ordinateur, nous regardons si l'adresse IP passée en paramètre correspond à une des adresses des interfaces du routeur */ i : entier trouve : booléen Début i = 0 /* on suppose que le tableau tabroutes est indicé à partir de 0 */ trouve = FAUX tantque i < nbentrées et non trouve si adr = tabrout[i].interface trouve = VRAI finsi fin pour retourner (trouve) Fin PARTIE 4
4.1- fonction de calcul d'adresse réseau
Fonction EXTRACT_ADR_RES (entrée adr_ip : adresse_IP, netmask : adresse_IP) : adresse_IP Début retourner (decIP(et(binIP(adr_ip),binIP(netmask)))) Fin 4.2- Procedure ROUTAGE
Procedure ROUTAGE (entrée paquet : Tent_ip_util) i : entier trouve : booléen DEBUT si paquet.ttl = 0 /* le paquet a atteint la limite de sa durée de vie */ alors rejet(paquet) sinon i = 0 /* on suppose que la table de routage est indicée à partir de 0 */ trouve = FAUX paquet.ttl = paquet.ttl - 1 /* décrémentation du temps de vie */ /* Choix du chemin */ /* Recherche d'une entrée correspondant à l'adresse IP du réseau à atteindre */ tantque i < nbentrées et non trouve si tabrout[i].network = paquet.adr_ip_dest OU tabrout[i].network = EXTRACT_ADR_RES (paquet.adr_ip_dest,tabrout[i].netmask) alors Choix interface de routage /* Code décrit ci-après */ trouve = VRAI finsi i = i + 1 fintantque /* La recherche d'une entrée correspondant à l'adresse IP a échoué. Recherche d'une route par défaut dans la table de routage */ si non trouve alors i = 0 tantque i < nbentrées et non trouve si tabrout[i].network = 0 alors Choix interface de routage trouve = VRAI finsi i = i + 1 fintantque finsi si non trouve /* Il n'y a pas de route par défaut définie */ alors icmp(paquet) /* génération d'un message ICMP en cas de problème */ finsi FIN ROUTAGE Choix interface de routage si tabrout[i].metric = 1 alors envoi(paquet,tabrout[i].interface) sinon si tabrout[i].metric <> 16 alors envoi_gateway(paquet,tabrout[i].interface,tabrout[i].gateway) sinon /* le chemin n'est pas valide */ icmp(paquet) /* génération d'un message ICMP en cas de problème */ finsi finsi Fin Choix interface de routage
4.3- En cas de bouclage entre deux routeurs, notre procédure fonctionnera car le TTL est décrémenté à chaque traitement du paquet et le paquet est rejeté quand le TTL est égal à zéro. 4.4-Un exemple trivial de bouclage peut être celui de deux routeurs s'adressant mutuellement par défaut. PARTIE 55.1-
Procédure MAJRIP (entrée paquet : Tent_ip_util, chemin : Tmsg_rip) /* la première chose que fait notre procédure est d'incrémenter la variable metric, car toutes les adresses fournies par un autre routeur nécessitent un saut de plus pour les atteindre. */ i : entier trouve : booléen Début i = 0 /* on suppose la table de routage indicée à partir de 0 */ chemin.metric = chemin.metric + 1 tantque i < nbentrées et non trouve si tabrout[i].network = chemin.network alors si chemin.metric = 16 ET tabrout[i].gateway = paquet.adr_ip_emt alors /* invalidation de l'entrée */ suprout (tabrout,i) sinon si (tabrout[i].metric > chemin.metric) alors majtabrout(tabrout,i,chemin,paquet.adr_ip_emt) /* La table est mise à jour avec la nouvelle route, la passerelle actuelle sera remplacée par l'adresse du routeur émetteur du message RIP. Si la métrique est 16, il faut invalider la route */ finsi finsi trouve = VRAI finsi i = i + 1 fintantque si non trouve /* On suppose que la table est correctement dimensionnée, donc pas de test de dépassement d'indice */ alors /* la route n'existe pas, il faut la créer */ majtabrout(tabrout,i,chemin,paquet.adr_ip_emt) nbentrées = nbentrées + 1 /* Le nombre d'entrées dans la table est incrémenté */ finsi Fin MAJRIP 5.2-La route la plus courte n'est pas forcément la plus rapide car elle peut emprunter des lignes à bas débit. Pour éviter cet inconvénient certaines versions de RIP incrémente artificiellement le vecteur de distance de ces liaisons. 5.3-Il n'y aurait pas de messages RIP et la procédure ROUTAGE devrait être réécrite, on traiterait uniquement deux cas : le cas où le paquet est destiné à l'ordinateur et le cas où il faut l'envoyer à la passerelle par défaut. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
_____________________________________________
|