README.md 6,26 ko
Newer Older
Killian Reine's avatar
Killian Reine a validé
# Simulateur de Réseau — Routage et Circuits Virtuels

Projet réalisé dans le cadre du module **Réseaux — L3 Informatique 2025–2026**.

## Présentation

Ce projet implémente un simulateur complet de réseau de commutateurs permettant :

- La construction graphique d'une topologie réseau (switches, liens pondérés, machines terminales)
- Le calcul du plus court chemin entre deux machines via l'algorithme de Dijkstra
- La génération et l'affichage des tables de routage
- La gestion de circuits virtuels avec attribution de VCI

L'architecture repose sur un modèle hybride **C / Java** :

- Un moteur de calcul en C pour les algorithmes de graphe
- Une interface graphique riche en Java Swing
- Une communication inter-processus via un protocole texte sur `stdin/stdout`

## Architecture du projet

Le dépôt est organisé en deux grandes parties : moteur C et interface Java.

### Moteur C

Répertoire principal : `core/`

Responsabilités :

- Modélisation bas niveau des commutateurs et machines
- Implémentation de l'algorithme de Dijkstra (complexité O(n²))
- Calcul des tables de routage
- Gestion de l'état actif/en panne des commutateurs
- Exécution en tant que processus autonome piloté par commandes texte

Modules principaux :

- `modules/graph/` : implémentation de Dijkstra
- `modules/switch/` : gestion des commutateurs et des liens
- `modules/machine/` : gestion des machines terminales
- `main.c` : boucle principale et protocole de communication

Le binaire compilé est généré dans `bin/reseau`.

### Interface Java

Répertoire principal : `ui/`

Architecture basée sur le patron MVC strict :

- `ui.model` : modèle du réseau (`Network`, `SwitchNode`, `Link`, `Machine`, `VirtualCircuit`)
- `ui.view` : rendu graphique (canvas, renderers, dialogues)
- `ui.controller` : gestion des interactions utilisateur
- `ui.bridge` : pont Java/C (classe `CBridge`)
- `ui.palette` : constantes visuelles (dimensions, couleurs, polices)

Le package `ui.view.renderer` est subdivisé en sous-packages spécialisés :

- `renderer.node` : `NodeShapeRenderer`, `NodeLabelRenderer`, `NodeGlowRenderer`
- `renderer.machine` : `MachineRenderer`, `MachineLayoutCalc`, `MachineDotRenderer`, `MachinePortBadge`

`MachineLayoutCalc` implémente un algorithme de maximisation d'angle (72 candidats testés) pour placer automatiquement les machines dans les espaces libres entre les liens d'un commutateur.

## Fonctionnalités

### Construction interactive du réseau

- Ajout de commutateurs avec nombre de ports configurable (1 à 16)
- Ajout de liens pondérés entre commutateurs
- Ajout de machines terminales rattachées aux switches
- Glisser-déposer des nœuds
- Modification dynamique des poids
- Suppression d'éléments via mode dédié ou menu contextuel
- Simulation de panne d'un commutateur

Les numéros d'interface sont automatiquement attribués et affichés graphiquement. Au démarrage, un réseau de démonstration de 10 commutateurs et 18 liens est chargé automatiquement.

### Calcul du plus court chemin

- Sélection de deux machines via le panneau latéral
- Exécution de Dijkstra côté C
- Animation progressive du chemin sur le graphe
- Affichage de la distance totale
- Prise en compte des commutateurs en panne

### Tables de routage

Pour chaque commutateur (accessible par clic droit) :

- Calcul des distances vers toutes les destinations
- Identification du prochain saut optimal
- Affichage sous forme de tableau HTML via `JEditorPane`
- Mise en évidence de la meilleure route en vert

### Circuits virtuels

Gestion complète des circuits depuis le menu **Circuits Virtuels** :

- Ouverture d'un circuit entre deux machines
- Attribution automatique des ports IN / OUT depuis le modèle
- Attribution séquentielle des VCI par commutateur
- Fermeture et suppression de circuits
- Affichage structuré avec en-têtes multiniveaux (`colspan` / `rowspan` HTML)

Deux circuits empruntant le même chemin partagent les ports mais possèdent des VCI distincts.

## Protocole C / Java

Le moteur C expose une interface texte lue sur `stdin`, avec réponse `OK` ou `ERR` sur `stdout`.

| Commande | Effet |
|---|---|
| `ADD_SWITCH <id> <ports>` | Ajoute un commutateur |
| `REMOVE_SWITCH <id>` | Supprime un commutateur et ses liens |
| `ADD_LINK <id1> <id2> <w>` | Ajoute un lien pondéré |
| `REMOVE_LINK <id1> <id2>` | Supprime un lien |
| `ADD_MACHINE <mId> <swId>` | Attache une machine à un commutateur |
| `DIJKSTRA <src> <dst>` | Calcule le plus court chemin |
| `ROUTING_TABLE <swId>` | Calcule la table de routage |
| `SET_ACTIVE <id> <0\|1>` | Active/désactive un commutateur |
| `QUIT` | Termine le processus |

La classe `CBridge` encapsule totalement ce protocole et maintient un cache réseau synchronisé côté Java.

## Lancement de l'application

- Depuis la racine, cela va compiler le système C
  ```bash
  make
  ```

- Déplacez vous dans `ui` pour compiler les fichiers `.java`
  ```bash
  cd ui
  make
  ```

- Lancer l'application toujours dans `ui`
  ```bash
  make run
  ```
Killian Reine's avatar
Killian Reine a validé

L'interface démarre et lance automatiquement le processus C en arrière-plan.

## Structure des répertoires

```
core/        → moteur C
ui/          → interface Java
build/       → objets compilés C
bin/         → binaire C
report/      → rapport du projet
makefile     → compilation moteur C
ui/Makefile  → compilation interface Java
```

## Choix techniques majeurs

- Architecture hybride C/Java pour séparer calcul et interface
- Patron MVC strict côté Java avec packages bien délimités
- Renderers spécialisés en sous-classes pour chaque élément visuel
- Placement intelligent des machines par maximisation d'angle (`MachineLayoutCalc`)
- Rendu HTML via `JEditorPane` pour les tableaux complexes (routage, circuits virtuels)
- Attribution cohérente et globale des numéros de ports par commutateur
- Gestion robuste des erreurs de communication inter-processus

## Tests et validation

Le projet a été validé sur :

- Réseaux simples et multi-chemins
- Cas avec commutateurs en panne
- Multiples circuits virtuels simultanés
- Cohérence des tables de routage
- Conformité des résultats de Dijkstra aux exemples théoriques du cours

## Auteur

Killian REINE — L3 Informatique 2025–2026

## Licence

Projet académique réalisé dans le cadre d'un TP universitaire. Usage pédagogique uniquement.