Vous êtes sur la page 1sur 47

Grassart Benjamin

Athlone Institute of Technologies


Dublin Road, Athlone, Co. Westmeath Ireland.

Rapport de stage au SRC :


Mise en place d' une solution VoIP

Tuteur ERASMUS : M. Cunningham


Tuteur IUT
: M. Chlebowski

anne 2009-2010

Page 1

Page 2

Remerciements
Je tiens remercier M. Anthony Cunningham, pour m' avoir acceuilli dans son dpartement de recherche, et
de m' avoir ainsi permis d' acqurir de nouvelles comptences et une exprience valorisante, tant au niveau
professionnel que linguistique.
Je remercie galement M. Cormac Mulally, pour l' aide qu' il nous a apporte dans la rsolution de certains
problmes techniques.
Plus gnralement, je souhaite remercier le personnel du dpartement de recherche de l' universit d'
Athlone, pour leur accueil chaleureux et notre intgration russie.
Enfin je souhaite remercier les professeurs de l' IUT, qui m' ont apport les connaissances et les mthodes
pour mener bien ce stage, et particulirement M. Chlebowski pour le suivi qu' il a effectu.

Page 3

Rsum francais
Durant ce stage, nous avons tout d' abord pris connaissance du lieu, le SRC, de leur mission, la recherche sur
le rseau sans oublier leur projet principal le SUNAT. Nous avons ensuite install progressivement et pas
pas une solution VoIP afin de rpondre la problmatique Comment faire une conversation orale sur le
rseau internet , puis particip au dveloppement d' un utilitaire pour valuer la qualit des conversations
VoIP. Durant cette exprience, nous avons rutilis un grand nombre de nos connaissances accumules en
DUT informatique, tout en les approfondissants. Nous avons particulirement progress en rseau et en
anglais, mais aussi tudi des protocoles et eu une exprience de la mise en place d' une solution opensource. Par ailleurs le stage ERASMUS permet un enrichissement personnel et une ouverture d' esprit qui ne
seraient pas les mmes lors d' un stage traditionel en France.

Page 4

English summary
During this placement, first we have taken some information about our working-place, the SRC, about their
role, doing some research on network protocol (SCTP, WIFI 802.11n), and finally about the main projet,
SUNAT. Secondly, we have installed step by step a VoIP solution in order to solve the following problem :
"How to make phone calls using the internet network ? ", then we have worked on software whose role is to
evaluate the quality of VoIP conversations. During this experience, we have used a lot of knowledge that we
have learned while studying computer-science DUT, and we have expended on it. We have made progress
particulary in English and in network technologies, we also studied protocols and implemented an opensource solution for VoIP. Besides the ERASMUS placement has helped us to gain a maturity and to be
more open-minded, it wouldn't be the same if we had done the placement in France.

Page 5

Sommaire

Remerciement.......................................................................................................................................3
Resume francais....................................................................................................................................4
Resume anglais.....................................................................................................................................5
I Introduction........................................................................................................................................6
II Prsentation grrale ........................................................................................................................7
a) Prsentation de l'AIT et du SRC.................................................................................................7
b) Fonctionnement du SRC.............................................................................................................8
c) Prsentation du projet.................................................................................................................9
III Le stage..........................................................................................................................................10
a) Dcouverte et installation au SRC............................................................................................10
b) Documentation pralable : La VoIP..........................................................................................11
c) Mise en place de la solution sur le rseau local........................................................................12
d) Dploiement de la solution sur internet....................................................................................14
le proxy.................................................................................................................................14
Configuration finale.............................................................................................................15
e) Dveloppement du logiciel d' analyse des Dlais.....................................................................16
IV Bilan..............................................................................................................................................17
a) Bilan Technique........................................................................................................................17
b) Bilan Humain............................................................................................................................18
V Conclusion......................................................................................................................................19
VI Glossaire........................................................................................................................................20
VII Bibliographie................................................................................................................................23
Site web : .............................................................................................................................23

Page 6

I Introduction
La problmatique de la communication au sein d' un service (informatique ou non) est une question
fondamentale, et influence considrablement son efficacit. Par extension, la qualit de cette composante
dans une entreprise influence sa comptitivit, c' est pourquoi il est primordial de ne pas la ngliger et d'
utiliser des outils adapts.
Rcemment une nouvelle technologie s' est dveloppe pour effectuer des appels tlphoniques travers un
rseau informatique classique, il s' agit de la *VoIP pour Voice over Internet Protocol . Outre le rseau;
elle ne ncessite que des postes informatiques normaux (quip de casque/micro), et aucun matriel
spcifique.
Au sein du dpartement de recherche de l' Athlone Institute of Technology ( *AIT) que nous prsenterons,
nous mettrons en place ce systme ainsi qu' un rseau personnalis pour rpondre au mieux ses besoins.
Pour ce faire, nous utiliserons des logiciels libres, linux en temps que *systme d'exploitation et *opensips
comme serveur tlphonique, nous expliciterons davantage son fonctionnement dans la partie
dveloppement.
Enfin nous n' omettrons pas de faire le bilan sur cette exprience; ce qu' elle nous a apport, les difficults
rencontres, ce que nous aurions pu faire en plus.

Page 7

II Prsentation grrale
a) Prsentation de l'AIT et du SRC
l' AIT bnficie du projet ARE*, dont le but est de dvelopper la recherche et dveloppement de l' Irlande,
ceci en installant / dveloppant des centres de recherche dans les instituts de technologie. Le but final est de
fournir une main d' oeuvre qualifie aux entreprises locales, en attirer de nouvelles et in fine acclrer le
renouveau conomique du pays.
L'AIT remplit donc 2 objectifs : l' enseignement et la recherche.
C' est dans son dpartement de recherche, le SRC* que nous ( Quentin Bezsilko et moi-mme ) ferons notre
stage.
Le SRC pour Software Research Centre a t cr en 2003. Sa mission est donc de faire de la recherche en
collaboration avec de grandes entreprises installes dans la rgion, comme par exemple Ericsson, ou bien
Eircom.
Son principal domaine de comptence est le rseau, et plusieurs projets sont mens de front, le plus
important tant le SUNAT. SUNAT est un acronyme pour Seamless Use Through Network Abtraction
Technologies. Le principe est de rendre les tlphones mobiles flexibles du point de vue des rseaux
utiliss. Ceci doit leur permettre de passer d' un type de rseau un autre ( du 3G au wifi par exemple ) afin
de gagner en cot et/ou en qualit. Le tout doit se faire en toute transparence pour l' utilisateur.
On comprend facilement que ces technologies novatrices intressent au plus haut point les entreprises de
tlcommunications, lesquelles supportent ces projets. L' AIT ressemble finalement aux ples d' excellence
franais, et forme un petit campus.

Page 8

b) Fonctionnement du SRC
Les membres du SRC sont au nombre de huit, sans nous compter puisque nous sommes stagiaires. La taille
de l' quipe tant relativement petite, la communication a lieu de manire directe ou bien par mail. Le tout est
relativement peu hirarchis, M. Cunningham est en quelque sorte le chef de projet : il supervise les autres
membres de l' quipe et dfinit les priorits ( puisque plusieurs projets ont lieu en mme temps ). Pour ce qui
est des autres membres, ils sont tous gale responsabilit.
Techniquement, le SRC dispose de son propre rseau local, et d' un accs internet haut dbit distribu sur
son rseau. Les machines utilises fonctionnent sous windows ou linux, et sont rcentes. On dispose
galement de pices de rechange ( crans, clavier/souris etc.) et mme d' ordinateurs de rechange. De
nombreux postes sont pourvus de deux crans. Les projets sont gnralement dvelopps dans des langages
informatiques* plutt bas-niveau, tel que le langage C*, pour des impratifs de vitesse d' excution.
Les horaires sont relativement souples, en fait ce sont plus des objectifs raliser qui sont indiqus, et pas
vraiment un nombre d' heures et de minutes de prsence. Les horaires sont thoriquement de 9h 17h avec
trente minutes de pause 10h30 et 1h 13h, mais il n' est pas rare de voir un chercheur arriver plus tard et
repartir plus tard galement. La pause de 10h30 constitue en fait le traditionnel breakfast Irlandais.
En ce qui nous concerne, nous avions des objectifs raliser, et des pistes indiques. Aprs cela, nous avions
carte blanche concernant la manire de le faire, et nous grions notre temps nous mme. Il n' y avait pas d'
impratif de date concernant le fonctionnement de tel ou tel module, tant que le travail tait ralis au final
(dans des dlais raisonnables tout de mme). Ceci ncessite naturellement un minimum d' autonomie et d'
organisation, mais ce n' tait pas un problme puisque nous avons appris cela l' IUT en effectuant des
projets en quipe ( je pense notamment au projet tuteur ).

Page 9

c) Prsentation du projet
Le projet se droulant dans un laboratoire de recherche sur le rseau, notre sujet sera donc orient rseau. Par
ailleurs, notre tuteur nous a prvenu que le sujet serait amen voluer en fonction de notre avancement.
L' intitul est dfini comme tel : mise en place d' une solution VoIP et d' un rseau personalis.
Le cahier des charges est le suivant : nous devons utiliser opensips, un serveur tlphonique virtuel, et xlite, un gratuiciel* qui se connecte opensips. Nous devons galement travailler sous linux, qui est capable
de *compiler et d' excuter opensips (il n'existe pas de version Windows d' opensips).
Dans un second temps, nous devons mettre en place un proxy* spcifique opensips, dans le but de pouvoir
dporter une partie de la charge sur diffrentes machines, et surtout de pouvoir utiliser le dispositif en dehors
du rseau local, c' est dire sur le rseau internet complet.
Enfin, nous avons particip au dveloppement d' un logiciel d' analyse de la qualit d' une conversation VoIP.
Ces tapes ncessitent une tude pousse pralable pour comprendre exactement comment fonctionne
opensips, la VoIP, avant de se lancer dans toute installation, paramtrage ou dveloppement.

Page 10

III Le stage
a)

Dcouverte et installation au SRC

Notre premire mission au sein du SRC ft tout simplement de prendre possession de notre poste de
travail. Loin du cadre scolaire ou il suffit de s' identifier sur la machine, nous avons chacun eu droit un
desktop* vierge avec un cran et un kit clavier-souris, ainsi qu' un disque d'installation d' Ubuntu*. Outre
l'installation matrielle, nous avons donc fait nous mme l' installation du systme d' exploitation et sa
configuration. Ayant une bonne connaissance du systme d' exploitation Linux grce au module systme du
DUT informatique, cette tape ft assez triviale.
On nous a donc ds le dbut accord une certaine autonomie, et nous aurions pu par exemple installer deux
systmes d'exploitation sur notre machine, demander une autre version de Linux, ou mme installer
Windows la place.
La majeure partie de cette premire journe ft toutefois consacre la prise d' informations sur le SRC, son
rle, son fonctionnement ainsi que la dfinition de notre sujet de stage, avec la mise en place d'un petit cahier
des charges ( oralement ).
Certaines choses nous ont quand mme t imposes, comme par exemple le logiciel Opensips en temps que
serveur SIP, ainsi que le logiciel client pour mettre en place la solution : X-lite.
Une fois le projet dfini, nous nous sommes rendu compte que nous ne connaissions absolument pas le
domaine de la VoIP, bien que nous ayons acquis des connaissances gnralistes en rseau au cours de notre
formation.
Nous avons donc dans un premier temps commenc un travail de documentation sur ce domaine. Nous avons
commenc par tudier comment fonctionne la VoIP, quelle technologies se cachent derrire, puis nous
nous sommes focaliss sur notre choix technique, opensips.

Page 11

b) Documentation pralable : La VoIP


Qu'est ce que la VoIP ?
Comme indiqu dans le glossaire, la VoIP permet de faire voyager la voix sur un rseau numrique. Elle s'
oppose donc aux communications tlphoniques traditionnelles qui elles empruntent un rseau analogique.
En ralit, la voix numrise voyage sur le rseau internet comme n' importe quel fichier, sous forme de bits.
Quel avantages ?
Le premier avantage est qu'elle ne ncessite strictement aucun matriel spcifique, elle peut tre mise en
place avec simplement un rseau internet, du coup on peut la dployer presque partout.
Le deuxime avantage est son cot, mis part celui de la connection internet, la VoIP ne cote rien de plus,
contrairement une communication RTC* classique. En entreprise, il suffit d'un banal serveur pour crer
un rseau VoIP. Un rseau RTC ncessite lui un quipement onreux, et des postes tlphoniques (alors que
la VoIP peut tre utilise sur un poste de travail avec un casque / micro).
Quel inconvnients ?
Ayant effectu ma soutenance de communication en S3 sur la scurit informatique, je me suis tout d' abord
intress aux risques ventuels. Le fait qu'un simple serveur assure le service peut poser problme, puisque
comme tout ordinateur il peut tre dfaillant ou mme subir une attaque.
Toutefois, d'aprs un rapport datant de 20071, la disponibilit du service est de 99.9% (restant infrieur aux
presque 100% de la tlphonie classique).
La VoIP ncessite par ailleurs un rseau de qualit au risque d'tre inutilisable, ce qui n'est pas forcment le
cas du rseau externe l'entreprise.
Quelles technologies ?
Pour l'tablissement de la connexion, la VoIP s' appuie sur les protocoles SIP / SDP*, qui lui mme utilise
TCP. L' avantage du protocole TCP, (vu lors du module rsx4), est qu' il permet de garantir l'intgrit des
donnes.
Pour la transmission de la voix, on utilise RTP qui lui-mme s' appuie sur UDP (protocole galement tudi
lors du DUT informatique). Contrairement TCP, UDP permet d'changer rapidement des donnes mais au
dtriment des contrles (il peut y avoir perte d' informations). Dans notre cas, cela explique pourquoi le
rseau doit tre suffisament qualitatif ( si il y a trop de perte d'informations, la communication devient
inaudible).

1 VoIP et Asterisk, Franois Deppierraz's. Http://francois.ctrlaltdel.ch/

Page 12

c) Mise en place de la solution sur le rseau local


Nous avons mis en place deux postes clients X-lite et un serveur opensips.
Il est en ralit possible de connecter les deux postes X-lite directement sur un rseau local, condition de
connatre leurs adresses IP* respectives. Mais plutt que de le faire manuellement comme cela, on prfrera
les connecter un serveur qui se chargera d'tablir la connection sans que les utilisateurs aient changer
leur adresse et configurer le logiciel chaque appel !
La premire solution implmente fonctionne donc comme ceci :
Dans notre cas, le serveur opensips accde une base de donnes MySQL* afin d' enregistrer les utilisateurs
autoriss accder au rseau VoIP. Il est possible d' utiliser d' autres bases de donnes.
Il y a deux tapes raliser pour tre joignable :
On rentre l'utilisateur dans la base de donnes d' opensips.
L' utilisateur dmarre le client (X-lite dans notre cas) et renseigne l'identifiant et le mot de passe
correspondant, obtienant ainsi le droit (ou non) de se connecter au serveur.
Le serveur opensips sait donc tout moment quels sont les utilisateurs joignables.
La procdure d' tablissement de la communication peut ensuite tre schmatise comme telle :

Page 13

Il n'est pas ncessaire de comprendre tous les signaux changs, mais on peut rsumer la procdure en trois
tapes :
Le client n 1 demande une communication avec le n 2 (juste entre entrant son nom).
Le serveur reoit la demande, et si le client n 2 existe et qu'il est connect, il transmet.
Si le client n 2 accepte la conversation, le serveur renvoie alors son adresse au client n1 et vice-versa, la
communication est tablie directement entre les deux clients (et le travail du serveur est fini).
Mais le client n 2 peut aussi refuser la communication.
Si le client n 2 ne rpond pas au bout d' un certain temps paramtrable, la conversation est annule.
Cette solution est fonctionelle, et prsente galement l' avantage d' tre multiplateforme : mme si Opensips
ncessite une machine sous Linux, X-lite* est disponible sous Linux, Windows et Mac, et de toute faon on
peut utiliser n' importe quel client SIP pour se connecter au serveur.
Mais cette solution prsente une faiblesse de taille : elle ne fonctionne que sur un seul rseau, le rseau local.
Ce qui signifie, qu' elle ne peut fonctionner que dans un mme service, au mieux dans une mme entreprise,
et en aucun cas sur internet.
C'est la raison pour laquelle dans un deuxime temps nous avons mis en place une solution capable d' tre
dploye sur le rseau mondial.

Page 14

d) Dploiement de la solution sur internet


Une fois le problme constat, nous avons cherch un moyen d' y remdier.
La solution que nous avons trouve comporte deux phases :
relai des appels par un proxy
Ajout de modules et configuration d'opensips

le proxy
Notre tuteur nous a demand d'utiliser mediaproxy, un proxy pour opensips.
Jusqu' maintenant, nos clients SIP s'changeaient directement les donnes sur le rseau local sans aucun
intermdiaire (une fois la connection entre les deux tablie grce Opensips).
Le mediaproxy va tre un intermdiaire pour la voix ( qui passe via RTP ), comme le montre ce schma :

Ceci prsente de nombreux avantages :

Page 15

On peut savoir ce qui se passe sur le rseau, combien d'appels, qui, de quelle dure...
On peut archiver ces donnes.
Mais surtout, si les clients ne se parlent plus directement, on peut rediriger les donnes

et

sortir du rseau local.


A noter que le relai peut tre sur n' importe quelle machine, et qu' il peut y en avoir plusieurs. Le rle du
dispatcher est de repartir la charge sur les diffrents relais disponibles.
Installer mediaproxy n'est pas trivial, et qui plus est il est ncessaire de reconfigurer Opensips pour pouvoir l'
utiliser, en ajoutant des modules et en modifiant son script d' excution.
Une fois mediaproxy en place, il reste une dernire tape pour dployer la solution sur le web.

Configuration finale
Il faut tout d' abord disposer d' une adresse publique pour le serveur. Une fois le serveur install, il reste un
problme.
Par dfaut, Opensips transmet les invitations de conversation sur les addresses IP du rseau priv en mmoire
dans la base de donnes. Le problme, c' est que si Opensips est en dehors du rseau priv, ces adresses n'ont
plus aucune signification. Il faut la place indiquer l'adresse du routeur* du rseau local qui se chargera lui
de rediriger les invitations aux bonnes machines.
Ceci ncessite une fois de plus l' ajout de modules et la modification du script d' excution d' Opensips.
Pour notre part, ne disposant pas d'adresse publique nous avons simul cette situation avec un routeur
implmentant le NAT*. Le serveur tait ainsi isol sur un rseau diffrent et nous avons pu mettre en place le
service comme si nous tions dans les conditions relles.
Toutefois il faut savoir que aujourd' hui de plus en plus d'entreprises utilisent un Switch* et pas seulement un
routeur pour crer un rseau local. Nous avons donc plac cet quipement entre le serveur opensips et le
routeur puis nous l' avons configur afin de retrouver une solution fonctionnelle. Cette tape ft la dernire
concernant la mise en place de la solution VoIP, mais ncessaire pour affirmer que nous pourrions dployer
ce systme dans quasiment n' importe quel rseau d'entreprise.
Tout au long de ce projet, nous avons crit une documentation, un tutoriel pour expliquer comment faire, la
demande de notre tuteur. En effet, bien que les logiciels utiliss soient robustes, ils souffrent d' un manque de
documentation, au-del de la documentation strictement technique, il est trs difficile de trouver des
documents expliquant comme effectuer des actions ou une configuration ( relai des appels par le mdiaproxy
).

Page 16

e) Dveloppement du logiciel d' analyse des Dlais


Nous avons mis en place une solution VoIP fonctionelle, mais comme il s' agit d' une technologie jeune, elle
souffre encore de carences. Une de ces carences est certainement l' impossibilit pour l' utilisateur de
connatre la qualit de la conversation. En effet, j' ai indiqu plus haut qu' un des problmes de la VoIP est qu'
elle traverse des rseaux htrognes et de qualit / vlocit diffrentes, alors qu' une conversation audio
impose des dlais restreints et un rseau ractif.
Il existe un protocole qui accompagne le RTP ( qui transmet la voix ) qui donne des informations sur la
qualit de la conversation, le RTCP*. Toutefois mme si il est possible partir de ce protocole de calculer les
dlais ou taux de paquets arrivs destination, il est bien entendu impossible pour l' utilisateur de savoir si la
conversation est de bonne qualit ou non ( d' autant plus que ce genre d' informations ne sont bien sr pas
montr par les softphones, et qu' il y a plusieurs rapports par seconde !).
Pour pallier cette faiblesse, le SRC dveloppe actuellement un logiciel capable partir des rapports RTCP
de donner un indice reprsentant la qualit de la conversation, prenant en compte tous les paramtres. Pour
donner un exemple, il existe le mme genre de chose pour une connexion wifi par exemple, avec un indice
de qualit de 1 5. Quentin Bezsilko et moi-mme avons dvelopp le module capable de calculer le dlai d'
une conversation.
Dans un premier temps, nous avons d tudier trs minutieusement le fonctionnement exact du protocole
RTCP et le moyen de calculer le dlai partir d' informations brutes. Une fois ce travail accompli, nous
avons utilis une API* du langage java*, jpcap, capable de rcuprer les paquets qui transitent sur le rseau,
puis de renvoyer leur contenu. Les paquets rcuprs, nous avons ensuite traduit notre raisonnement en java.
Le code source de ce projet est en annexe.

Page 17

IV Bilan
a) Bilan Technique
Le DUT informatique nous a apport les briques de bases afin de nous permettre de nous en sortir :
durant notre formation, nous avons appris comment marche Linux, comment se servir de la console ou
encore des diteurs de texte. Ce sont ces connaissances basiques dont nous nous sommes reservies pour
le projet, lorsque nous avons install, compil, configur ( modifier le script d' excution notamment), etc.
Grce au stage nous avons donc acquis de l' exprience et vu une application concrte de nos cours
thoriques.
On peut tirer la mme conclusion pour le rseau, nous sommes arrivs avec quelques notions thoriques sur
les adresses, comment identifier une machine, et partir de l nous avons pu apprhender un systme
complexe comme la VoIP et configurer un vrai rseau. Une fois de plus le stage nous a apport une
application concrte de nos connaissances plutt thoriques.
Ayant eu la chance de faire un stage en Irlande grce au programme ERASMUS, nous avons pu galement
amliorer sensiblement notre anglais. En effet, tout au long de notre scolarit depuis le collge, nous avons
acquis des connaissances grammaticales, du vocabulaire, appris la conjugaison, etc. Toutefois, me
concernant je n' ai jamais eu l' occasion de pratiquer la langue dans de relles conditions pendant une priode
prolonge, en toute indpendance. Le fait de vivre l' anglais tous les jours, de l' couter la tlvision, de
le lire, de le parler bref de le pratiquer quotidiennement pendant trois mois confre une exprience et des
comptences qui ne peuvent pas tre acquises par un cours.
Par ailleurs, nous avons galement progress l' crit puisque nous avons tudi un grand nombre de
documentations, mais surtout crit nous mme une documentation, un tutorial pour raliser une installation
telle que la ntre ( en annexe ).
Enfin, lors du dveloppement du logiciel de calcul de dlai, nous nous sommes largement appuys sur nos
connaissances en programmation, tout en dcouvrant une nouvelle API. Nous nous sommes vraiment rendus
compte que le DUT informatique nous avait fourni les aptitudes ncessaires pour participer au
dveloppement d' un projet. Qui plus est, ce ft l' occasion pour nous d' utiliser nos connaissances rseaux
travers le dveloppement, donc d' en voir une autre application.
Plus globalement, nous avons dcouvert comment l' open-source pouvait tre dploy pour des
professionnels et utilis en entreprise. Nous avons vu ses forces ( fiabilit des logiciels, importance de la
communaut ) mais aussi ses faiblesses ( compliqu, peu user-friendly , documentation parfois obsolte
ou lacunaire ), toute notre solution tait base sur l'open-source : Linux en systme d'exploitation, opensips
en serveur SIP.
De manire gnrale, ce stage a t pour nous une application formatrice des comptences plutt thoriques
que nous avions acquises jusque l. Nous avons particulirement progress en anglais et en rseau, tout en se
rendant compte de l' importance de l' tude pralable d' un sujet et de la documentation.

Page 18

b) Bilan Humain

Lors de ce stage, nous avons eu une exprience du travail en quipe sur le long terme , dans le milieu
professionnel. En effet, mme si nous avions dj men des projets en quipe pendant le DUT informatique,
il s' agissait de projets but pdagogique, pour valuer les lves, et non de projets but professionnel. Qui
plus est, le temps consacr ces projets tait de quelques heures par semaines, contre 35h dans notre cas, ce
qui correspond de relles conditions de travail.
Tout au long de notre projet, nous avons joui d' une grande autonomie, ce qui n' tait pas forcment le cas
lorsque nous avons tudi. Nous avons donc expriment les brainstorming, les runions, les mises au point
sur l' avancement, pour faire le bilan et dterminer comment conduire la suite du projet. Nous avons appris
prendre le temps de dterminer les orientations du projet avant de se jeter sur les machines, et compris l'
utilit de ce type de dmarche. Dans le mme ordre d' ide, nous avons ralis l' importance de se
documenter avant d' entreprendre un projet, par exemple lors du logiciel de calcul de dlai. En effet, nous
avons commis des erreurs de conception suite une connaissance insuffisante de RTCP, pour finalement
tudier RTCP plus en profondeur et corriger les fautes. Cette exprience a bien illustr le fait que la
documentation pralable et la rflexion sur la conception ne sont en aucun cas une perte de temps.
Notre lieu de travail en lui-mme ft une dcouverte pour nous, puisque nous avons travaill dans un centre
de recherche, un secteur qui nous tait compltement inconnu. Nous y avons dcouvert une ambiance de
travail trs diffrente de l' enseignement, bas sur un rsultat attendu mais avec une grande autonomie et un
temps imparti flexible, et une assez grande libert dans nos choix. Nous avons galement d tudier certaines
choses nous-mme ( le rseau, la VoIP ) l ou l' IUT un professeur nous l' aurait enseign. Ceci a eu pour
avantage de dvelopper notre autonomie dans l' apprentissage.
Mais les effets bnfiques d' un stage Erasmus ne sont pas limits au contexte professionnel. En allant faire
notre stage en Irlande, nous avons eu la chance de rencontrer des personnes ayant une autre culture,
favorisant ainsi l' change et l' ouverture d' esprit. A Athlone, beaucoup sont tudiants internationaux, ainsi
nous avons eu la chance de cotoyer de nombreuses nationalits diffrentes, Italien, Tchque, Espagnol en
plus des Irlandais. L' enrichissement personnel que cela nous a apport n' aurait pas t accesible en France.
En dfinitive ce stage nous a apport plus de recul, plus d' autonomie dans l' apprentissage et de manire
gnrale. Nous avons eu l'occasion d' avoir l' exprience de mener un vrai projet . Mais le plus important
est peut-tre l' enrichissement personnel et l' ouverture d'esprit que nous avons retir de ce stage, grce
notre immersion dans ce milieu qui nous tait tranger et les rencontres que nous avons faites.

Page 19

V Conclusion
Notre stage au SRC nous a invit rpondre la problmatique suivante : comment communiquer
verbalement sur le rseau universel et htrogne qu' est internet ?
Pour y rpondre, nous avons au sein de ce dpartement de recherche tudi la VoIP pour ensuite en dployer
une solution, et enfin particip au dveleppement d' un logiciel novateur capable d' estimer sa qualit.
A travers la VoIP, nous avons progress en UNIX, en rseau, et grce au programme ERASMUS en anglais.
Durant ce stage, nous avons rutilis toutes nos connaissances acquises en DUT et nous les avons
approfondies. Notre objectif a t atteint puisque la fin du stage nous avons fait une confrence l' quipe
de recherche afin de prsenter la solution que nous avons implmente et expliquer son fonctionnement.
Bien entendu, il aurait t possible d' aller plus loin dans ce projet, en mettant par exemple davantage d'
obstacles ( proxy et autre quipement rseau ) entre les clients et le serveur, ou encore d' associer au
mediaproxy ( qui relais les appels ) une analyse des conversations et un archivage des donnes.
Si ce projet a rendu service l' quipe de recherche, nous en avons retir une exprience trs valorisante
galement. Dans un monde qui tend vers le tout numrique, il ne fait aucun doute que nous retravaillerons un
jour sur la VoIP qui remplacera terme les communications tlphoniques traditionnelles.

Page 20

VI Annexe
Annexe 1 : le tutoriel d' installation d' opensips
************************************************** *
*

* Author : Quentin Bezsilko & Benjamin Grassart

* Date of creation : 28rd of April

***************************************************

This file is a tutorial explaining step by step how to install OpenSIPS on


a linux distribution. It has been installed on Ubuntu 8.10 (32 bits) but still
works with other versions.
Note : this tutorial should be read with a normal screen and a resolution of 1280*1024.
First we will see how to install opensips with a database and after how to add a mediaproxy relay.
To start, we need to find all the system for update and upgrade.
We'll also need some programs to use OpenSIPS.
In order to do so, open a terminal and run the following commands.
Note : You should be logged in as the super-user to execute these commands.
benjamin@benjamin-desktop-AIT:~$ su
Password :
If it worked, you can go to the next step!
#######################################################################################
If you don't know your root password or if you haven't set it already, try this.
benjamin@benjamin-desktop-AIT:~$ sudo passwd

Page 21

[sudo] password for benjamin:


The console will ask your sudo password.
Then you'll be able to enter a new root password.A confirmation will be asked.
A message of confirmation will be written if the password has been succesfully changed.
#######################################################################################
Once you're logged in as root, you should have a command invite like this.
root@benjamin-desktop-AIT:/home/benjamin#
The char '#' proves you are logged in as root
Now you can install the programs to configure your environment.
apt-get update && apt-get upgrade
apt-get install build-essential openssl bison flex
apt-get install mysql-server libmysqlclient15off libmysqlclient-dev
Note : When you will set mysql up, a password will be asked to launch it, forbidding anyone to write into
your database. Don't forget to create your root password and choose something you'll remember.

###########################################################
#
###############

#
PART ONE : INSTALLATION OF OPENSIPS

###########
#

###########################################################

You can now download the last version of opensips. We'll save the sources and put them in the appropriate
directory : /usr/src.
Nowadays the latest version is 1.5.1, so we will use it. You can have a look at the official website
http://www.opensips.org/ to check the last version.

Page 22

***************************************************************************************
First Method (using the terminal):
Try these commands :
benjamin@benjamin-desktop-AIT:~$ cd /usr/src
benjamin@benjamin-desktop-AIT:~$ wget http://opensips.org/pub/opensips/latest/src/opensips-1.5.1tls_src.tar.gz
This command will save the package into your /usr/src directory.
***************************************************************************************

***************************************************************************************
Second Method (using the browser):
Go to the Opensips official website : http://www.opensips.org/. Have a look at the right of the page, click on
read more and go to the download section.
Note : Be careful, OpenSIPS-CP is a control-panel for opensips, but it' s not OpenSIPS !
Download the latest version of opensips. Click on the link in the section : 2. Tarballs from SourceForge
and take the tls version.
We need to move the sources into the proper directory, so open a terminal and execute this command :
benjamin@benjamin-desktop-AIT:~$ sudo mv /home/benjamin/Desktop/opensips_1.5.1-tls.tar.gz /usr/src/
***************************************************************************************
This file is in an archive so we need to use this command to extract it :
benjamin@benjamin-desktop-AIT:~$ tar xvzf opensips-1.5.1-tls_src.tar.gz
The command tar extracts your package into your directory. For more information try this into your
terminal :
benjamin@benjamin-desktop-AIT:~$ man tar
Now, we're going to place ourselves into the opensips directory and compile the sources with all the
available modules. To do so, use the following command :
benjamin@benjamin-desktop-AIT:~$ cd opensips-1.5.1-tls
benjamin@benjamin-desktop-AIT:~$ make all include_modules="db_mysql" modules
benjamin@benjamin-desktop-AIT:~$ make install include_modules="db_mysql" modules

Page 23

We'll also need to copy the opensips.default and opensips.init files in their proper directories
(/etc/default/opensips and /etc/init.d/opensips).
To do so,try these command into your terminal:
benjamin@benjamin-desktop-AIT:~$ cp /usr/src/opensips-1.5.1-tls/packaging/debianetch/opensips.default /etc/default/opensips
benjamin@benjamin-desktop-AIT:~$ cp /usr/src/opensips-1.5.1-tls/packaging/debian-etch/opensips.init
/etc/init.d/opensips
Note : The command cp is short for copy. Try this for more informations :
benjamin@benjamin-desktop-AIT:~$ man cp
The last copied files need some changes about their option values.
First, open the /etc/default/opensips file with emacs or vim.
Note : for more informations about both text editors, try these commands :
benjamin@benjamin-desktop-AIT:~$ man emacs
benjamin@benjamin-desktop-AIT:~$ man vim
Change the following lines and save.
RUN_OPENSIPS=yes
1. User to run as
USER=opensips
1. Group to run as
GROUP=opensips
1. Amount of memory to allocate for the running OpenSIPS server (in Mb)
MEMORY=128
Second, open the /etc/init.d/opensips file and make the following changes (don't forget to save).
The line you'll have to change is DAEMON=/usr/sbin/opensips.
Put DAEMON=/usr/local/sbin/opensips instead.
Third we need to change the /usr/local/etc/opensips/opensipsctlrc file.
So open it with either emacs or wim and make the following changes.
SIP_DOMAIN=localhost

Page 24

DBENGINE=MYSQL
DBHOST=localhost
DBNAME=opensips
DBRWUSER=opensips
DBRWPW="opensipsrw"
DBROUSER=opensipsro
DBROPW=opensipsro
DBROOTUSER="root"
USERCOL="username"
INSTALL_EXTRA_TABLES=ask
INSTALL_PRESENCE_TABLES=ask
INSTALL_SERWEB_TABLES=ask
CTLENGINE="FIFO"
OSIPS_FIFO="/tmp/opensips_fifo"
PID_FILE=/var/run/opensips/opensips.pid
Note : All the lines prefixed by the '#' char are comments and ignored by the compiler. You must uncomment
these lines by taking off the '#' char
We'll need to create a database to save all the created users. We'll be using the mySQL one. To do so, try the
following command :
root@benjamin-desktop-AIT:/home/benjamin# opensipsdbctl create
MySQL password for root:
Note : this command will ask your mySQL password, so I hope you didn't forget it!
This database has to be configured so I'll tell you the changes you'll have to do.
Open the /usr/local/etc/opensips/opensips.cfg file and make the following changes :
loadmodule "db_mysql.so" #uncomment this line
loadmodule "auth.so"

#uncomment this line

loadmodule "auth_db.so" #uncomment this line


1. modparam("usrloc", "db_mode", 0); #Comment this line
modparam("usrloc", "db_mode", 2)

#uncomment this line

modparam("usrloc", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") #uncomment this line

Page 25

1. ----- auth_db params ----# uncomment the following lines if you want to enable the database authentification
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
We are nearly finished. We need now to create the users. That is why our database has been set up.
So try the following commands to create them.
Create the softphone user in the database:
root@benjamin-desktop-AIT:/home/benjamin# opensipsctl add 1234 1234
root@benjamin-desktop-AIT:/home/benjamin# opensipsctl add 5678 5678
Note : the first command enables you to create a user named 1234 with the password 1234 into the
opensipsdbctl database (created just before)
Now we'll create the Opensips user in mySQL.
To connect to mySQL, try this command and enter your mysql password:
root@benjamin-desktop-AIT:/home/benjamin# mysql -p
Enter password:
Note : the -p option means you want to connect with a password.
You'll have the "mysql>" invite now.
Then try the following commands. Here is a normal execution of the mySQL requests.
mysql> GRANT ALL PRIVILEGES ON *.* TO opensips@localhost IDENTIFIED BY 'opensips';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO opensips@127.0.0.1 IDENTIFIED BY 'opensips';
Query OK, 0 rows affected (0.00 sec)
Note : these commands enables you to give all the permissions to the Opensips user (write and read the
database are the most important ones).

Page 26

Congratulations, you managed to install OpenSIPS on your Ubuntu version.


Last but not least thing you need to know is how to run it.
You have two opportunities which do the same thing :
Note : Check if you're still the super-user on your laptop. If so, try this command to become the real user.
root@benjamin-desktop-AIT:/home/benjamin# exit
Then your invite will come back like this :
benjamin@benjamin-desktop-AIT:~$
Then try either this command to start Opensips :
benjamin@benjamin-desktop-AIT:~$ sudo /etc/init.d/opensips start
[sudo] password for benjamin:
Or this one :
benjamin@benjamin-desktop-AIT:~$ opensipsctl start
Sometimes both previous methods do not work, so you can try this one :
benjamin@benjamin-desktop-AIT:~$ sudo opensips
It will also indicate the listening port and the IP address of the server.
You can now use Opensips with x-lite (or Ekiga or another softphone) and make phone call over the LAN.
In order to deploy the system over the internet (traverse the NAT), we must install mediaproxy, a proxy for
opensips.
In addition, have a relay for the call make you able to control "what's happening".
However, if you stop to read the tutorial now, you have a working solution to deploy a VoIP solution on a
LAN.

##########################################################
#
###############

#
PART TWO : INSTALLATION OF MEDIAPROXY

###########
#

###########################################################

Page 27

First you must have a good understanding of what is mediaproxy and how does it work. You have a short
explanation hier : http://mediaproxy.ag-projects.com/, but don't worry you will have more in the README
file.
The easiest is to download the source and build our own package.
Go to the website : http://download.ag-projects.com/MediaProxy/ and download the archive of the last
version.
Note : Nowaday, the last version is mediaproxy 2.3.4, I will use it in this tutorial.
Uncompress it, with :
benjamin@benjamin-desktop-AIT:~$ tar -zxvf mediaproxy-2.3.4
Then update install the dependencies :
benjamin@benjamin-desktop-AIT:~$ sudo update
benjamin@benjamin-desktop-AIT:~$ sudo apt-get install devscripts cdbs debhelper python-all-dev pythonsupport \
libnetfilter-conntrack-dev python-application python-cjson \
python-gnutls python-twisted-core python-twisted-names \
python-zopeinterface python-pyrad python-sqlobject
Note : If you are running on Ubuntu 9.04, you will have a problem because it has python > 2.6 installed and
we need python < 2.6. Perhaps this problem will be fixed with the next version of mediaproxy, but for now,
I'm still searching for a solution. So for the moment the easiest is to use Ubuntu 8.10 with python 2.5.x.
run debuild in the mediaproxy directory :
benjamin@benjamin-desktop-AIT:~$ sudo debuild
You can safely ignore the pgp signing error at the end of the build process,
that is only because you do not have the pgp key for the person who is listed
as maintainer for the package. The packages are build fine even if they are
not signed.
After building them, you can find the .deb packages in the parent directory,
from where you can install them using dpkg:
benjamin@benjamin-desktop-AIT:~$ cd ../

Page 28

benjamin@benjamin-desktop-AIT:~$ sudo dpkg -i mediaproxy-*.deb


Now mediaproxy is installed, we must configure it. As you know, because you have read the documentation
about mediaproxy, the mediaproxy consist of one dispatcher and one or more relay(s). The configuration file,
which should be : /etc/mediaproxy/config.ini, is used by both dispatcher and relay, and it contain a lot of
explanation which are very usefull to understand. In this tutorial, I will use all the default parameters, and my
mediaproxy is on the same host as opensips. So I just need to edit the first part of the configuration file, the
IP address of the dispatcher :
benjamin@benjamin-desktop-AIT:~$ sudo emacs /etc/mediaproxy/config.ini
[Relay]
<explanations>
dispatchers : 127.0.0.1 # this line must be uncommented
If the dispatcher is in another host, you must indicate the corresponding IP address.
After that, we have to start the relay and the dispatcher to check if they work properly.
Note : the dispatcher must running before the relay !
benjamin@benjamin-desktop-AIT:~$ sudo media-dispatcher
benjamin@benjamin-desktop-AIT:~$ sudo media-relay
And you do it again to verify if they are running :
benjamin@benjamin-desktop-AIT:~$ sudo media-dispatcher
fatal error: Cannot start MediaProxy Dispatcher: already running with pid 5300
benjamin@benjamin-desktop-AIT:~$ sudo media-relay
fatal error: Cannot start MediaProxy Relay: already running with pid 6935
You must get this message of fatal error, if not, the mediaproxy is not running. To see why, try this in your
terminal :
benjamin@benjamin-desktop-AIT:~$ tail /var/sys/syslog
If the relay doesn't work, you will probably have this error message :
Apr 29 09:55:14 mediaproxy-desktop media-relay[6879]: Log opened.
Apr 29 09:55:14 mediaproxy-desktop media-relay[6879]: warning: startSyslog is being deprecated and will
be removed in 1.2.0. Use the start_syslog function instead.
Apr 29 09:55:14 mediaproxy-desktop media-relay[6879]: Starting MediaProxy Relay 2.3.4
Apr 29 09:55:14 mediaproxy-desktop media-relay[6879]: Set resource limit for maximum open file

Page 29

descriptors to 11000
Apr 29 09:55:14 mediaproxy-desktop media-relay[6879]: fatal error: failed to create MediaProxy Relay: IP
forwarding is not available or not enabled (check /proc/sys/net/ipv4/ip_forward)
You have to edit the ip_forward file.
benjamin@benjamin-desktop-AIT:~$ sudo emacs /proc/sys/net/ipv4/ip_forward
Put "1" instead of "0". Save. Don't worry if the editor say you can't save, quit and open the file again to check
if the edition has worked.
If the dispatcher and the relay work, we can continu and configure opensips to use mediaproxy, and this is a
bit trickier !
Open the configuration file of opensips :
benjamin@benjamin-desktop-AIT:~$ sudo emacs /usr/local/etc/opensips/opensips.cfg
Go to the module section, and add this line at the beginning :
loadmodule "mediaproxy.so" #this is the module of opensips which is able to connect to mediaproxy
Add this line AFTER the tm.so and rr.so :
.
.
.
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "dialog.so" #we add it because mediaproxy.so need it
.
.
.
Now go to the end of setting module-specific parameters and add these line :
# ----- dialog param ----modparam("dialog", "dlg_flag", 4)
And finally we must edit the script to force opensips to use mediaproxy. Go to the "Routing logic", and then
in the "main request routing logic".
Add this in the route section :
if (is_method("INVITE") ) {
# We can

also use a specific media relay if we need to

#$avp(s:med ia_relay) = "1.2.3.4";

Page 30

engage_media_proxy();
}
Note : The method engage_media_proxy() make opensips to use mediaproxy automatically. You mustn't use
the function use_media_proxy() if you use engage_media_proxy().
So you should have something like that in your configuration file :
####### Routing Logic ########

# main request routing logic


route{
#modification to use mediaproxy
if (is_method("INVITE") ) {
# We can

also use a specific media relay if we need to

#$avp(s:med ia_relay) = "1.2.3.4";


engage_media_proxy();
}
#end of modification
.
.
.
}
Now We can restart mediaproxy to see if all is well.
benjamin@benjamin-desktop-AIT:~$ sudo opensipsctl restart
Note : If you have problem to start, stop and restart opensips, especially with the pid file, you can try this to
stop opensips :
benjamin@benjamin-desktop-AIT:~$ sudo killall opensips
And start again :

Page 31

benjamin@benjamin-desktop-AIT:~$ sudo opensips


These method are not good method, and if mediaproxy doesn't start with "opensipsctl start", you may have
error(s) in your configuration file. However, with the killall, you should be able to stop opensips even if the
program is crashed or the configuration wrong.
When opensips has restarted, verify in the log that all is well :
benjamin@benjamin-desktop-AIT:~$ tail /var/sys/syslog
And after, check if it's running :
benjamin@benjamin-desktop-AIT:~$ ps ax | grep opensips
You should have many process about opensips.
Now you can connect some clients to opensips and use a relay.
But we must configure opensips to be able to traverse the NAT.

############################################### #########
#
###############

#
PART TREE : TRAVERSING THE NAT

##############
#

###################################################### ###

First of all I must show you what is my configuration.


The server opensips ( and also the relay ) have a public IP-address, whereas the client X-lite have a private
address, behind the NAT.
---------------------| opensips + relay | 192.168.2.3
------------------- -

Page 32

|
|
WAN 192.168.2.1
-----------------|

router

-----------------LAN 192.168.1.1
|
--------------------------------------|

PC n1
192.168.1.101

PC n2

PC n3 ...

192.168.1.102 192.168.1.103

So if we keep the same configuration as if the server was on the LAN we will have a problem because out of
the LAN the IP-addresses of the clients are not still routable.
The first configuration we need to do is about the router.
We must modify the routing table to "explain" where to redirect the packages.
Note : Here I will not explain you how to configure a router, because it's different for each of them.
You have to connect to it (by entering 192.168.1.1 usually) and search for the "routing table".
You should already have this line in your routing table :
0.0.0.0

0.0.0.0

192.168.2.2

WAN (Internet)

Note : 0.0.0.0 represents the default path.


Add these lines in your routing table :
192.168.1.0

255.255.255.0 192.168.1.1

LAN & Wireless

192.168.2.0

255.255.255.0 192.168.2.1

WAN (Internet)

Note :
"192.168.1.0 255.255.255.0 192.168.1.1
LAN & Wireless" means "if you have an IP-address like
192.168.1.x (ex 192.168.1.56, 192.168.1.123 ), you have to redirect in the switch (192.168.1.1).
It's quite the same for the second line.
In my case, 192.168.1.1 represents the "local IP address", the LAN, and 192.168.2.1 represents the "Internet
IP addresse", the WAN.

Page 33

Save your modification.


Now we must add some modules to manage the connection with the NAT. Open the configuration file of
opensips again :
benjamin@benjamin-desktop-AIT:~$ sudo emacs /usr/local/etc/opensips/opensips.cfg
Go to the Module Section and add these lines :
loadmodule "nathelper.so"
loadmodule "nat_traversal.so"
loadmodule "mangler.so"
Be careful, nathelper need to be added AFTER the usrloc module, and nat_traversal need to be added
AFTER the sl, tm and dialog module.
Now you should be able to register, but the problem is you register with your private address, which is not
routable. To fix this problem we must edit the script. So go to the "main routing logic" and in the "route" add
these line for the REGISTER, before the call of "save("location")" :
if(client_nat_test("3")){
setflag("2");
force_rport();
fix_contact();
}
It should looks like this :
route{
.
.
.
if(is_method("REGISTER"){
.
.
.
#ADD these line before the call of save("location")
if(client_nat_test("3")){.
setflag("2");
force_rport();

Page 34

fix_contact();
}
#end of the modification
#call of save("location");
}
.
.
.
}
Now you should be able to traverse the NAT.
Maybe you will still have problem to get the ACK message and the BYE one. In order to fix this problem,
try to add these lines :
if( client_nat_test("1") ){
fix_contact();
}
In the INVITE section like this :
if( is_method("INVITE") ){
engage_media_proxy();
if( client_nat_test("1") ){
fix_contact();
}
}
And in the onreplyroute section :
onreplyroute[2] {
if( client_nat_test("1") ){
fix_contact();
}
xlog("incoming reply\n");
}

Page 35

#########################################################
#
###############

#
PART FOUR : OTHER PROBLEMS ?

############
#

######################################################## #

If you still have some problems, you can go to this very good documentation :
http://www.kamailio.org/docs/. Don't worry, kamailio mean opensips.
Then, if you have didn't manage to solve your problem with the documentation, you can ask in some forum :
http://sourceforge.net/forum/forum.php?forum_id=839860
http://n2.nabble.com/OpenSIPS-(Open-SIP-Server)-f1449251.html

Annexe 2 : module de calcul de dlai du logiciel d' analyse qualitative de conversation VoIP

import jpcap.*;
import jpcap.packet.*;
import java.io.*;
import java.util.List;
import java.util.ArrayList;
import java.net.*;
public class Delai{
/*Four parameters are needed in this class
-the port of the sender
-the port of the receiver
-two lists to save the packets (one for the sender and one for the receiver)
*/
List <UDPPacket> listSender;
List <UDPPacket> listReceiver;
int portDstSender;
int portDstReceiver;
/*The constructor*/
Delai(int port_dst_sender, int port_dst_receiver){
listSender = new ArrayList <UDPPacket> ();

Page 36

listReceiver = new ArrayList <UDPPacket> ();


portDstSender = port_dst_sender;
portDstReceiver = port_dst_receiver;
}
//returns a String which represents the data format in hexadecimal like in wireshark
public static String getHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length*2);
int i=0;
for (byte b : bytes) {
String s = String.format("%x", b);
if( s.length() == 1 ){
s = "0"+s;
}
//the next lines are just here to get a better display
sb.append(s + " " );
i++;
if( i%16 == 0 ){
sb.append("\n");
}
}
return sb.toString();
}
//returns the reference timestamp from the sender
public byte[] getMiddleNTPTimestamp( UDPPacket packet ){
byte[] timestamp = new byte[4];
byte[] data
= ((Packet)(packet)).data;
//we take the corrresponding byte in the sender packet
timestamp[0] = data[10];
timestamp[1] = data[11];
timestamp[2] = data[12];
timestamp[3] = data[13];
return timestamp;
}
//returns the reference timestamp from the receiver
public byte[] getLSRReceiver( UDPPacket packet ){
byte[] timestamp = new byte[4];
byte[] data
= ((Packet)(packet)).data;
//we take the corresponding byte in the receiver packet
timestamp[0] = data[24];
timestamp[1] = data[25];
timestamp[2] = data[26];
timestamp[3] = data[27];
return timestamp;
}

Page 37

//returns the reference timestamp from the receiver


public byte[] getLSRSender( UDPPacket packet ){
byte[] timestamp = new byte[4];
byte[] data
= ((Packet)(packet)).data;
//we take the corresponding byte in the receiver packet
timestamp[0] = data[44];
timestamp[1] = data[45];
timestamp[2] = data[46];
timestamp[3] = data[47];
return timestamp;
}
//return in Int the type of the report. 200 correspond to a sender report, 201 correspond to a receiver report
public int getTypeReport( UDPPacket packet ){
byte type = ((Packet)(packet)).data[1];
Byte Type = new Byte(type);
return Type.intValue()+256;
}
void capturePacketFromFile( String fileName ){
int nbPacketCaptured = 0;
int nbPacketIgnored = 0;
//we must destroy the old data before load the new one
listSender.clear();
listReceiver.clear();
try{
JpcapCaptor captor=JpcapCaptor.openFile(fileName);
captor.setFilter("udp", true);
boolean continuer = true;
boolean sender_detecte = false;
while( continuer ){
//read a packet from the opened file
Packet temp = captor.getPacket();
UDPPacket packet = null;
//we continue only if the packet is good and if the file is not at the end
if( temp != null && temp != packet.EOF ){
packet = (UDPPacket)temp;
//we only use the packet with the port of RTCP
if( packet.dst_port == this.portDstSender || packet.dst_port == this.portDstReceiver ){
if( getTypeReport(packet) == 200 ){
listSender.add(packet);
sender_detecte = true;
}else{
//we need to have a sender before take the receiver
if( sender_detecte ){
listReceiver.add(packet);
}

Page 38

else
nbPacketIgnored++;//the receiver packet related with another file
}
nbPacketCaptured++;
}
}else{
continuer = false;//we stop if we're at the end
}
}
captor.close();
System.out.println("all is well : we've captured "+nbPacketCaptured+" packets.");
System.out.println("We've skipped "+nbPacketIgnored+" packet(s) at the beginning because there
were related with the previous package");
}catch( IOException e){ System.out.println(e); }
}
//capture the packet and filter with an address source and and address destination
void capturePacketFromFile( String fileName, InetAddress source, InetAddress destination ){
int nbPacketCaptured = 0;
int nbPacketIgnored = 0;
//we must destroy the old data before load the new one
listSender.clear();
listReceiver.clear();
try{
JpcapCaptor captor=JpcapCaptor.openFile(fileName);
captor.setFilter("udp", true);
boolean continuer = true;
boolean sender_detecte = false;
while( continuer ){
//read a packet from the opened file
Packet temp = captor.getPacket();
UDPPacket packet = null;
//we continue only if the packet is good and if the file is not at the end
if( temp != null && temp != packet.EOF ){
packet = (UDPPacket)temp;
//we only use the packet with the port of RTCP
if( packet.dst_port == this.portDstSender || packet.dst_port == this.portDstReceiver ){
//we take only the packet corresponding to the required ip address
if ( source.equals(packet.src_ip) && destination.equals(packet.dst_ip) ){
if( getTypeReport(packet) == 200 ){
listSender.add(packet);
sender_detecte = true;
}else{
//we need to have a sender before take the receiver
if( sender_detecte ){
listReceiver.add(packet);
}
else

Page 39

nbPacketIgnored++;//the receiver packet related with another file


}
nbPacketCaptured++;
}
}
}else{
continuer = false;//we stop if we're at the end
}
}
captor.close();
System.out.println("all is well : we've captured "+nbPacketCaptured+" packets.");
System.out.println("We've skipped "+nbPacketIgnored+" packet(s) at the beginning because there
were related with the previous package");
}catch( IOException e){ System.out.println(e); }
}
//prints the packets with some informations and the data ( format in hexa )
void printPackets(){
UDPPacket packet = null;
int nbPacketDisplayed=0;
//displays all the sender packets
System.out.println("Display of the Sender packets : \n");
for( int i=0 ; i < listSender.size() ; i++){
packet = listSender.get(i);
byte[] donnees_rtcp = ((Packet)packet).data;
System.out.println("packet n"+i+" : "+packet);
System.out.println("report's type : "+getTypeReport(packet));
System.out.println("timestamp : "+getHexString(getMiddleNTPTimestamp(packet)));
System.out.println("LSR : "+getHexString(getLSRSender(packet)));
System.out.println(getHexString(donnees_rtcp) + "\n");
nbPacketDisplayed++;
}
//displays all the receiver packets
System.out.println("Display of the Receiver packets : \n");
for( int i=0 ; i < listReceiver.size() ; i++){
packet = listReceiver.get(i);
byte[] donnees_rtcp = ((Packet)packet).data;
System.out.println("packet n"+i+" : "+packet);
System.out.println("report's type : "+getTypeReport(packet));
System.out.println("timstamp : "+getHexString(getLSRReceiver(packet)));
System.out.println(getHexString(donnees_rtcp) + "\n");
nbPacketDisplayed++;
}
System.out.println("We've displayed "+nbPacketDisplayed+" packet(s).");
}
//gets the DLSR (in seconds) for the receiver
public float getDLSRReceiver( Packet packetReceiver ) throws IOException{
byte[] DLSR = new byte[4];

Page 40

byte[] data = packetReceiver.data;


DLSR[0] = data[28];
DLSR[1] = data[29];
DLSR[2] = data[30];
DLSR[3] = data[31];
//code which transforms the array byte into an Int
ByteArrayInputStream bis = new ByteArrayInputStream(DLSR);
DataInputStream in = new DataInputStream(bis);
long ch1 = (long) in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
long nb = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
//System.out.println("Before dividing by 65535 : "+nb);
return (float)((float)nb/(float)65535);
}
//gets the DLSR (in seconds) for the sender
public float getDLSRSender( Packet packetSender ) throws IOException{
byte[] DLSR = new byte[4];
byte[] data = packetSender.data;
DLSR[0] = data[48];
DLSR[1] = data[49];
DLSR[2] = data[50];
DLSR[3] = data[51];
//code which transforms the array byte into an Int
ByteArrayInputStream bis = new ByteArrayInputStream(DLSR);
DataInputStream in = new DataInputStream(bis);
long ch1 = (long) in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
long nb = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
//System.out.println("Before dividing by 65535 : "+nb);
return (float)((float)nb/(float)65535);
}
//returns the arrival time of the packet in seconds
public double getArrivalTime( Packet packet ){
return (double) packet.sec+(packet.usec / 1000000.0);
}
//returns the delay from the package named "filename"
public double getDelay( String filename, InetAddress source, InetAddress destination ){
if( source == null || destination == null ){
this.capturePacketFromFile(filename);//fill the list
}else{

Page 41

this.capturePacketFromFile(filename, source, destination);


}
UDPPacket currentSenderPacket = null;
UDPPacket currentSenderPacketBis = null;
byte[] NTPtimestampSender = new byte[4];
byte[] LSRtimestampSender = new byte[4];
byte[] LSRtimestampReceiver = new byte[4];
UDPPacket currentReceiverPacket

= null;

System.out.println("Receiver list size :"+listReceiver.size());


System.out.println("Sender list size :"+listSender.size());
double currentDelay = 0;
double totalDelay = 0;
int nbDelay = 0;
for( int i=0 ; i < listSender.size() ; i++ ){
currentSenderPacket = listSender.get(i);
NTPtimestampSender = getMiddleNTPTimestamp(currentSenderPacket);
//calculation between two Sender
for( int j=i ; j < listSender.size() ; j++ ){
currentSenderPacketBis = listSender.get(j);
LSRtimestampSender = getLSRSender(currentSenderPacketBis);
if( NTPtimestampSender[0] == LSRtimestampSender[0] && NTPtimestampSender[1] ==
LSRtimestampSender[1]
&& NTPtimestampSender[2] == LSRtimestampSender[2] && NTPtimestampSender[3] ==
LSRtimestampSender[3] ){
System.out.println("le Sender n"+i+" va avec le sender n"+j);
try{
//System.out.println("Arrival time sender packet :
"+getArrivalTime(currentSenderPacket));
//System.out.println("Arrival time sender packet :
"+getArrivalTime(currentSenderPacketBis));
//System.out.println("sender packet
DLSR"+getDLSRSender(currentSenderPacketBis)+" seconde");
currentDelay = getArrivalTime(currentSenderPacketBis)getArrivalTime(currentSenderPacket)-getDLSRSender(currentSenderPacketBis);
System.out.println("Delai : "+currentDelay);
totalDelay += currentDelay;
nbDelay++;
}catch(Exception e){ System.out.println(e);}
}
}
//calculation between two Receiver
for( int j=0 ; j < listReceiver.size() ; j++ ){
currentReceiverPacket = listReceiver.get(j);
LSRtimestampReceiver = getLSRReceiver(currentReceiverPacket);
if( NTPtimestampSender[0] == LSRtimestampReceiver[0] && NTPtimestampSender[1] ==
LSRtimestampReceiver[1]

Page 42

&& NTPtimestampSender[2] == LSRtimestampReceiver[2] && NTPtimestampSender[3]


== LSRtimestampReceiver[3] ){
System.out.println("le Sender n"+i+" va avec le Receiver n"+j);
try{
//System.out.println("Arrival time sender packet :
"+getArrivalTime(currentSenderPacket));
//System.out.println("Arrival time receiver packet :
"+getArrivalTime(currentReceiverPacket));
//System.out.println("receiver packet DLSR
"+getDLSRReceiver(currentReceiverPacket)+" seconde");
currentDelay = getArrivalTime(currentReceiverPacket)getArrivalTime(currentSenderPacket)-getDLSRReceiver(currentReceiverPacket);
System.out.println("Delai : "+currentDelay);
totalDelay += currentDelay;
nbDelay++;
}catch(Exception e){ System.out.println(e);}
}
}
}
System.out.println("Delai total :"+totalDelay);
System.out.println("nbDelay :"+nbDelay );
return totalDelay/(double)nbDelay;
}
/*Main Method*/
public static void main(String[] args) throws Exception{
String fileName = args[0];
int sourcePort = Integer.parseInt(args[1]);
int destPort = Integer.parseInt(args[2]);
InetAddress source
= null;
InetAddress destination = null;
if( args.length > 3 ){
source
= InetAddress.getByName(args[1]);
destination = InetAddress.getByName(args[2]);
}
Delai delai = new Delai(sourcePort, destPort);
/*Change the current Woreshark file Here*/
//delai.capturePacketFromFile(fileName);
//delai.printPackets();
/*The parameter in here is the Wireshark file */
System.out.println("The average delay of this package is : "+delai.getDelay(fileName, source,
destination));
//delai.printPackets();
}
}

Page 43

VII Glossaire
A
adresse IP : Une adresse IP identifie un ordinateur ou un priphrique sur un rseau. On distingue les
adresses IP prives situes sur les rseaux locaux qui ne sont pas uniques, et les adresses IP publiques qui le
sont. Ceci est uniquement valable pour le systme actuel bas sur l'IPv4, qui souffre d' une pnurie d'
adresses (publiques).
A terme, grce l' Ipv6 cod sur 128 bits au lieu de 32, on pourra n' utiliser que des adresses publiques.
AIT : Athlone Institute of Technology. Sorte d' IUT l' Irlandaise qui a une mission de formation et
de recherche. Forme un petit campus elle seule.
API : Application Programming Interface, peut tre traduit par interface de programmation.
Dans le langage java, une API fournit et / ou abstrait une fonctionnalit, comme par exemple dans notre cas l'
interception et la lecture de paquets-rseau.
ARE : Applied Research Enhancement. Programme financ la fois par l' tat Irlandais, l' union
Europenne et les grandes entreprises prsentes en Irlande pour dvelopper la recherche. Vingt millions d'
euros ont dj t investis pour dvelopper la recherche dans les quatorze instituts de technologie que compte
l' Irlande.
C
Code source : Ensemble des instructions qui composent un programme.
Compilation : Action de fabriquer un programme partir du code source.
D
Desktop : il s' agit d'un ordinateur de bureau ( d'ou le mot Desk, qui signifie en anglais bureau). On
oppose le plus souvent le Desktop au Laptop (ordinateur portable).
G
Gratuitiel : Logiciel gratuit mais propritaire ( dont on ne peut pas voir son code source ni le
distribuer librement ).
L
Langage informatique : ensemble des symboles et des mots cls avec les rgles qui permettent de
dfinir des instructions pour l' ordinateur.
On distingue deux types de language :
-Les languages de bas-niveau, qui sont proches de la machine et du binaire afin de gagner en
prcision et en efficacit.
-Les languages de haut niveau, qui offrent davantage d' abstraction afin de rendre moins complexe et
plus rapide la programmation, le tout au dtriment de la vitesse d' excution.
Langage C : Langage informatique plutt bas niveau et ancien ( 1re version 1970 ). Il a l' avantage
compte tenu de son anciennet d' tre optimis et utilisable sur de trs nombreux types de machines
diffrentes.
Language java : Language informatique de haut-niveau, plutt rcent ( mi-90 ) et orient objet.
Linux : Systme d' exploitation open-source sous licence GPL.

Page 44

M
MySQL : SGBD open-source. Selon l' application, sa licence peut tre libre ou propritaire.
N
NAT : Network Address Translation. Dispositif qui permet de faire correspondre des adresses IP
internes non-uniques une ou plusieurs adresses IP publiques (uniques). Il s' agit d' conomiser des adresses IP
pour rpondre la pnurie actuelle (en IPv4).
O
Opensips : Logiciel libre ( open-source ) qui implmente le protocole SIP. Il est appel galement
Kamailio, et s' appelait auparavant openser.
Open-source ( logiciel ) : Il s' agit d' un logiciel qui peut tre redistribu librement et gratuitement, et
qui plus est offre un accs libre son code-source, sa recette de fabrication.
P
Proxy : Serveur qui permet de manire gnrale de relayer une requte.
Protocole ( de communication ) : Ensemble de rgles (de contraintes) qui permettent deux entits,
deux dispositifs de communiquer.
R
routeur : Equipement sur la couche 3 du modle OSI qui fait transiter les informations (paquets) d'un
rseau un autre (et vers la bonne machine !). Il s' appuie pour cela sur la table de routage.
RTP : Realtime Transport Protocol. Protocole qui permet la transmission de la voix sur un rseau
numrique. Utilis par la VoIP.
RTC : Reseau Tlphonique Commut, il s' agit du rseau tlphonique traditionnel , analogique.
RTCP : Real-time Transport Control Protocol. Il s' agit d' un protocole qui fonctionne de pair avec le
RTP et permet notamment de rapporter des statistiques sur la qualit de la conversation, comme le nombre de
paquets perdus ou la gigue. A partir de certaines donnes on peut calculer le dlai d' une conversation.
S
SRC : Software Research Centre. Dpartement de recherche de l' AIT financ par le projet ARE. Il
jouit du support de neuf partenaires industriels dont Ericsson.
SIP : Session Initiation Protocol. Protocole ouvert de communication situ sur la couche 5 du modle
OSI. Il permet l' tablissement de connexions pour un transfert de donnes de toute nature ( image, son,
vido... ), mais pas la transmission des donnes en elle-mme. Il est souvent utilis par la VoIP conjointement
avec le protocole RTP.
SDP : Session Description Protocol. Il s' agit d' un protocole qui est encapsul par SIP et contient des
informations d' identification comme le nom de session et dans notre cas des informations sur les codecs
audios utilisables.
Switch ( ou commutateur rseau ) : Equipement qui permet d' interconnecter des ordinateurs ( ou
parfois autre dispositif ). Il travaille au niveau 2 du modle OSI, mais contrairement au routeur ne permet pas
d' attribuer des adresses IP ou encore d' implmenter le NAT.
Systme d' exploitation : logiciel spcial qui permet un ordinateur de fonctionner. Il est galement
capable d' abstraire le fonctionnement de l' ordinateur et de fournir une interface facile d' accs l'utilisateur.

Page 45

Exemple : Windows, Linux etc.


U
Ubuntu : Il s'agit d'une distribution de Linux qui se veut accessible, ce qui se traduit notamment par
de nombreux outils avec interface graphique qui peuvent se manipuler la souris. Elle garde toutefois toute
la robustesse et les outils plus complexes des autres distributions.
V
VoIP : Voice over Internet Protocol. Technologie permettant de faire voyager la voix travers un
rseau numrique. Son cot est trs infrieur celui d' une communication classique ( fixe ou portable ). Elle
rend possible les appels de PC PC qui sont eux gratuits. Il est galement grce elle possible d' appeler d'
un ordinateur vers un tlphone, fixe ou portable.
W
Wifi : Technologie de rseau sans fil haut dbit courte porte ( 300 mtres maximum ). Elle peut
relayer un appel tlphonique grce la VoIP.

X
X-lite : client SIP multi-plateforme (Windows, Linux, Mac). Du point de vue rseau, X-lite peut
jouer le rle de client et de serveur, c'est pourquoi il est possible d'tablir une connection directe entre deux
postes X-lite.

VIII Bibliographie

Page 46

Site web :
Wikipdia en Franais : http://fr.wikipedia.org/wiki/Accueil
Wikipdia en Anglais : http://en.wikipedia.org/wiki/Main_Page
Site comprenant wiki et tutoriel sur la VoIP : http://www.voip-info.org
Site comprenant documentation et forum sur opensips : http://www.kamailio.org/
Site comportant la documentation et le logiciel mediaproxy : http://mediaproxy.ag-projects.com/
Site comportant des tudes sur la VoIP et ses implmentations : http://francois.ctrlaltdel.ch/
Site officiel d' Opensips : http://www.opensips.org/
Site officiel de Jpcap : http://netresearch.ics.uci.edu/kfujii/jpcap/doc/

Page 47

Vous aimerez peut-être aussi