Paquets
On souhaite étudier le cheminement d'un paquet au travers de routeurs dans un réseau informatique, d'un réseau local à un autre.
Voici un exemple de réseau
Les routeurs "Lycée", "Webcam" et "Maison" correspondent aux points d'accés des réseaux locaux associés.
Le réseau de routeurs peut être modélisé par le graphe ci-dessous :
flowchart LR
A([Lycée]) <--> B([Routeur1])
B <--> E([Routeur2])
C([Webcam]) <--> B
D([Routeur3]) <--> G([Maison])
D <--> E
E <--> F([Routeur4])
F <--> D
La communication entre l'ordinateur pc_lycée_1 et l'ordinateur pc_maison (par exemple l'envoi d'une image) se fait par la transmission de paquets. Chaque paquet va circuler à l'intérieur du réseau d'un routeur à un autre.
Le chemin que va prendre le paquet au travers du réseau est lié aux tables de routages associées aux routeurs.
Dans cet exercice, on s'intéresse uniquement au cheminement du paquet à l'intérieur du réseau de routeurs, en excluant donc le transfert à l'intérieur du réseau local. La communication entre l'ordinateur pc_lycée_1 et l'ordinateur pc_maison peut être alors assimilée à la communication entre le point d'accès Lycée et le point d'accès Maison.
Table de routage
La table de routage associe à chaque destination le prochain routeur par lequel il faut passer pour l’atteindre.
Ainsi, dans notre exemple, la table de routage du Routeur2 est la suivante :
| Destination | Prochaine étape |
|---|---|
| Lycée | Routeur1 |
| Webcam | Routeur1 |
| Autres | Routeur3 |
La destination « Autres » correspond à toutes les destinations qui ne sont pas explicitement données (c’est une route par défaut).
Dans cet exercice, une table de routage est représentée par un dictionnaire, dont les clés sont les noms des réseaux de destination et les valeurs associées le nom de la prochaine étape.
>>> table_routeur2 = {"Lycée": "Routeur1",
"Webcam": "Routeur1",
"Autres": "Routeur3"
}
Un paquet de données porte différentes informations nécessaires à sa gestion et son acheminement à travers les routeurs. À chaque fois qu’un paquet arrive dans un routeur, celui-ci va mettre à jour :
- la prochaine étape dans le réseau,
- la durée de vie du paquet,
- son état.
Nom de la prochaine étape
Le nom du routeur qui deviendra la prochaine étape du paquet est déterminé par la table de routage du routeur.
- Si le routeur de destination est présent dans la table de routage, le nom associée constituera la prochaine étape,
- Si le routeur n'est pas présent, on prend la route par défaut.
Ainsi, dans notre exemple, si un paquet arrive au Routeur2 avec pour réseau de destination Maison, il sera redirigé vers le Routeur3.
Durée de vie
La durée de vie ou TTL (Time To Live) d'un paquet est un nombre entier qui indique le nombre maximal de routeurs que peut traverser un paquet avant sa destruction.
Il évolue de la façon suivante :
- Par défaut, la valeur est fixée à \(64\),
- la valeur est décrémentée de \(1\) à chaque passage dans un routeur ;
- quand ce nombre arrive à \(0\), on considère que le paquet est perdu et le routeur en cours le rejette.
Etat du paquet
Par défaut le paquet est à l'état "à transférer".
S'il n'est toujours pas arrivé à destination et que sa durée de vie est tombée à \(0\), son état passe à "rejeté".
Si le nom de la prochaine étape est identique au réseau de destination, cela signifie que le paquet a atteint le réseau local de destination et doit être transféré à la machine de destination. Son état est alors "arrivé".
Le paquet après traitement
A la fin du traitement, le paquet est dans et ordre :
- ou transmis vers le prochain routeur,
- ou transmis vers la machine de destination s'il a atteint le bon réseau local,
- ou bien rejeté, si le paquet est considéré comme perdu.
Représentation d'un paquet
Chaque paquet est modélisé par une instance de la classe Paquet, décrite ci-dessous :
classDiagram
class Paquet{
source : str
destinatation : str
passerelle : str = ""
duree_de_vie : int = 64
etat : str
__str__()
}
Un paquet est caractérisé par :
- le nom du routeur d’où est parti le paquet : source de type
str, - le nom du routeur de destination : destinatation de type
str, - le nom de la passerelle (à savoir, la prochaine étape) : passerelle de type
str(initialisé par défaut à""), - sa durée de vie :
duree_de_viede typeint(cet attribut est initialisé à la valeur64.), - et son état, soit
"à transférer", soit"rejeté", soit"arrivé":etatde typestr(cet attribut est initialisé à la valeur"à transférer".).
En utilisant cette classe Paquet, les paquets suivants :
paquet1, envoyé depuis le routeur "Lycée" vers le routeur "Webcam",- et
paquet2, envoyé depuis le routeur "Lycée" vers le routeur "Maison",
sont définis ainsi :
>>> Paquet("Lycée", "Webcam")
Paquet(source='Lycée', destinatation='Webcam', passerelle='', duree_de_vie=64, etat='à transférer')
>>> Paquet("Lycée", "Maison")
Paquet(source='Lycée', destinatation='Maison', passerelle='', duree_de_vie=64, etat='à transférer')
Les deux questions ci-dessous peuvent être traitées de façon indépendante.
Question 1
Dans cette question, on étudie le traitement d'un paquet qui traverse un seul routeur.
Créer une fonction routage qui prend en paramètre un paquet et la table de routage d'un routeur donné et qui modifie en place le paquet.
>>> routage(paquet1, table_Lycée)
>>> paquet1.passerelle
'Routeur1'
On certifie que le paquet passé en paramètre se trouve à l'état "à transférer".
Représentation de l'ensemble du réseau
On représente l'ensemble du réseau par un dictionnaire dans lequel :
- les clés sont les chaînes de caractères correspondant aux noms des routeurs,
- les valeurs associées sont des dictionnaires représentant la table de routage du nœud correspondant.
L'exemple ci-dessous montre la représentation d'une partie du réseau :
mon_reseau = {
"Lycée": {
"Routeur1": "Routeur1",
"Lycée": "Lycée",
"Autres": "Routeur1"
},
"Webcam": {
"Routeur1": "Routeur1",
"Webcam": "Webcam",
"Autres": "Routeur1"
},
"Routeur1": {
"Lycée": "Lycée",
"Webcam": "Webcam",
"Autres": "Routeur2"
}}
Question 2
Créer une fonction transfert_paquet qui prend en paramètre un paquet et un dictionnaire reseau représentant un réseau de routeurs et qui renvoie une chaine de caractères représentant l'état du paquet à la fin du routage.
>>> transfert_paquet(paquet1, mon_reseau)
'arrivé'
>>> transfert_paquet(paquet2, mon_reseau)
'rejeté'
Fonction routage
Une implantation correcte de la fonction routage de la question 1 est disponible en mémoire pour cette question.
Indice
Le paquet est initialement positionné sur le routeur émetteur.
# Tests (insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)