OPNET Technologies
7255 Woodmont Avenue
Bethesda, MD 20814

Tel: 240-497-3000

Fax: 240-497-3001
E-mail: university@opnet.com
Web: www.opnet.com

OPNET is a registered
trademark of OPNET Technologies

© 2001 OPNET Technologies


Contributeurs : Julien Bourgeois, Sofiane Sellah, Srikanth B. Yoginath

Objectifs du modèle

 

Dans la perspective d’étudier le comportement des applications multimédia et de proposer de nouveaux mécanismes et de nouvelles techniques dans le transfert du multimédia il s’est avéré que le recours à la modélisation est un choix inévitable pour des raisons économiques et techniques.

Ainsi pour couronner les efforts qui ont été fait dans le cadre de MoVie et tester l’efficacité de solutions proposées afin améliorer les services et les applications multimédia dans les réseaux sans-fil.

L’objectif initial de cette étude était de réaliser un modèle de dispositif de transcodage multimédia dont le rôle est d’adapter les flux multimédia provenant d’un serveur ou plusieurs serveurs. Mais en réalité les modèles de client et serveur qui existent dans l’outil de modélisation que nous avons choisis sont implémenté au niveau frame, c'est-à-dire que l’unité d’échange entre le client et les serveurs est le bloc d’image (frame). Le découpage et le transport de ces blocs se fait au niveau du protocole de transport tels que TCP ou UDP. Par contre, un mixeur agit sur des formats de paquets définis dans la norme RTP (Real-time Transport Protocol). Nous avons décidé de commencer par le développement d’un modèle client et d’un modèle de serveur qui communiquent par l’utilisation du protocole RTP. Au terme de cette première étape nous disposerons de deux composants réseaux (nœuds) qui intègrent des fonctionnalités de transfert de flux multimédia conforme aux normes RTP et RTCP (Real-time Transport Control Protocol). Dans la deuxième étape de ce travail. On propose de passer d‘une architecture à deux tiers (client – serveur) pour la transmission de flux multimédia à une architecture à trois tiers. Ceci nécessite d’apporter des modifications sur les deux modèles de client et de serveur développés précédemment, puis de développer le composant mixeur.

 

Concepts de modélisations avec OPNET Modeler

 

OPNET Modeler présente trois domaines de modélisation organisés de manière hiérarchique : Le domaine réseau, le domaine nœud et le domaine processus.

 

1.     Domaine réseau (network domain)

 

C’est le niveau le plus élevé de la modélisation. Il s’agit à ce niveau d’exploiter des modèles qui sont déjà existants dans la bibliothèque pour construire un modèle de réseau. On peut choisir la topologie du réseau, le type de liens pour interconnecter les composants du réseau, les dispositifs réseau (hubs, routeurs, stations de travail). Chaque élément utilisé dans le modèle réseau est appelé nœud (node) dont l’architecture interne est décrite dans un niveau plus bas appelé niveau nœud (node domain).

 

Figure 3. Exemple d’un modèle de réseau dans OPNET Modeler

 

 

 

2.     Domaine nœud (node domain)

 

 À ce niveau est décrite l’architecture interne d’un nœud. En effet, un nœud dans OPNET Modeler est composé de trois types de modules

-          les processeurs qui sont des entités entièrement programmables.

-          les files d’attentes servant pour le stockage et la manipulation des paquets.

-          les émetteurs/récepteurs, qui constituent l’interface de communication inter- nœuds (généralement entre un dispositif réseau et un lien).

 Les modules d’un nœud utilisent deux mécanismes de communication

-          le flux de paquets (packet streams) pour s’échanger les paquets de données comme par exemple le passage de paquets d’une couche à une autre dans la pile des protocoles.

-          fil de statistiques (statistic wires) utilisé essentiellement pour communiquer les statistiques entre les modules. (voir figure)

 

 

 

 

 

 

 

 

 

 

 

 

Figure 4. Exemple d’un nœud dans OPNET Modeler

 

3.     Domaine processus (processus domain)

 

C’est le niveau le plus important dans OPNET Modeler. Avant de commencer Il est important de faire la distinction entre un modèle de processus et un processus. En fait, la relation entre les deux est comme la relation entre une classe et une instance de cette classe. Dans les problèmes de modélisation on parle souvent de modèle de processus, par contre dans la simulation parle de l’instance de processus.

Dans OPNET Modeler, le comportement d’un module est défini par un ou plusieurs processus. Ce paradigme est appelé process group. Quand on lance la simulation, chaque module contient un seul processus appelé processus racine (root process). Ce processus peut, au fur et à mesure de l’avancement de la simulation, créer d’autres processus qui sont appelés processus fils (child processes). OPNET Modeler ne met aucune limite sur le nombre de processus qui peuvent être créés dans un module. Les processus crées par le root process sont appelés processus dynamiques. Ce paradigme offre plus de souplesse pour la modélisation de systèmes multitâches

Le principe d’invocation de processus dans OPNET Modeler est similaire à l’appel de fonctions dans le langage C. Un processus en cours d’exécution peut invoquer un autre et se bloquer. Le processus invoqué commence l’exécution et peut à son tour invoquer d’autres processus. Lorsqu’il se termine, il rend la main au processus appelant.

Les processus Modeler sont conçus pour répondre aux interruptions provenant d’eux-mêmes (self invocation), d’autres processus du processus group c’est-à-dire dans le même module, ou à des processus appartenant à un autre module. Les interruptions correspondent à des événements tels que l’arrivée d’un paquet, l’expiration d’un timer, la libération d’une ressource ou le changement d’une statistique dans un autre module (static wire). Le traitement d’une interruption se termine lorsque le processus invoqué se bloque.

Les processus sont programmés en Proto-C qui est langage conçu pour simplifier la modélisation des protocoles et des algorithmes. Ce langage est la combinaison d’un formalisme basé sur les diagrammes état/transition appelé aussi STD (state/transition diagram) et d’une bibliothèque de kernel procédures. Il utilise les fonctionnalités du langage C ou C++.

OPNET Modeler intègre un nouveau mécanisme de communication interprocessus appelé ICI (Interface Control Information). ICI est constitué de structures de données configurables pouvant être attachées avec les interruptions ou les flux de données. Lorsqu’une application envoie un paquet à la couche session il l’accompagne d’une ICI qui détermine l’identifiant unique de la session à laquelle ce paquet appartient.

Les processus dans OPNET sont dits interruption driven. Lorsqu’un processus reçoit une interruption il agit en faisant la transition qu’il faut. Cette transition peut conduire à un changement d’état ou à boucler sur le même état. Deux types d’états existent dans Modeler, les états forcés (représentés par une couleur rouge et les états non-forcés, représentés par une couleur verte. La différence entre ces deux types d’état est qu’un état forcé est bloquant, c’est-à-dire que le processus se bloque sur cet état jusqu'à la réception d’une nouvelle interruption. A contrario, un état non forcé est non bloquant.

L’éditeur de processus de Modeler intègre plusieurs fonctionnalités avancées qui facilitent le développement :

- Les variables d’état : ce sont des variables privés qui permettent de maintenir des informations sur l’état du processus comme les compteurs, les tables de routages ou les statistiques. Ces variables gardent leurs valeurs tout au long de la vie du processus, contrairement aux variables temporaires qui perdent leur contenu à chaque nouvelle invocation du processus.

- Les exécutifs d’états : on peut spécifier un ensemble d‘actions à exécuter à chaque entrée ou sortie de l’état. Cet ensemble est appelé exécutif. Un exemple de ces actions peut être la modification du contenu d’une variable, la mise à jour d’une statistique ou le déclenchement d’un timer.

- Les conditions de transition : c’est une expression booléenne qui détermine quand une transition doit être traversé.

- L’exécutif de transition : c’est un ensemble de code qui doit être exécuté à chaque fois que la transition est traversée. Voir Figure 5

 

Figure 5. Exemple d’un modèle de processus dans OPNET Modeler

 

 

Modélisation d’une architecture deux tiers pour la transmission de flux multimédia

 

 

Introduction

 

Comme toute application distribuée, l’application de demande de vidéo/audio est divisée en deux parties, une partie client et une partie serveur qui communiquent par un protocole commun. Le cas le plus simple d’une application multimédia est la demande d’audio/vidéo enregistrée sur un serveur distant. Nous allons nous intéresser ici au cas où le client et le serveur se mettent en accord sur un type de payload, et sont prêts à commencer l’échange de données. On ne traitera pas la négociation du type de payload ni les fonctionnalités du protocole RTSP.

 

 

Figure12. Protocoles intervenant dans une session multimédia

 

Implémentation des modèles de processus client et serveur

 

Afin de modéliser le client et le serveur RTP, nous sommes partis d’un projet de l’Illinois Institute of Technology, Chicago, où Srikanth B. Yoginath a développé un modèle de la couche RTP. Nous avons ajouté à son modèle la possibilité de faire d’ouvrir plusieurs sessions et également une gestion plus développée de RTCP.

En général, les actions qui doivent être entreprises par le client et le serveur se résument dans les étapes suivantes :

 

1.             Phase d’initialisation des applications, sur les deux parties

2.             Etablissement de la session entre le client et le serveur.

3.             L’envoi des données (multimédia) par le serveur au client, et l’envoi des apports SR

4.             La réception des données par le client, mise ajours des statistiques, envoi des rapports.

5.             La clôture de la session par le serveur lorsque il aura terminée le transfert.

 

1.           Phase d’initialisation

 

Les deux processus client et serveur vont initialiser leurs variables d’états et les attributs qui vont être utilisés pendant la session et enregistrer les statistiques à récupérer. Comme les deux processus sont implémentés dans la couche supérieure, et que le bon fonctionnement de ces deux processus dépend des processus des couches inférieures. Il faut laisser le temps à ces dernières pour s’initialiser. Cela peut être fait par des boucles d’attente passives, ou par retardement de l‘initialisation à un instant suffisamment grand.

 

2.           Ouverture d’une session entre le client et le serveur

 

Comme nous l’avons annoncé dans la définition du protocole RTP, ce protocole n’est pas orienté connexion, c’est donc au serveur de garder un état sur la session comme le nombre de paquets envoyés, le nom de la source, les paquets perdus, etc. Dans OPNET Modeler, l’ouverture des sessions et la gestion des différents services au niveau d’un nœud se fait au niveau de la couche tpal (transport abstraction layer). Toute interaction entre application distante par tpal est organisé en sessions.

Tout application ou service qui est sensé s’exécuter sur le serveur doit s’enregistrer auprès de la couche tpal qui gère une liste des services disponibles dans un nœud de façon à ce qu’un client qui demande le service par son nom, soit redirigé vers ce nœud. L’enregistrement se fait par l’appel de la procédure tpal_service_register ().

La figure 17, montre les étapes nécessaires pour l’ouverture d’une session.

 

 

 

 

 

 

 

 

 

 

 

 


Figure 17. Étapes de l’ouverture d’une session tpal

 

-          Demande de l’ouverture d’une session passive avec la couche tpal, par la spécification du nom de l’application, le protocole de transport utilisé, et le numéro de port. La couche tpal répond par un message confirmant la réception la demande d’ouverture.

-          Le client de son coté va émettre une demande d’ouverture d’une session active en spécifiant, le nom du serveur, le nom du service, le numéro de port local, etc.

-          La couche tpal du coté serveur reçoit une indication de demande d’ouverture de session active (OPEN_IND), cette étape sert pour signaler au serveur d’ouvrir une nouvelle connexion passive.

-          Si l’ouverture de la session est possible (pas d’erreurs), la couche tpal envoie une confirmation d’ouverture de session (OPEN_CONFIRM) au serveur

-          Une confirmation est envoyé à la couche tpal du coté client

-          La couche tpal client, envoie une confirmation d’ouverture de session (OPEN_CONFIRM) à la couche application.

-          La session est ouverte avec succès et les deux applications peuvent s’échanger des données.

Il est nécessaire de rappeler que toute erreur durant le processus d’ouverture va produire une interruption d’exécution qui empêchera la simulation de continuer.

 

3.    Echange de données entre le client et le serveur

 

La communication entre le client et le serveur multimédia se fait par l’échange de paquets. Cet échange se fait par l’utilisation de KP dédiés, qui offrent une multitude d’options pour l’envoi des paquets. On peut, par exemple, envoyer un paquet et retarder son envoi d’un instant T qui correspondra à son temps de traitement. On peut aussi faire en sorte que les paquets soient délivrés sans causer d’interruption (envoi silencieux). Ces différentes options offrent une souplesse pour la modélisation d’applications. Afin de différencier les paquets appartenant à différentes sessions, il faut installer l’ICI de la session courante avant d’envoyer les paquets. Ainsi, la couche tpal saura à quelle destination il faut rediriger ce paquet.

Dans une application de demande de multimédia, le serveur se charge de l’envoi des paquets RTP et des rapports SR (Sender report) et le client se charge de l’envoi des rapports de réceptions RR.

 

Envoi des paquets RTP du serveur au client et les rapports SR (Sender report)

 

Si l’étape d’ouverture de la session s’est bien déroulée, le serveur peut commencer l’envoi des paquets RTP, voir figure 18. Dans une vraie application de transmission de vidéo les temps d’envoi des paquets et la taille des paquets sont variables selon le type de payload. Pour simplifier la validation des modèles développés, nous avons choisi d’utiliser des paquets de taille fixe et nous avons supposé que l’envoi des paquets se fait dans des laps de temps suivant une fonction de probabilité simple (constante dans notre cas). On peut tout de même utiliser l’éditeur de PDF (Probability Density Function) intégré à Modeler pour créer des distributions de données qui reflètent l’envoi de données réelles.

Le serveur envoie des paquets de contrôle SR, à des instants fixes (toutes les 5 secondes) pour permettre à la source de synchroniser les données reçues, en faisant la relation entre le champ timestamp, et le champ NTP. Comme on ne s’intéresse qu’à la couche RTP, on n’envoie que le champ qui spécifie le nombre de paquets envoyés.

 

Envoi des paquets RR par le client vers le serveur :

 

Le client se charge de la réception des paquets RTP, de la lecture des différents champs et de la mise à jours des statistiques. Le client envoie des paquets de contrôle de type RR (receive report) à des instants fixes afin d’informer le serveur sur la qualité de réception des données.

Modeler permet de déclarer des statistiques dans le processus modèle de manière à ce qu’il soit possible de les exploiter par l’intermédiaire d’éditeurs et d’utilitaires de comparaison de résultats. Chaque statistique sera représentée sous forme de vecteurs (temps, valeur). Avant d’utiliser une statistique, il faut s’inscrire par l’appel de la KP op_stat_register(). Cette procédure va renvoyer un handle qui permet de manipuler et de modifier la statistique.

Les différentes variables que le client met à jour à chaque réception de paquet RTP sont les suivantes :

 

-          Le nombre paquets reçus : ce nombre sera incrémenté de 1 à chaque réception de paquets.

-          Le nombre paquets perdus : incrémenté par la différence entre le seq_num ancien et le seq_num du paquet arrivé.

-          Fraction lost : le nombre de paquets perdus depuis le dernier rapport. Cette variable sera remise à zéro à chaque envoi de paquet RR et sera incrémentée par la différence entre les numéros de séquence.

-          Jitter (gigue) : représente les variations dans le temps de transmission des paquets.

-          High_seq_num : numéro de séquence le plus grand devient celui du paquet reçu.

 

La clôture de la session

 

La clôture de la session dans ce modèle de base sera faite par le serveur après avoir atteint la durée de la session. Le serveur va envoyer un paquet de contrôle spécial appelé close_session au client puis va appeler la commande CLOSE_REQ à la couche tpal pour fermer le session amicalement (attendre que toutes les données soient arrivées vers leurs destination).

 

 

Figure 18. Exemple de processus de base pour le client.

 

Figure 19. Exemple de processus de base pour le Server.

 

Modélisation d’une application de transmission multimédia à trois tiers

 

Étapes d’une demande de vidéo dans une application à trois tiers

 

Les mixeurs RTP sont généralement placés au plus près des clients pour rendre l’adaptation du flux plus réactive aux changements de la bande passante. Dans ce qui suit sont décrites les étapes nécessaires pour établir une session de transfert multimédia à trois tiers (client, mixeur, serveur)

  1. Envoi du fichier de description du media au mixeur de la part du client par l’intermédiaire de Webmovie.
  2. Le mixeur se connecte au serveur, ouvre une session avec le serveur et lance le transfert des 30 premières secondes dans un buffer.
  3. Le client demande l’ouverture d’une session avec le mixeur pour recevoir la vidéo souhaitée
  4. Le mixeur établit la connexion avec le client et lui envoie dans l’immédiat, les premières secondes de la vidéo enregistrée dans son buffer.
  5. Le mixeur continue à demander le reste de la vidéo du serveur.
  6. Le mixeur envoie la vidéo au client et se charge d’adapter le flux envoyé au fur et à la mesure de réception des rapports RR de ce dernier.

 

 

 


                                         

 

 

 

 

 

 

 

                                                                                             

 

figure 25. Etapes d’une demande de vidéo.

 

Modèles avancés de client/serveur 

 

Au niveau nœud, nous avons gardé les mêmes modèles de nœuds de la section précédente, cependant nous avons ajouté 3 types de paquets pour des fonctionnalités de contrôle ; COMMENCE, ENVOIE et BYE.

 

1.     ouverture de la session 

 

Dans les modèles proposés dans la section précédente  le client et le serveur commencent l’envoi des données dès que le session est ouverte par la couche tpal. Pour permettre plus de contrôle sur les sessions, nous avons rajouté une étape. Après l’ouverture de la session par la couche tpal, le client et le serveur se mettent dans l’état prêt. Lorsque le client veut commencer le transfert, il envoie un paquet ENVOIE au serveur. Ce dernier répond par un paquet COMMENCE puis commence l’envoi des paquets RTP.

 

2. Echange des paquets RTP 

 

Le modèle client de la section précédente, ne permet pas d’envoyer des paquets RTP, cependant ce n’est pas toujours le cas. Comme dans le cas d’une vidéo conférence, il n’y a pas de communication client /serveur, mais client/client. Pour cela nous avons rajouté au client la possibilité d’envoyer des paquets RTP.

 

3. Envoi des paquets RTCP 

 

Lorsque le nombre de clients augmente, le nombre paquets RR envoyés augmente de manière linéaire et peut dépasser le trafic RTP injecté dans le réseau, pour cette raison, l’envoi des paquets RTP est limité par 5% de la bande passante de la session. Dont 25% sont réservés pour les rapports SR (les expéditeurs) et 75% pour les rapports RR (les récepteurs). Ainsi les temps d’envoi des paquets RR et SR sont calculés comme suit :

-          Tsr =nombre d’expéditeurs *taille moyenne du paquet RTCP /0.5*0.25* débit de la session.

-          Trr= nombre de récepteur *taille moyenne du paquet RTCP /0.5*0.75* débit de la session.

 

4. Clôture de la session 

 

  Dans le modèle précédent, c’est le serveur qui décide de fermer la session lorsque la durée de la session expire.  Dans le cas d’une conférence, il faut que tout client puisse quitter la session sans causer la fermeture de la session. Pour cela nous avons décidé de prendre en compte le type de paquets BYE.

Dans les figures 26 et 27. Sont présentés les nouveaux processus client et serveur.

 

figure26. Modèle avancé de client.

 

On remarque dans ce modèle l’apparition de l’état prêt qui est atteint lorsque la session tpal est ouverte, et que le client est en attente de l’interruption de début de l’échange de données. Ainsi, le client peut rejoindre une session ouverte après un temps appelé temps d’arrivée.  

Le client peut quitter la session après une durée de session en envoyant un paquet de type BYE.

 

Figure 27. Modèle avancé de serveur

 

Modélisation du mixeur.

 

1. Présentation du modèle nœud du mixeur

 

On peut représenter le modèle de mixeur en une seule application intégrée dans un module qui reçoit les paquets de la part du serveur vidéo, fait les traitements nécessaires sur les paquets puis les fait suivre au client. Nous avons choisi de mettre en oeuvre un architecture plus modulaire composée de trois parties fonctionnelles (modules indépendants) comme décrit sur la figure 28.

-          mixeur_client : ce module se charge de l’ouverture de la connexion avec un ou plusieurs serveurs, et le stockages des données dans un buffer. Il se charge aussi d’envoyer les rapports RTCP au serveur tout au long de la session.

-          mixeur_server : ce module se charge de la récupération des données du buffer sur la demande du client.

-          buffer : ce module est du type file d’attente. Il permet de recevoir les paquets envoyés par le module mixeur_client et gère l’envoi de ces derniers au module mixeur_server.

Cette décomposition fonctionnelle facilite l’intégration de nouvelles fonctionnalités dans le mixeur. Par exemple, si on veut que le mixeur soit capable de faire une conversion du type de payload, on n’a qu’à mettre une fonction qui permet de convertir le type de paquets au niveau du module mixeur_server sans tout de même apporter des modifications sur les modules buffer et mixeur_client. Pour appliquer une nouvelle stratégie pour la gestion des paquets, on intervient dans le processus qui gère le buffer sans toucher à l’implémentation des deux autres modules. 

 

 

Figure 28. Architecture du nœud mixeur.

 

Présentation des modèles de processus.

 

Modèle de processus du module mixeur_client

 

Ce modèle de processus est presque similaire au modèle client_video_av que nous avons vu précédemment. Cependant au niveau de l’implémentation, nous avons fait en sorte que ce modèle soit indépendant du contexte. Les processus mixeur_client et mixeur_server doivent être crées dynamiquement et ne doivent pas être dépendant du contexte. Les références aux objets du niveau modules sont transmis en tant que arguments au processus manager qui est sensé faire la gestion des sessions, et l’arbitrage des interruptions entre les processus fils.

 

 

 

 

 

 

 

 

 

 

 

Figure 29. Modèle de processus du nœud mixeur_client

Modèle de processus du buffer

 

Pour modéliser le buffer nous avons utilisé une file d’attente de type pf_fifo (passive flowthrough, first in first out). Ainsi, les paquets qui arrivent dans la file ne seront envoyés que sur la demande du mixeur_serveur. De plus, ce type de file permet de créer des sous files à la demande contrairement aux autres files dites concentrative, et qui rassemblent toutes les données en entrée dans une seule file. Le processus modèle de cette file est simple et permet l’implémentation  de stratégies de priorités selon le besoin de l’application.

 

Figure 30. Modèle de processus du buffer

 

Modèle de processus du module mixeur_server

 

Ce modèle de processus intègre toutes les fonctionnalités du serveur_vidéo_av. Il permet de récupérer des données du buffer et les envoyer aux clients demandeurs. Il est possible d’intégrer la fonction d’adaptation de flux dans ce module. Lorsque le processus mixeur _server reçoit le rapport RR, il lit les champs fraction lost et variation de la gigue puis décide d’envoyer ou non les flux d’amélioration au client. Le serveur n’élimine pas tous les flux d’amélioration dès qu’il reçoit le premier rapport RR signalant des pertes. Il agit de manière progressive selon l’ordre décroissant de la qualité d’amélioration.

 

Figure 31. Le modèle du processus mixeur_server