Université Paris XIII Institut Galilée Master Informatique 1 ère année Année Universitaire : 2006/2007
SOMMAIRE I. Introduction... 2 II. Etude du projet... 3 1. Analyse des besoins... 3 2. Réponses aux besoins... 3 III. Organisation du projet... 4 IV. Architecture globale... 7 V. Conception... 8 1. Cas d utilisation et diagrammes des séquences... 8 2. Diagrammes flux... 14 2. Diagrammes des classes... 15 VI. Réalisation... 16 1. Tester les performances du réseau... 16 2. Récuperer les mesures du réseau... 17 2. Auto-configurer le réseau... 19 VII. Environnement de travail... 20 1. Installation du serveur VoIP... 20 2. Installation du serveur Bases de données... 22 3. Installation du réseau... 23 4. Inter-opérabilité des composants... 25 VIII. Documentation... 26 1. Guide utilistateur... 26 2. Guide de l administrateur... 28 IX. Conclusion... 31 X. Annexes... 32 1
I. Introduction Actuellement les fournisseurs de services Internet (ISP) qui offrent un service de VoIP ne se préoccupent guère de la qualité de service. Par exemple, Free dans son offre ADSL prévoit un temps de latence d environ 5 secondes en téléphonie sur IP. Aujourd hui, nous constatons une multiplication des ISP offrant un service de téléphonie sur IP (Alice, neuftelecom, Wanadoo, Darty, ). Sachant que tous ces ISP offrent le même service de téléphonie sur IP, il est évident que la qualité de service (QoS) est un argument de vente non négligeable. De plus, avec l arrivée de la vidéo sur IP, le critère de qualité de service devient essentiel dans le domaine des télécommunications. Dans le cadre de la "Conduite et Gestion de Projet", Mr. Hassine MOUNGLA, enseignant chercheur au LIPN (Laboratoire d Informatique de Paris-Nord) a proposé le projet suivant : " La gestion autonome des services sur les réseaux Diffserv. Cas d'étude: La Voix sur IP ". Il s agit d un nouveau projet de recherche qui consiste à trouver une solution pour faire passer de la voix via un réseau IP-Diffserv tout en maintenant le même niveau de qualité de service. La première partie de ce rapport décrit la manière dont nous avons géré notre projet, l attribution des tâches à la réalisation en passant par la conception. La deuxième partie du rapport (annexes) peut servir pour la maintenance du logiciel. 2
II. Etude du projet 1. Analyse des besoins Les points explorés dans ce projet portent sur la construction de deux systèmes : (i) Système de monitorage qui collecte les informations sur le réseau. (ii) Système de gestion auto-configuration qui prend les décisions selon les informations collectées par le système de monitorage, et qui réalise des ajustements du réseau si nécessaire. 2. Réponses aux besoins Nous pouvons décomposer notre projet en plusieurs parties. La première partie sera la préparation de l environnement de travail, la deuxième la récolte des mesures des paramètres de QoS pertinents à la VoIP et la troisième l autoconfiguration ou la gestion autonome du réseau. 1 ère partie : Préparation de l environnement de travail En accord avec le client nous allons effectuer l ensemble du projet sous Unix, car cela nous permettra par la suite d utiliser des commandes Unix (ping f ) pour simuler une surcharge du réseau. De plus l unique solution IP-PBX libre (Asterisk) n est disponible que sur Linux. Nous allons donc installer un serveur IP-PBX sur lequel se connecteront les clients VoIP. Le protocole de VoIP utilisé sera SIP, l un des standards et le plus répandu chez les fournisseurs de services Internet (ISP). 2 ème partie : Récolter les mesures des paramètres de QoS pertinents à la VoIP Une communication téléphonique est une application réelle qui impose donc des contraintes de QoS au réseau que n'imposent pas les applications traditionnelles telles que FTP, Web et même telnet. La littérature sur le sujet converge vers les contraintes suivantes : 3
- Bande passante : sans compression, la voix nécessite 64 Kbps de bande passante, avec compression on peut descendre jusqu'à 5 Kbps. Dans ce dernier cas, la qualité du son est moins bonne et le temps de traitement pour la compression et la décompression au départ et à l'arrivée augmente ainsi le temps de latence. - La perte de paquets : la voix supporte bien les pertes de paquets par rapport à d'autres applications. On considère que le taux de pertes doit être inférieur à 20 %. A noter que la retransmission des paquets erronés ou perdus est inutile car elle induirait un temps de latence trop important. - La gigue : c'est une variation du délai de transmission de l'information. Elle provient de la variation de la charge du réseau (si la taille des files d'attente dans les routeurs augmente, le temps de latence augmente et inversement), éventuellement des routes différentes utilisées (IP est un mode sans connexion où un flot de datagrammes peut emprunter des chemins différents lors d'un même appel téléphonique). Cette gigue ne doit pas être trop importante. On peut diminuer celle-ci en ajoutant des mémoires tampons dans le chemin, mais cela peut engendrer une augmentation du temps de latence. Notre objectif est d'identifier les paramètres clés qui ont un impact fort sur les paramètres de QoS (bande passante, perte de paquets et gigue). Ensuite, nous utiliserons l'architecture DiffServ afin de garantir la QoS de bout en bout. Cela nécessite de mettre en œuvre un système de monitorage. Pour cela, nous allons utiliser l outil iperf qui se base sur le modèle client/serveur. Le serveur reçoit les mesures relevées sur les clients. Iperf a l avantage de pouvoir enregistrer les informations relevées dans un fichier. Pour exécuter le client à intervalle de temps régulier, nous allons utiliser crontab. Les mesures relevées seront affichées en temps réel dans la console principale qui sera mise à jour toutes les trente secondes. 3 ème partie : Auto-configuration du réseau Pour cette partie, nous considérons une machine dédiée sur laquelle est lancé en permanence un programme Java (7 heures par jour). Ce programme contiendra les paramètres minimaux du réseau (les mesures à ne pas dépasser). Lorsque les paramètres sont dépassés, ces derniers sont enregistrés dans la base de données. Le programme java identifiera ensuite le routeur qui possède le plus fort taux de congestion et lui indique qu il faudra privilégier les paquets qui concernent la VoIP. 4
4 ème partie : Documentation Au terme de notre projet, nous prévoyons de fournir une documentation qui contiendra les différentes étapes du projet. Cette documentation nous servira également pour notre rapport. Une personne du groupe sera chargée en partie de constituer cette documentation. III. Organisation du projet Pour réaliser ce projet nous nous sommes réparti les tâches en fonction des compétences techniques de chacun. Néanmoins tous les membres peuvent être sollicités pour travailler sur l ensemble du projet. Pour gagner du temps certaines tâches pourront être effectuées en parallèle. Comme par exemple la documentation qui sera effectuée tout au long du projet. La répartition dans notre groupe est la suivante : Ahmed BENSI sera le responsable de la gestion du projet. - Responsable du planning - Organisation des réunions de travail - Correspondance avec le client - Installation de l environnement de travail : Pei YU et Ahmed BENSI - IHM : Fatah HASSANI et Piotr BENSALEM. - Programmation Java : Romain BALARA Une fois les moyens identifiés, il convient de les organiser : définir les phases du projet et leurs échéances, préciser le rôle des intervenants des différentes parties pour le suivi de l avancement, organiser les réunions du comité de pilotage. Planning prévisionnel : Mardi 16/01 Jeudi 25/01 Présentation des projets par les clients Réponse à l appel d offre Mardi 06/03 Initialisation Mardi 03/04 Elaboration 1 Lundi 04/06 Documentation Vendredi 08/06 Construction, livraison finale 5
Organisation du projet : Un comité de direction et de pilotage a été constitué. Tous les mercredis après-midi aura lieu une réunion de comité de pilotage A chaque fin de phase, une réunion de comité directeur aura lieu (Exemple : 1 er et 2 nd avancement) Evaluation des charges : Phase Partie 1 : Préparation de l environnement de travail Partie 2 : Récolte des informations Partie 3 : Gestion autonome du réseau (programme java) Partie 4 : Documentation Tests unitaires Total Temps réalisation des fiches (en jour/personne) 5 j 25 j 10 j 5 j 5 j 50 j 6
IV. Architecture globale Après analyse du projet et validation du client, nous avons conçu l architecture globale ci-dessus : UC 3 UC 1 UC 4 UC 2 Pour mieux comprendre la suite du rapport, notamment les cas d utilisation, nous avons représenté ces derniers sur le schéma de l architecture globale. UC 1 : Récupérer les mesures UC 2 : Vérifier les paramètres UC 3 : Afficher les données UC 4 : Configurer le réseau Ces cas d utilisation sont décrits plus en détails dans le chapitre suivant. 7
V. Conception 1. Cas d utilisation et diagrammes des séquences Dans cette partie, nous allons décrire les cas d utilisation. Depuis la dernière réunion certaines modifications ont été apportées. Attention, le premier cas d utilisation est de niveau stratégique (haut niveau), c'est pour cela qu il regroupe l ensemble des cas d utilisation de niveaux inférieurs. SYSTEM : La station de surveillance et les routeurs PRIMARY ACTOR : Le serveur VoIP Astérisk USE CASE GENERAL: Auto-configuration d'un réseau VoIP SCOPE : Système de maintient de qualité de service d'un réseau informatique LEVEL : Stratégique INTENTION IN CONTEXT : Le cas étudié est la voix sur IP PRIMARY ACTOR : Le serveur VoIP Astérisk MAIN SUCCESS SCENARIO : 1. Récupérer les mesures 2 : Vérifier les paramètres 3 : Afficher les données 4. Configurer le réseau EXTENSIONS : 1.a Les données ne parviennent pas. Essayer à nouveau et au bout de X tentatives, échec de l UC Informer l administrateur du réseau par mail 3.a Les paramètres sont dépassés, le UC poursuit en 5 3.b Les paramètres ne sont pas dépassés, le UC reprend en 1 8
USE CASE 1 : Récupérer les mesures SCOPE : Système de maintient de qualité de service d'un réseau informatique LEVEL : Objectif-utilisateur INTENTION IN CONTEXT : Le client iperf envoie des mesures spécifiques au système. PRIMARY ACTOR : Le serveur VoIP Asterisk MAIN SUCCESS SCENARIO : 1. Exécuter les commandes prédéfinies sur les différents clients 2. Traiter le résultat des données obtenues EXTENSIONS: 2.a Les données ne parviennent pas. Essayer à nouveau, au bout de X tentatives, échec de l'uc. Envoyer un mail à l'administrateur. Les scripts qui permettent de relever les mesures seront exécutés toutes les trente secondes sur chaque client à l aide de la table crontab. Le diagramme suivant illustre les cas d utilisation 1 et 2. Le réseau et les bases de données sont les acteurs secondaires. Les données relevées sont en réalité les réponses des commandes exécutées sur les clients. Le traitement des données permet de les purger afin de ne retenir que l information (valeur) dont on a besoin. Il faut également les formater pour pouvoir les insérer dans la base de données. 9
Base de données Système Réseau Le système attend de nouvelles mesures Exécuter la commande pour relever les mesures Envoie des mesures relevées Insertion des données Traiter les données obtenues Confirmation (OK, Echec) Le système attend de nouvelles mesures Envoie des mesures relevées Exécuter la commande pour relever les mesures Traiter les données obtenues USE CASE 2 : Vérifier les paramètres SCOPE : Système de maintient de qualité de service d'un réseau informatique LEVEL : Objectif-utilsateur INTENTION IN CONTEXT : Le système vérifie que les mesures récupérées ne dépassent pas certains seuils. PRIMARY ACTOR : Le serveur VoIP Asterisk MAIN SUCCESS SCENARIO : 1. Le système attend l enregistrement de nouvelles mesures dans le fichier 2. Le système compare les nouvelles mesures aux seuils définis par l utilisateur. EXTENSIONS : 1.a. Aucune nouvelle donnée n a été enregistrée, le UC reprend à l'étape 1 2.a. Les seuils sont dépassés. On poursuit à l'uc n 5 2.b. Les seuils ne sont pas dépassés, on reprend à l'uc n 1 10
USE CASE 3 : Afficher les données SCOPE : Système de maintient de qualité de service d'un réseau informatique LEVEL : Objectif-utilisateur INTENTION IN CONTEXT : Le système affiche les données récoltées à partir des clients. PRIMARY ACTOR : Le serveur VoIP Asterisk MAIN SUCCESS SCENARIO : 1. Sélectionner les données à afficher (dernière ligne du fichier) 2. Afficher les données dans l interface principale java EXTENSIONS: 1.a Le système n arrive pas à lire le fichier. Au bout de X tentatives, informer l administrateur par mail. Le UC se termine en échec 2.b Aucune donnée n est sélectionnée. Ne rien faire, on reprend à l UC 1 On suppose que la fenêtre d affichage est l ihm principale, la demande d affichage dépend de ce que l administrateur souhaite voir (historique, ) On suppose que le système (programme java) est toujours connecté à la base de données. Administrateur Système Base de données Demande d affichage Sélection des données Réponse sélection Afficher les données 11
USE CASE 4 : Autoconfigurer le réseau SCOPE : Système de maintient de qualité de service d'un réseau informatique LEVEL : Objectif-utilsateur INTENTION IN CONTEXT : Quand les paramètres minimaux du réseau sont dépassés, le système exécute des scripts sur les routeurs afin de rétablir le service. PRIMARY ACTOR : Le serveur VoIP Asterisk MAIN SUCCESS SCENARIO : 1. Identifier les scripts à exécuter 2. Identifier les routeurs sur lesquels il faut exécuter ces derniers 3. Se connecter au(x) routeur(s) 4. Exécuter les scripts 5. Sauvegarder les résultats d'opération dans le log du Système. EXTENSIONS : 1.a les scripts correspondants n'existent pas, envoyer un mail à l administrateur. L UC se termine en échec. 3.a La connexion au(x) routeur(s) a échoué, envoyer un mail à l administrateur. L UC se termine en échec. 4.a Les scripts ne se sont pas correctement exécutés. Le UC reprend à l étape 1. Au bout de X tentatives, envoyer un mail à l administrateur. Les cas d utilisation 4 et 5 sont illustrés par le diagramme ci-dessous. 12
Base de données Système Réseau Mesures relevées Vérification des paramètres Récupérer les scripts Identifier les scripts à exécuter Envoie des scripts Identifier les routeurs sur lesquels exécuter les scripts Se connecter aux routeurs (Telnet) Connexion OK Envoie des scripts Confirmation (OK, Echec) Sauvegarder l opération dans le fichier log Exécuter les scripts 13
2. Diagramme de flux 14
3. Diagramme de classes 15
VI. Réalisation 1. Tester les performances du réseau Durant nos tests, nous avons rencontré des difficultés pour perturber la qualité de la voix. En effet le problème est que le routeur bénéficie d une file d attente importante et que les paquets de la voix sur IP arrivaient tout de même à passer (avec certes un léger retard). Pour remédier à ce problème nous avons annulé la file d attente grâce à la commande suivante : no fair-queue Ensuite nous avons diminué la bande passante jusqu à trouver la bande passante minimum qui nous permette d avoir une qualité correcte de la voix. La commande suivante nous permet de diminuer la bande passante (à exécuter évidement sur les routeurs) : clock rate 48 000 Le tableau ci-dessous montre les résultats que nous avons obtenus : Bande passante (kbits/s) Niveau de qualité de la voix 32 Très mauvaise 20-25 56 Mauvaise 15-20 64 Moyenne 10-15 72 Bonne 0-5 115 Bonne 0 Retard (seconde) La bande passante qui nous permet donc d obtenir un niveau de qualité correcte (bonne qualité de la voix et sans retard) est de 115 kbits/s. Comme iperf (défini dans la suite) envoie massivement des paquets sur le réseau. Nous choisissons finalement une bande passante minimum de 128 kbits/s. Cela nous permet d avoir une qualité correcte de la voix avec le trafic généré par plusieurs clients iperf. 16
Comment dégrader la voix? L outil ping nous permet de surcharger le réseau afin de dégrader la voix. En effet la commande ping f 192.168.2.3 permet l envoie massif de paquets ICMP vers la machine 192.168.2.3. Deux fichiers au format mp3 sont disponibles sur le site du projet aux adresses : - Avant de flooder le réseau : http://hassani.fatah.club.fr/voip/avant.mp3 - Après avoir foodé le réseau : http://hassani.fatah.club.fr/voip/après.mp3 2. Récupérer les mesures du réseau L outil que nous utilisons pour relever les performances de notre réseau est IPERF. Cet outil disponible sur de nombreuses plateformes (Linux, BSD, Mac, Windows), se présente sous la forme d une ligne de commande à exécuter sur deux machines disposées aux extrémités du réseau à tester. Il est basé sur le modèle client / serveur selon le diagramme suivant : Cet outil nous permet de relever l ensemble des paramètres critiques à la VoIP (gigue, bande passante, perte de paquet). Cependant cet outil présente un inconvénient qui est qu on doit le lancer manuellement à chaque nouvelle mesure. La solution que nous avons trouvé pour remédier à ce problème est de créer un script iperf et de le rajouter dans crontab. Le script iperf (sans extension) se trouve en annexe (II.1). 17
La structure de crontab est la suivante : Minute Heure Jours Semaine Mois script * 9-18 1-5 * * /home/tp/iperf Cela signifie que le script sera lancé : - Toutes les minutes - De 9 H 00 à 18 H 00 - Du lundi au vendredi (0 indique le dimanche) - Toutes les semaines - Tous les mois Par ailleurs, pour recevoir les données des clients iperf, il faut démarrer le serveur iperf grâce à la commande suivante : iperf s u f m > iperf.txt -s : signifie qu il s agit du serveur -f m : indique que les données relevées vont être converties en Mégabits (kilobits par défaut) > iperf.txt : signifie que les données relevées vont être enregistrées dans un fichier iperf.txt. Cette commande peut être écrite dans un fichier script, ainsi de la même manière que pour le client iperf on peut utiliser crontab pour que le script soit lancé 7 heures par jour. Le fichier iperf.txt est écrasé à chaque nouvelle insertion. 18
3. Auto-configurer le réseau Lorsque le système détecte un dépassement de l un des seuils. Celui-ci se connecte sur chacun des routeurs et relève le taux de congestion du routeur en question (correspond à l étape Identification du routeur). Ensuite on exécute un script sur le routeur qui permet de marquer les paquets en fonction de leur protocole. Puis on exécute un troisième script qui permet de traiter les paquets propres à la voix sur IP en priorité. C est le principe de DiffServ que nous mettons ici en place. Pour établir une qualité de service il faut tout d'abord sélectionner les flux qu'on veut différencier. Pour cela on utilise une certaine technique de filtrage disponible dans l'ios du routeur CISCO qui est l'utilisation d'acls (Access Control List). L ensemble des scripts d auto-configuration commentés se trouve en annexe. SETDSCP.script : Permet de marquer le flux, marquer le type de paquet en fonction du protocole utilisé. class-map : Permet de classifier le flux en suivant une politique de priorité des paquets propres à la voix sur IP. VOIP.script : Permet de relever le taux de congestion sur le routeur, la bande passante et la perte de paquet. 19
VII. Environnement de travail Comme prévu dans la réponse au cahier des charges, nous nous sommes réparti les tâches selon les compétences. Nous avons donc décider de créer deux groupes, un groupe plutôt orienté système et réseau et un groupe orienté développement. Le premier groupe est chargé de l installation de l environnement de travail (installation du serveur VoIP, routeurs, PostgreSQL). Le second groupe s est penché sur la conception de l interface graphique. 1. Installation du serveur VoIP Asterisk Nous avons installé avec succès le serveur VoIP sur Linux Debian. Ci-dessous la démarche que nous avons suivie : 1. Pré-requis : Les packages suivants doivent être installés avant de procéder à l'installation d'asterisk - Linux 2.4 kernel sources (http://www.kernel.org/pub/) - bison et bison-devel (http://ftp.gnu.org/pub/gnu/bison/) - ncurses et ncurses-devel - zlib et zlib-devel - openssl et openssl-devel 2. Télécharger les sources à cette adresse : www.asterisk.org/downloads 3. décompresser les sources : # tar zxvf asterisk-1.4.2.tar.gz 4. Compilation des sources : # cd asterisk-1.4.2 #./configure # make # make install # make samples # make progdocs 5. Pour lancer Asterisk en mode console : # /usr/sbin/asterisk -c 20
Pour la configuration, étant donné que nous n allons pas utiliser de carte voix (pour la connexion de ligne analogique France télécoms). Nous allons utiliser que deux fichiers de configuration parmi la dizaine qu utilise Asterisk. Ces fichiers sont sip.conf pour l ajout de clients VoIP et le fichier et extensions.conf pour le plan de routage. Nous avons choisi le protocole sécurisé de VoIP SIP. C est pour cela que nous modifions le fichier sip.conf. Par la suite nous n utilisons que les commandes commençant par sip (help pour les lister). Création d un utilisateur (ClientA, n d appel 101, mdp password) dans le fichier sip.conf : [general] context=default srvlookup=no [ClientA] type=friend username= ClientA secret=password Callerid : "" <101> quality=yes nat=no canreinvite=no auth=md5 host=dynamic dtfmode=rfc2833 allow=ulaw context=internal Création d un utilisateur (ClienB, n d appel 102, mdp password) [general] context=default srvlookup=no [ClientB] type=friend username= ClientB secret=password Callerid : "" <102> quality=yes nat=no canreinvite=no auth=md5 host=dynamic dtfmode=rfc2833 21
allow=ulaw context=internal La commande sip show users nous confirme la création des utilisateurs : Username Secret Accountcode Def.Context ACL NAT ClientA password internal No RFC3581 ClientB password internal No RFC3581 Ci-dessous notre plan de routage qui se trouve dans le fichier extensions.conf. ; ClientA exten => 101,1,wait(1) exten => 101,2,Dial,SIP/ ClientA exten => 101,3,Hangup ; ClientB exten => 102,1,wait(1) exten => 102,2,Dial,SIP/ ClientB exten => 102,3,Hangup 2. Installation du serveur base de données Nous avons choisi PostgreSQL comme serveur de base de données car ce dernier est facile à installer et ne demande pas énormément de ressources (contrairement à Oracle). De plus il est très bien documenté sur Internet (contrairement à MySQL). Ci-dessous la démarche que nous avons suivie : 1- Téléchargement des sources : apt-get install postgresql 2- Démarrer le serveur : /sbin/service postgresql start 3- Dans le fichier /var/lib/pgsql/data/postgresql.conf, décommeneter la ligne : tcpip_socket = true 4- L utilisateur postgres est créé par défaut (mdp posgres). C est le seul utilisateur autorisé à se connecter à la base. 5-Créer une base de données voip_db : psql createdb voip_db 22
6- Démarrer la base de données : psql -d voip_db 7- Créer la table monitor dans laquelle seront sauvegardées les informations relevées lorsque les seuils sont dépassés. On sauvegarde dès que le seuil d un paramètre est dépassé. Le script de création de la table se trouve en annexe (I.1). Ci-dessous la structure de la table Attribut ID Bande passante Gigue Perte de paquets Date Type serial Varchar Varchar Varchar Varchar L attribut ID est la clé primaire. Il est de type serial, ce qui signifie que c est une séquence. ID sera incrémenté à chaque nouvelle insertion dans la table. 3. Installation du réseau Nous avons essayé de construire un réseau complexe pour reproduire les conditions et les contraintes d un vrai réseau d entreprise voir du réseau Internet. Le schéma ci-dessous montre le «câblage» que nous avons effectué : 23
Configuration des routeurs Pour réaliser notre projet nous disposons de deux switchs ainsi que de quatre routeurs fournis par le client. Il s agit de routeurs CISCO 1841 qui possèdent trois interfaces en état de fonctionnement : - 2 interfaces Ethernet - 1 interface série Tout d abord nous avons besoin d affecter une adresse IP à l une des interfaces réseau pour qu on puisse y accéder en Telnet à partir du réseau. Pour cela on se connecte directement sur le port console du routeur à partir du port série de notre PC portable. La vitesse d Hyperterminal est de 9800 bauds. Interface série Port console Voici les commandes à saisir pour chaque routeur : Attribuer un nom au routeur : hostname voip_r1 Indiquer l interface concernée eth0 : line vty 0 Attribuer un login au routeur : voip_r1(config-line)#login Attribuer un mot de passe : voip_r1(config-line)#password cisco Sortir du mode config-line : voip_r1 (config-line)#exit Pour sauvegarder la configuration : copy running-config startup-config Il faudra effectuer la même opération sur les autres routeurs voip_r2, voip_r3 et voip_r4. La configuration de l ensemble des routeurs est détaillée en annexe (I.2). 24
4. Inter-opérabilité des composants Pour que nos différents composants (serveur, base de données, routeurs) puissent communiquer entre eux, il faut télécharger les modules suivants : JDBC : La technologie JDBC (Java DataBase Connectivity) est une API fournie avec Java (depuis sa version 1.1) permettant de se connecter à des bases de données. L'API JDBC a été développée de telle façon à permettre à un programme de se connecter à n'importe quelle base de données en utilisant la même syntaxe, c'est-à-dire que l'api JDBC est indépendante du SGBD. De plus, JDBC bénéficie des avantages de Java, dont la portabilité du code, ce qui lui vaut en plus d'être indépendant de la base de données et de la plate-forme sur laquelle elle s'exécute. On pourrait croire que ce module est téléchargeable sur le site de SUN puisqu il s agit de java mais au contraire, c est sur le site de PostgresSQL que nous avons trouvé ce dernier. Dans notre programme java, nous indiquons ensuite le chemin où se trouve ce module. Apache : Ce module va nous permettre de nous connecter sur le routeur via une session Telnet. Ensuite on pourra relever le taux de congestion et exécuter les scripts d auto-configuration sur les routeurs. De même que pour le module JDBC il faudra indiquer le chemin où se trouve ce module dans notre programme java. Ce module est évidement téléchargeable sur le site du développeur Apache. 25
VIII. Documentation 1. Guide de l utilisateur Le terme utilisateur désigne ici la personne qui va utiliser le service VoIP et qui souhaite bénéficier d un niveau de qualité de service correct. Dans cette partie nous allons donc décrire comment se connecter tout d abord au serveur VoIP puis la procédure à suivre pour bénéficier d un bon niveau de QoS. Cette partie peut sembler inutile mais avec la topologie réseau et la configuration du serveur qui semblent assez complexes, il est important que les clients soient bien configurés pour identifier le problème. a) Se connecter au serveur Pour se connecter à notre serveur VoIP il faut un logiciel (client) supportant le protcole SIP. Nous avons choisi Xlite, disponible sous différentes plateformes à l adresse suivante : http://www.counterpath.com/index.php?menu=download/ Puis nous avons suivi la démarche suivante : 1 - Décompresser le fichier X-Lite_Install.tar.gz 2 - Dans le répertoire X-Lite_Install exécuter xtensoftphone 3 Configurer le ClientA créé précédemment dans le serveur en cliquant sur «Menu» / «System Settings». Ensuite saisir les informations nécessaires comme le montre la figure ci-dessous : Fenêtre principale X-lite 26
Fenêtre de configuration Rappel : L adresse IP de notre serveur VoIP est 192.168.2.3 b) Bénéficier d un bon niveau de QoS Pour bénéficier du service, il faut que le client dispose de l outil iperf qui est téléchargeable à cette adresse : http://dast.nlanr.net/projects/iperf1.1.1/ On suppose que le client est sous plateforme Linux. Cela nous permettra de lancer le client toutes les 30 secondes à l aide de crontab. Le client iperf enverra les caractéristiques réseau au serveur iperf qui se trouve sur la machine de surveillance. Les scripts pour cette partie se trouvent en annexes. 27
2. Guide de l administrateur Le terme administrateur désigne la personne qui sera responsable de la qualité de la VoIP sur le réseau. Il s agit en général de l administrateur réseau. L administrateur peut télécharger le logiciel à l adresse suivante : http://abensi.free.fr/projet/voip_v1.0.zip Au cours de notre projet, nous avons abandonné l idée d une interface graphique sous la forme d un simple fichier XML au profit d une interface java plus conviviale. Nous proposons l interface graphique ci-dessous que nous avons élaborée avec le client : Fenêtre principale Nous avons choisi d afficher les trois critères de qualité de service liés à la VoIP dans la console principale, ce qui permet à l administrateur d y accéder très facilement. Ainsi, avec un seul coup d œil l administrateur du réseau peut superviser le réseau. 28
Par ailleurs, dans la partie supérieure de l interface, nous avons représenté par des boutons les fonctionnalités les plus importantes pour l administrateur. Il suffira donc pour l administrateur de cliquer sur le bouton souhaité pour accéder facilement à sa fonctionnalité. Comme par exemple la fonctionnalité «Historique» qui permet de consulter la base de données et d afficher l historique des dépassements de seuils. Fenêtre pour l historique Par défaut les seuils sont initialisés à : - bande passante : 1.10 Mbits/s - gigue : 2 ms - perte de paquets : 2% Néanmoins un simple click sur le bouton «configurer» permet de saisir de nouveaux seuils. Fenêtre de configuration 29
Fenêtre de saisie des seuils En cliquant sur le bouton «exporter», on pourra exporter les données affichées dans l historique sous un format exploitable (au format txt). Fenêtre exporter Le bouton «actualiser» permet d actualiser l affichage de la fenêtre principale. En effet les paramètres (gigue, bande passante, perte de paquet) sont affichés sur la console principale toutes les 30 secondes. Cliquer sur le bouton «actualiser» permet d outrepasser ce délai. Le bouton «Manuel» est un simple lien vers la documentation. Cette documentation n est autre que ce rapport au format PDF. Le bouton «imprimer» n est pas pour le moment fonctionnel. Ce dernier aura pour objectif d imprimer l historique de dépassement des seuils. (on pense qu il sera fonctionnel pour le jour de la présentation). 30
IX. Conclusion Bilan des travaux Contexte du problème Depuis 1988, avec une évolution de la qualité de services devenant primordiale, les recherches menées sur les mécanismes de contrôle de congestion n'ont jamais cessé. De nos jours, avec l'accroissement du nombre de lignes à haut débit, les applications à flux de données en temps réel (vidéos, audio, ) se sont rapidement répandues sur Internet. Ce type d'applications, supportant mal les fortes variations de débit imposées par le protocole TCP, a conduit à de nombreuses études visant à développer un contrôle adapté de Qualité de bout en bout. La première partie de notre travail a surtout consisté à se documenter sur le sujet assez récent qu est la VoIP avec DiffServ et d'apprendre les fonctionnalités que pouvaient offrir un routeur. La deuxième partie a été la mise en place de l'architecture VoIP avec l'installation d'un serveur Asterisk avec deux clients "softphone" et la configuration de quatre routeurs. Nous avons ensuite floodé le réseau pour tester la qualité de la voix puis effectué le monitoring sur l'état du réseau en temps réel. Nous avons enfin mis en place DiffServ pour rétablir la qualité. Quant à la dernière partie, elle concerne la capacité de détecter la présence de congestions sur l'un des routeurs pour refuser une nouvelle demande d utilisateur de manière à garantir la qualité de la VoIP pour ceux qui ont déjà établi une connexion. Ce sujet nous a permis d'approfondir nos connaissances dans le domaine des réseaux. Il nous a également appris l'importance du dynamisme et de la coordination dans une équipe. Perspectives Les travaux menés durant ce semestre nous ont permis d'entrouvrir certaines pistes de recherche. De plus, les bons résultats obtenus par le mécanisme de contrôle de Qualité proposé ont confirmé l'intérêt de ce type d'application. 31
X. Annexes SOMMAIRE I. Environnement de travail... 1 1. Script de création de la table monitor... 1 2. Configuration des routeurs CISCO... 1 II. Réalisation... 3 1. Récupérer les données script : iperf... 3 2. Scripts d auto-configuration... 3 3. Programme Window.java commenté... 6 32
I. Environnement de travail 1. Script de création de la table monitor Create table monitor (id serial primary key, bandepassante varchar(50), gigue varchar(50), pertedepaquets varchar(50), Date date); 2. Configuration des routeurs CISCO a) Attribution des adresses IP sur voip_r1 conf t int FastEthernet 0/0/0 ip address 192.168.1.254 255.255.255.0 no shut ( pour l'activer) int FastEthernet 0/1/0 ip address 10.1.1.1 255.0.0.0 no shut int serial 0/1/0 ip address 192.168.3.1 255.255.255.0 no shut sur voip_r2 conf t int FastEthernet 0/0/0 ip address 10.1.1.2 255.0.0.0 no shut int FastEthernet 0/1/0 ip address 192.168.2.254 255.255.255.0 no shut int serial 0/1/0 ip address 192.168.4.2 255.255.255.0 no shut sur voip_r3 conf t int FastEthernet 0/0 ip address 10.1.2.3 255.0.0.0 int FastEthernet 0/1 ip address 192.168.2.253 255.255.255.0 no shut int serial 0/1/0 ip address 192.168.3.3 255.255.255.0 no shut 1
sur voip_r4 conf t int FastEthernet 0/0/0 ip address 10.1.2.4 255.0.0.0 no shut int FastEthernet 0/1/0 ip address 192.168.1.252 255.255.255.0 no shut int serial 0/1/0 ip address 192.168.4.4 255.255.255.0 no shut b) Le Routage On a choisit le routage dynamique RIP. Il suffit d indiquer l adresse des réseaux auxquels est connecté les interfaces du routeur sont directement connectés. sur voip_r1 router rip network 192.168.1.0 network 192.168.3.0 network 10.1.1.0 sur voip_r2 router rip network 193.168.2.0 network 192.168.4.0 network 10.1.1.0 sur voip_r3 router rip network 195.168.2.0 network 192.168.3.0 network 10.1.2.0 sur voip_r4 router rip network 195.168.1.0 network 192.168.4.0 network 10.1.2.0 2
II. Réalisation 1. Récupérer les mesures : script iperf crontab pour le client : nom : iperf sans extension contenu : iperf c 192.168.2.3 u sleep 30 iperf c 192.168.2.3 u pour éditer crontab : crontab e 2. Script d auto-configuration Autoriser les paquets udp du port 1000 au port 6000 > access-list 101 permit udp any any range 1000 6000 Autoriser les applications tacacs, www, telnet, smtp,ftp > access-list 102 permit tcp any any eq tacacs > access-list 104 permit tcp any any eq www > access-list 105 permit ip any any > access-list 108 permit tcp any any eq telnet > access-list 109 permit tcp any any eq smtp > access-list 110 permit tcp any any eq ftp SETDSCP.script Marquer le flux, marquer type de file d'attente associée aux flux marqués. Il est prévu 6 classes de service: EF (Expedited Forwarding), AF(Assured Forwarding)1, AF21, AF22, AF23, AF3. EF: Bande passante garantie, très faible gigue, pas de pertes de paquets. AF: Classification du trafic: 3
Après avoir établie le filtrage il faut classifier les différents flux et les mettre dans des groupes différents. Classification des flux avec des "class-map" >class-map match-all EF match access-group 101 class-map match-all AF1 match access-group 102 class-map match-all AF21 match access-group 108 class-map match-all AF22 match access-group 109 class-map match-all AF23 match access-group 110 class-map match-all AF3 match access-group 104 Le marquage et l'identification des flux marqués sont basés surl'utilsation de valeurs DSCP (Differenciated Service Code Point). Règles pour la gestion des classes avec des "policy-map". Définition "policy-map" IN: pour gérer le "policing" sur l'interface FastEthernet du Routeur 1 et Routeur 4. C'est dans cette section que l'on a défini les actions liées aux dépassements de débit ou paquets non conformes(jeter les paquets en excès, re-marquage du champ DSCP...) policy-map SETDSCP class EF set ip dscp 46 class AF1 set ip dscp 10 class AF21 set ip dscp 18 class AF22 set ip dscp 20 class AF23 set ip dscp 22 class AF3 set ip dscp 26 En résume pour le script SETDSCP.script Class-map EF: flux marqués DSCP 46, et réseaux autorisés via ACL 101 Class-map AF1: flux marqués DSCP 10, et réseaux autorisés via ACL 102 Class-map AF21: flux marqués DSCP 18, et réseaux autorisés 4
via ACL 108 Class-map AF22: flux marqués DSCP 20, et réseaux autorisés via ACL 109 Class-map AF23: flux marqués DSCP 22, et réseaux autorisés via ACL 110 Class-map AF3: flux marqués DSCP 26, et réseaux autorisés via ACL 104 VOIP.script: > class-map match-all premium > match ip dscp 46 > class-map match-all gold > match ip dscp 10 12 14 > class-map match-all silver > match ip dscp 18 20 22 > class-map match-all bronze > match ip dscp 26 28 30 > class-map best-effort > match access-group 105 Définition policy-map OUT pour gérer le "quequing"(dans les tests effectués elle est appliquée en sortie de l'interface FE du Routeur 1 et Routeur 4) > policy-map VOIP > class premium > priority 500 Bande passante minimum réservée en cas de congestion (en Kbit/s) > class gold > bandwidth percent 35 Pourcentage de la bande passante restante pouvant être récupérée par la classe > class silver > shape average 320000 > bandwidth percent 25 > class bronze > bandwidth percent 15 > class best-effort police 56000 1750 1750 conform-action set-dscp-transmit 0 Pour désinstaller DiffServ > no policy-map SETDSCP > no class-map EF > no class-map AF1 > no class-map AF21 5
> no class-map AF22 > no class-map AF23 > no class-map AF3 > > no policy-map VOIP > no class-map premium > no class-map gold > no class-map silver > no class-map bronze > no class-map best-effort Applications des "policy-map" IN/OUT > int FastEthernet0/0 > service-policy input SETDSCP > int serial 0/1/0 > service-policy output VOIP 3. Programme Window.Java import java.sql.*; import java.awt.*; import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; import java.io.*; import java.lang.thread; import java.util.date; import java.text.dateformat; import java.text.simpledateformat; // classe principale de l'interface graphique public class Window implements ActionListener{ static WindowFrame window; // cadre de la fenêtre avec menu static Window windowcontent; // contenu de la fenêtre static ConfWindow confwindow; // fenêtre de configuration des seuils static ExportWindow exportwindow; // fenêtre de sauvegarde static HistoWindow histowindow; // fenêtre affichant l'historique static String ip; // variables contenant les valeurs des paramètres 6
static String bandepassante; static String gigue; static String pertedepaquets; // variables contenant les seuils des paramètres static int seuilbandepassante = 110; static int seuilgigue = 2000; static int seuilpertedepaquets = 20; // composants de l'interface graphique static JButton actualiser, exporter, configurer, imprimer, manuel, historique; static JTextArea output1; static JTextArea output2; static JProgressBar bandepassantebar; static JProgressBar giguebar; static JProgressBar pertedepaquetsbar; static JLabel lbar1; static JLabel lbar2; static JLabel lbar3; static JScrollPane scrollpane; // méthode retournant l'adresse IP public static String getip(){ return (ip); // méthode utilisée pour consulter la bande passante public static int getbandepassante(){ return ((int)(double.parsedouble(bandepassante)*100)); // méthode utilisée pour consulter la gigue public static int getgigue(){ return ((int)(double.parsedouble(gigue)*1000)); // méthode utilisée pour consulter la perte de paquets public static int getpertedepaquets(){ return ((int)(double.parsedouble(pertedepaquets)*10)); // méthode utilisée pour modifier la valeur du seuil de la bande passante public static void setseuilbandepassante(string seuil){ seuilbandepassante = (int)(double.parsedouble(seuil)*100); // méthode utilisée pour modifier la valeur du seuil de la gigue public static void setseuilgigue(string seuil){ seuilgigue = (int)(double.parsedouble(seuil)*1000); // méthode utilisée pour modifier la valeur du seuil de la perte de paquets public static void setseuilpertedepaquets(string seuil){ seuilpertedepaquets = (int)(double.parsedouble(seuil)*10); 7
// méthode construisant le contenu de la fenêtre de l'interface private void Content() { FlowLayout flowl = new FlowLayout(FlowLayout.LEFT); GridLayout diaglayout = new GridLayout(0,4,10,10); Container content = window.getcontentpane(); // panel contenant les boutons JPanel boutons = new JPanel(); boutons.setlayout(flowl); // ajout des boutons actualiser = new JButton(new ImageIcon("images/Actualiser.png")); exporter = new JButton(new ImageIcon("images/Exporter.png")); configurer = new JButton(new ImageIcon("images/Configurer.png")); imprimer = new JButton(new ImageIcon("images/Imprimer.png")); manuel = new JButton(new ImageIcon("images/Manuel.png")); historique = new JButton(new ImageIcon("images/Historique.png")); actualiser.setborder(new TitledBorder( LineBorder.createBlackLineBorder(),"Actualiser",TitledBorder.CENTER, TitledBorder.TOP,new Font ("SansSerif", Font.BOLD, 10))); exporter.setborder(new TitledBorder( LineBorder.createBlackLineBorder(),"Exporter",TitledBorder.CENTER, TitledBorder.TOP,new Font ("SansSerif", Font.BOLD, 10))); configurer.setborder(new TitledBorder( LineBorder.createBlackLineBorder(),"Configurer",TitledBorder.CENTER, TitledBorder.TOP,new Font ("SansSerif", Font.BOLD, 10))); imprimer.setborder(new TitledBorder( LineBorder.createBlackLineBorder(),"Imprimer",TitledBorder.CENTER, TitledBorder.TOP,new Font ("SansSerif", Font.BOLD, 10))); manuel.setborder(new TitledBorder( LineBorder.createBlackLineBorder(),"Manuel",TitledBorder.CENTER, TitledBorder.TOP,new Font ("SansSerif", Font.BOLD, 10))); historique.setborder(new TitledBorder( LineBorder.createBlackLineBorder(),"Historique",TitledBorder.CENTER, TitledBorder.TOP,new Font ("SansSerif", Font.BOLD, 10))); // ajout des écouteurs actualiser.addactionlistener(this); exporter.addactionlistener(this); configurer.addactionlistener(this); imprimer.addactionlistener(this); manuel.addactionlistener(this); 8
historique.addactionlistener(this); // ajout des boutons au panel boutons.add(actualiser); boutons.add(exporter); boutons.add(configurer); boutons.add(imprimer); boutons.add(manuel); boutons.add(historique); boutons.setborder(borderfactory.createetchedborder()); // ajout du panel boutons au conteneur principal content.add(boutons, BorderLayout.NORTH); // panel affichant le diagnostic sous forme de barres de niveau pour chaque paramètre JPanel diagnostic = new JPanel(); diagnostic.setlayout(diaglayout); // panel affichant l'adresse IP ainsi que la date et l'heure de la dernière mise à jour JPanel panel = new JPanel(); output2 = new JTextArea(13,17); output2.seteditable(false); panel.add(output2); diagnostic.add(panel); // barre de niveau de la bande passante JPanel bar1 = new JPanel(); lbar1 = new JLabel(); bandepassantebar = new JProgressBar(0,120); bandepassantebar.setorientation(jprogressbar.vertical); bandepassantebar.setvalue(0); bandepassantebar.setstringpainted(false); bar1.add(bandepassantebar); bar1.add(lbar1); bar1.setborder(borderfactory.createtitledborder("bande passante")); diagnostic.add(bar1); // barre de la gigue JPanel bar2 = new JPanel(); lbar2 = new JLabel(); giguebar = new JProgressBar(0,2000); giguebar.setorientation(jprogressbar.vertical); giguebar.setvalue(0); giguebar.setstringpainted(false); bar2.add(giguebar); bar2.add(lbar2); bar2.setborder(borderfactory.createtitledborder("gigue")); 9
diagnostic.add(bar2); // barre de la perte de paquets JPanel bar3 = new JPanel(); lbar3 = new JLabel(); pertedepaquetsbar = new JProgressBar(0,30); pertedepaquetsbar.setorientation(jprogressbar.vertical); pertedepaquetsbar.setvalue(0); pertedepaquetsbar.setstringpainted(false); bar3.add(pertedepaquetsbar); bar3.add(lbar3); paquets")); bar3.setborder(borderfactory.createtitledborder("perte de diagnostic.add(bar3); diagnostic.setborder(borderfactory.createtitledborder("diagnost ic")); content.add(diagnostic,borderlayout.center); iperf // Zone de texte affichant les données récupérées par output1 = new JTextArea(10,80); output1.seteditable(false); scrollpane = new JScrollPane(output1); scrollpane.setborder(borderfactory.createtitledborder("analyse du réseau")); content.add(scrollpane,borderlayout.south); // méthode déclenchant les actions lors des clics sur les boutons public void actionperformed(actionevent e) { Object source=e.getsource(); if (source==actualiser) affichage(); if (source==exporter) exportwindow = new ExportWindow(); if (source==configurer) confwindow.setvisible(true); if (source==imprimer) System.out.println("imprimer!"); if (source==manuel) System.out.println("manuel!"); 10
iperf { if (source==historique){ histowindow.affichagebd(); histowindow.setvisible(true); // méthode récupérant les données du fichier texte généré par public static String lecture(string f) throws IOException BufferedReader lecteuravecbuffer = null; String ligne; String analyse = new String(); int beginindex; int endindex; int i=0; try { lecteuravecbuffer = new BufferedReader(new FileReader(f)); catch(filenotfoundexception exc) { System.out.println("Erreur d'ouverture"); while ((ligne = lecteuravecbuffer.readline())!= null){ if((beginindex = ligne.indexof("with"))!= -1){ endindex = ligne.indexof("port",beginindex); ip = ligne.substring((beginindex+5),(endindex- 1)); analyse=(""); if((beginindex = ligne.indexof("mbytes"))!= -1 ){ endindex = ligne.indexof("mbits"); bandepassante = ligne.substring((beginindex+8),(endindex-1)); beginindex = ligne.indexof("mbits/sec"); endindex = ligne.indexof("ms"); gigue = ligne.substring((beginindex+11),(endindex-1)); beginindex = ligne.indexof("("); endindex = ligne.indexof("%"); pertedepaquets = ligne.substring((beginindex+1),(endindex)); analyse=analyse.concat(" mesure n "+(i+1)+" = bande passante: "+bandepassante+" Mbits/sec; gigue: "+gigue+" ms; perte paquets: "+pertedepaquets+" %"+"\n"); i++; lecteuravecbuffer.close(); return(analyse); 11
// méthode utilisée pour insérer les valeurs des paramètres dans la base de données public static void insertionbd () { try { Class.forName("org.postgresql.Driver"); catch (Exception e) { System.err.println("Pas de pilote!"); String bp="test"; String url = "jdbc:postgresql://localhost/voip_db"; String entree = null; try { Runtime r = Runtime.getRuntime(); Process p = r.exec(bp); p.waitfor(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); entree = br.readline(); entree.tostring(); System.out.println(entree); catch(exception e) { System.out.println("erreur d'execution " + bp + e.tostring()); try { Connection conn = "postgres", "voip"); DriverManager.getConnection(url, Statement st = conn.createstatement(); int nb = st.executeupdate(" insert into monitor values(nextval('monitor_id_seq'),"+bandepassante+","+gigue+","+perted epaquets+",current_timestamp,1515);" ); System.out.println(nb + " ligne(s) inserée(s)") ; st.close(); catch (SQLException e) { System.err.println(e.getMessage()); // méthode affichant les données récupérées par iperf dans la zone de diagnostic 12
public static void affichage() { Date date = new Date(); DateFormat dateformat = new SimpleDateFormat("dd/MM/yy hh':'mm':'ss"); boolean flag = false; bandepassantebar.setvalue(getbandepassante()); bandepassantebar.setforeground(color.green); if (getbandepassante()>seuilbandepassante) { flag=true; bandepassantebar.setforeground(color.red); lbar1.settext(" "+bandepassante+" Mb/s"); giguebar.setvalue(getgigue()); giguebar.setforeground(color.green); if (getgigue()>seuilgigue) { giguebar.setforeground(color.red); flag=true; lbar2.settext(" "+gigue+" ms"); pertedepaquetsbar.setvalue(getpertedepaquets()); pertedepaquetsbar.setforeground(color.green); if (getpertedepaquets()>seuilpertedepaquets){ pertedepaquetsbar.setforeground(color.red); flag=true; lbar3.settext(" "+pertedepaquets+" %"); if (flag==true) insertionbd(); output2.settext(""); output2.append("\n"); output2.append(" Client: "+getip()+"\n"); output2.append("\n"); output2.append(" Dernière mise à jour: \n\n"); output2.append(" "+dateformat.format(date)); // méthode principale qui instancie les fenêtres de l'interface graphique // et qui effectue une mise à jour toutes les trentes secondes public static void main(string[] args) throws IOException{ long temps = 30000; window = new WindowFrame("Call Control v.1.0"); // pour centrer la fenêtre Toolkit lekit = window.gettoolkit(); Dimension wndsize = lekit.getscreensize(); window.setbounds(wndsize.width/6, 13
wndsize.height/6, 3*wndSize.width/4, 3*wndSize.height/4); windowcontent= new Window(); windowcontent.content(); confwindow = new ConfWindow ("Configurer"); histowindow = new HistoWindow("Historique"); window.setvisible(true); try { while(true){ output1.append(lecture("iperf.txt")); affichage(); Thread.sleep(temps); catch(filenotfoundexception exc) { System.out.println("Erreur d'ouverture"); catch(interruptedexception exc) { System.out.println("Erreur sleep"); //fin du main 14