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

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_vie de type int (cet attribut est initialisé à la valeur 64.),
  • et son état, soit "à transférer", soit "rejeté", soit "arrivé" : etat de type str (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 :

🐍 Console Python
>>> 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".

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[tf4)2rj3,sa-o iug08m1]P6pnl7h.e=céy:v9A(wqS/b_dk050X0H0d0n0r0D0m0q0J0D0n0m0m0I010d0r0B010406050m0s0w0w0n0i0L040T0p0D0s0?0p0C050U0}0 11130{0B041c1j051m0U1m1o1j0{0X0r0N0+0-0/0;0F0r0t0F0D1C0F0d0_050$0V0D0H1x0.0:011B1D1F1D0d1L1N1J0d0V0p0X131K0i1k0d0F0+160m0B0n0C0;0h011P1z010e0(0H0C0n0w0H1J1;1?1{1R1~1N21230_0a0q0z0i0p0B0p0m0r190C0q0!1/0i0i0H0J2o1c260C1k0U1-2B0d1+1*1,0X280;1F0C202l1J1u1w0,1Q2L0r2N0C1%1v1J0B2u1k2z2B2)0|1=2p2T1|2Y0i100D0_0q0x2y2-0`2,272/1R2;2?2^0h2{1?2}2z2K01320n2@040q0k362A0{39300;3c3e0q0f3i382-3a3o2^0b3s3k3u3m3b0p2=3d2^0A3z2~2.1y313E333f0E3J3l3M3n3O3G3f0v3S3B3U3D3F3p0O3!2 3$3w040x0u3s1l2%1c2R2E0X2I3a0J1%241k3_1n3@2+1d2|053~0!2(3#2U010Y0_0!0e3=3T4d0R2^4j4c2:0e0_2i180n0t0H4o3,4d0^040Q4y3L4d0C0_1=0S0s0#4E3a4B0l3s0q3K3v0_1Y4x46374T3C4B0g0M3z0q4*4S4k2:4I0n4K4M4Y2A4!3$0p0_0G4N3C4H040X0s2u0H0W0!0W0N0r4X2)4,4p1R4`040o0I4R4^4d0w0r0_2`4?0`4+5c4z1|4f040r4i5q5t4F4.044J4L0d4}4_4{5I4G4g520H5456585a2|5B3a5f0I5i5A5k1|5m0_3;5q5#1R4B4(5q065s5s5+3n4/4;5H5*4-5e5K5{5d5@040#0n5`5b5?015X5j5|0;0m1_04012u0j0#0K014)4+675w0H1F5z666b3b5^5G5L1|5f4|5 5u314g0H0m0?212x5!6u5X5Z6t606v5E4:6x6C5C5}046B2+6u4 1=0/0H2u0D1N6y5,0_5.2)5:5;4*676$6T4=6!6Q6A6-6163655U67696L6Q6d0_01110i1v6k6m6@6u6p6r6a6Q6_5_6 685~6|6D610!6H2W640r1a7k7s684m5x1b767B4 4W7o5-7f5;6^6w6{476M7q7R7l4/6(6*6,7G6W0;756P7H4V0n1M5T4Z6u4B0c7o7m6U7r7#7p6Y7=6F7v6J7y7F7^4O0_0y7M6o0_6q0m7-4@7/6/7M5=6#7P727.6}7T8k7)6S7X6q7Z7(7_7%738h047J6V83047;8A3C786f0P182u0m6l8E3$4B855/1c490H2B2$8U3^1v3`2E2G2C1$1(2E7+1N2B3_0{0U0!0$0(0m04.

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 :

Exemple
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.

🐍 Console Python
>>> 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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[tf4)2r3,sao iugàm1]Ppnlh.e=céy:v(wqS/b_dk050Q0C0d0m0p0z0l0o0E0z0m0l0l0D010d0p0x010406050l0q0t0t0m0i0G040M0n0z0q0,0n0y050N0?0^0`0|0;0x04151c051f0N1f1h1c0;0Q0p0I0!0$0(0*0A0p0r0A0z1v0A0d0/050V0O0z0C1q0%0)011u1w1y1w0d1E1G1C0d0O0n0Q0|1D0i1d0d0A0!0 0l0x0m0y0*0h011I1s010e0X0C0y0m0t0C1C1*1,1;1K1@1G1`1|0/0a0o0w0i0n0x0n0l0p120y0o0T1(0i0i0C0E2h151 0y1d0N1$2u0d1!1Z1#0Q210*1y0y1_2e1C1n1p0#1J2E0p2G0y1W1o1C0x2n1d2s2u2Y0=1+2i2M1=2R0i0_0z0/0u2r2$0:2#202(1K2*2,0/0h2:1,2=2s2D012`0m2-040j2~2t0;312^0*34360f39302$323f0/0b3i1e2W152K2x0Q2B320E1W1}1d3t1g3r2!162;053y0T2X3k3d010R0/0T0e3p3c1r1K0K0/0o3T3M3V3e0e0/2y1,0l0e0C0i0d0P1+0L0q0U3!2@3$010.040J3_2%3{0y0/3=3@0d40323}0k3i3Z3U2N330/2n0l0C0m0q483N3}0g0H3i060o4u4d3#4f43042b110m0r0C4n3{3}3 3G2 2?414y440m3?3^4K2t4M490/4b4T044w3`4O4A0C4j4l4G4f3}0c4,2)4P4R474Z4V3N0n0/0B4:2_0/0l0n0q0i0E4F4^4e1=3}0v0g4s4v4#4N1=3P040K1u1G4c4_424=464~0*4{044}574x4;040U0m4@2Y5f325u0D0D5n581K0l1/04010s0o3*0y3,0F2n0i015s3|0/4r4Z4t5e4v5o4%4B0V4E5!4I5!4z454S2!5L0*4a5K5y4 4(4*4m5x4$590/4/645g605^5D3H5{015u5w5`5 3e4P0(3.0C0z5m694W045b5d5+6f5i2n0d53144Z5F3N5@4Q5r6s4`4|5?0/5B6d2 0;0N3J0C2u2V6V3s1o3u2x2z2v1V1X2x0m1F6Y0N3t6S0T0V0X0l04.