Dijkstra — Tables de routage OSPF (5 routeurs)

Contexte

Matière : _Reseaux · Type : exercice corrigé · Source : séance du 11/09 Cours associé : 2026-09-11 — OSPF et algorithme à état de lien (LSP, LSDB, les 3 étapes) Prérequis : 2026-09-04 — Routage et modèles OSI-TCP-IP (table de routage, notation /xx)

Explorer interactif — plus bas dans la page

La section Explorer interactif permet de cliquer chaque route pour voir son chemin s’allumer sur la topologie, avec le détail du calcul dist + interface. Les tables de cette fiche ont été vérifiées par deux implémentations indépendantes (Python + JS) — 55 lignes concordantes. Déroulé en tableau étape par étape : Dijkstra pas à pas — Tableaux de calcul 5 routeurs.


🗺️ Topologie

Liens de transit (WAN)

RéseauEntreCoût
10.2.0.0/16R1 ↔ R220
10.3.0.0/16R1 ↔ R35
10.4.0.0/16R1 ↔ R420
10.7.0.0/16R3 ↔ R410
10.9.0.0/16R2 ↔ R510
10.10.0.0/16R4 ↔ R510

Réseaux terminaux (LAN)

RéseauAttaché àCoût
10.1.0.0/16R1 (Fa0/0)2
10.5.0.0/16R22
10.6.0.0/16R32
10.8.0.0/16R42
10.11.0.0/16R52

🧮 La règle de calcul

Formule fondamentale

Le coût affiché sur le schéma est celui de l’interface sortante, pas celui du lien pris globalement. Un réseau de transit compte donc deux fois dans le total : une fois pour y arriver, une fois pour l’interface qui le dessert.

L'erreur classique

S’arrêter à la distance jusqu’au routeur sans ajouter le coût de l’interface. Exemple : R1 → 10.9.0.0 n’est pas 20 (= dist R1→R2) mais 30 (= 20 + interface R2 à 10).


📐 Matrice des distances routeur ↔ routeur

Résultat de Dijkstra appliqué depuis chaque nœud (distances symétriques ici).

R1R2R3R4R5
R102051525
R2200252010
R352501020
R4152010010
R5251020100

Les deux raccourcis contre-intuitifs

  • R1 → R4 = 15 via R3 (5+10), pas 20 en direct. Le lien direct est battu par le détour.
  • R1 → R5 = 25 via R3→R4 (5+10+10), pas 30 via R2 (20+10). Moins de sauts ≠ moins cher.
  • R2 → R4 = 20 via R5 (10+10), pas 35 via R1→R3.

🌲 Déroulé Dijkstra depuis R1 (SPF tree)

ÉtapeNœud retenuFile d’attente mise à jour
InitR1 (0, —)R2(20,R1) · R3(5,R1) · R4(20,R1)
1R3 (5, R1)R2(20,R1) · R4(15,R3) ← 5+10 < 20
2R4 (15, R3)R2(20,R1) · R5(25,R4) ← 15+10
3R2 (20, R1)R5(25,R4) — via R2 : 30 > 25, pas de MAJ
4R5 (25, R4)file vide → terminé

Arbre SPF résultant : R1 → R3 → R4 → R5 et R1 → R2


📋 Tables de routage

Légende : DC = directement connecté · Préd. = prédécesseur dans l’arbre SPF

R1

RéseauCoûtPréd.Next-hop
10.1.0.02—DC (Fa0/0)
10.3.0.05—DC (S0/0/1)
10.6.0.07R3R3
10.7.0.015R3R3
10.8.0.017R4R3
10.2.0.020—DC (S0/0/0)
10.4.0.020—DC (S0/1/0)
10.5.0.022R2R2
10.10.0.025R4R3
10.11.0.027R5R3
10.9.0.030R2R2

R2

RéseauCoûtPréd.Next-hop
10.5.0.02—DC
10.9.0.010—DC
10.11.0.012R5R5
10.2.0.020—DC
10.10.0.020R5R5
10.1.0.022R1R1
10.8.0.022R4R5
10.3.0.025R1R1
10.6.0.027R3R1
10.7.0.030R4R5
10.4.0.040R1 / R4R1 ou R5 (ECMP)

Load balancing sur 10.4.0.0

Via R5 : 10+10+20 = 40 · Via R1 : 20+20 = 40. Égalité parfaite → OSPF installe les deux routes (Equal-Cost Multi-Path).

R3

RéseauCoûtPréd.Next-hop
10.6.0.02—DC
10.3.0.05—DC
10.1.0.07R1R1
10.7.0.010—DC
10.8.0.012R4R4
10.10.0.020R4R4
10.11.0.022R5R4
10.2.0.025R1R1
10.4.0.025R1R1
10.5.0.027R2R1
10.9.0.030R5R4

R4

RéseauCoûtPréd.Next-hop
10.8.0.02—DC
10.7.0.010—DC
10.10.0.010—DC
10.6.0.012R3R3
10.11.0.012R5R5
10.3.0.015R3R3
10.1.0.017R1R3
10.4.0.020—DC
10.9.0.020R5R5
10.5.0.022R2R5
10.2.0.035R1R3

R5

RéseauCoûtPréd.Next-hop
10.11.0.02—DC
10.9.0.010—DC
10.10.0.010—DC
10.5.0.012R2R2
10.8.0.012R4R4
10.7.0.020R4R4
10.6.0.022R3R4
10.3.0.025R3R4
10.1.0.027R1R4
10.2.0.030R2R2
10.4.0.030R4R4

🖱️ Explorer interactif

// —— Exécuté par Obsidian uniquement ——
// Sur le site, Quartz rend ce bloc en code et le masque par CSS ; c'est
// le HTML inline plus bas qui prend le relais.
const f = app.metadataCache.getFirstLinkpathDest("spf-explorer.js", dv.current().file.path);
if (!f) {
  dv.paragraph("⚠️ `spf-explorer.js` introuvable — vérifie `02 - Schemas/`.");
} else {
  const code = await app.vault.read(f);
  const host = this.container.createDiv({ attr: { id: "spf-app-obs" } });
  new Function(code).call(window);
  window.SPFExplorer.mount(host);
 
  // Masque la version destinée au site (div vide + blocs de code bruts).
  // Obsidian rend les blocs progressivement : on remonte au conteneur de
  // la note et on ré-applique via MutationObserver.
  const MARK = /spf-app\s*\{|var IFACE\s*=|id="spf-app"/;
 
  const scope = () =>
    this.container.closest(".markdown-preview-view, .markdown-rendered, .markdown-source-view") ||
    this.container.parentElement ||
    document;
 
  const hide = () => {
    const root = scope();
    if (!root || !root.querySelectorAll) return;
    // la div vide destinée à Quartz
    root.querySelectorAll("#spf-app").forEach(e => {
      const box = e.closest("p, div.el-div, div.el-pre") || e;
      box.style.display = "none";
    });
    // les blocs <style> / <script> affichés en code brut
    root.querySelectorAll("pre").forEach(p => {
      if (MARK.test(p.textContent)) {
        const box = p.closest("div.el-pre, figure") || p;
        box.style.display = "none";
      }
    });
    // Obsidian peut aussi rendre le HTML brut en texte dans un <p>
    root.querySelectorAll("p").forEach(p => {
      if (p.querySelector("#spf-app") || (p.textContent.trim().startsWith("<style") && MARK.test(p.textContent))) {
        p.style.display = "none";
      }
    });
  };
 
  hide();
  const obs = new MutationObserver(hide);
  obs.observe(scope(), { childList: true, subtree: true });
  setTimeout(() => obs.disconnect(), 5000);
}

🎯 Pièges relevés sur cet exercice

Trois erreurs commises, toutes de la même famille

RouteurRéseauErreurCorrectCause
R110.9.0.02030coût interface (10) oublié
R310.9.0.02530interface oubliée + mauvais chemin (via R1 au lieu de R4)
R510.2.0.02030coût interface (20) oublié

Dans les trois cas : distance au routeur donnée à la place de distance + interface.

Méthode de vérification rapide

  1. Calculer d’abord la matrice routeur↔routeur complète (Dijkstra une fois par nœud).
  2. Pour chaque réseau, lister tous les routeurs qui y sont attachés.
  3. Pour chacun : dist(moi → ce routeur) + coût interface, puis garder le minimum.
  4. Si égalité entre deux chemins → ECMP, on installe les deux.

❓ Points flous

  • Comment OSPF calcule-t-il réellement le coût d’interface par défaut (10^8 / bande passante) et quelle valeur pour une série à 1,544 Mbps ?
  • Comportement exact de l’ECMP : round-robin par paquet ou par flux (CEF) ?

🔗 Voir aussi