M2 SIC-Pro Systèmes intelligents et communicants
UEF 6 - Partie
« Réseaux mobiles et QoS (Réseaux avancés) »
Répertoire avec les
supports de cours (accès
réservé)
Plan des CM (attention, provisoire)
- Cours du 6.03.2019 :
Streaming multimédia avec RTP
(M2-ResAv-2018-19.pdf)
Protocoles de transport, évitement de congestion dans TCP (KR_Chapter_3_mod.pdf)
- Cours du 20.03.2019 :
Concepts de la qualité de service (01 - QOS concept - mod.pdf)
Notes de cours de I. Andriyanova cours 3-qualite-service.pdf
- Cours du 3.04.2019 :
DiffServ, IntServ, MPLS
(06 - QOS niveau 3 -
mod.pdf)
MPEG Dash HTTP streaming
(MPEG-Dash.pdf)
Plan des TD/TP (attention, provisoire)
Un rapport écrit doit être rendu après chaque TD/TP. Documentez toutes les
étapes ; votre rapport doit permettre de reproduire vos résultats.
- TP du 6.03.2019 :
- Installer la VM mininet du NAS de la salle réseau (si pas dispo
: images, instructions),
de préférence dans VirtualBox. Vérifier que vous disposez aussi d'un
terminal ssh avec fonctionnalité X server (comme mobaXterm), car la VM n'a
pas de desktop/X. D'autres outils nécessaires seront installés à fur et à
mesure.
- (Optionnel) Faire (une partie)
du tour guidé de
mininet.
Login/mdp mininet/mininet. Les expériences se font en
se connectant au serveur ssh de la VM. Pour que cela marche, il faut
configurer la VM avec carte réseau en mode "host-only
network".
- Faire
le TP
Bufferbloat. Pour installer les scripts du TP et autres paquets
nécessaires, il faut redémarrer la VM avec carte réseau en mode NAT ou
pont. Il est nécessaire d'installer
sudo apt-get install python-setuptools python-all-dev python-matplotlib flex bison traceroute samba
git clone https://bitbucket.org/huangty/cs144_bufferbloat.git
Pour avoir accès aux fichiers de la VM en mode "host only", configurer le
serveur SMB pour donner accès à /home/mininet :
sudo smbpasswd -a mininet
sudo nano /etc/samba/smb.conf
sudo /etc/init.d/samba stop
sudo /etc/init.d/samba restart
Depuis le hôte on se connectera sur 192.168.56.101 avec login mininet.
- TP du 20.03.2019 :
- On continue à utiliser l'environnement d'émulation mininet proposé par
le TP bufferbloat, avec une appli serveur sur l'hôte h1 et une appli
client sur h2. On veut obtenir des statistiques QoS à partir de traces
tcpdump ou wireshark. On cherche délai moyen, gigue (écart type du délai),
taux de perte, bande passante utile.
Pour estimer la gigue (jitter)
d'une session UDP à partir de traces pcap (obtenues avec tcpdump ou
wireshark/tshark), on peut consulter la
page suivante
(ce qui nous intéresse sont les scripts, le reste on le fait avec d'autres
outils : netcat, tc/netem). Voici des versions adaptés des scripts :
getjitter.bash
et getlatency.bash. Les scripts
utilisent des champs RTP, il faut donc utiliser une vraie appli streaming
RTP/UDP. Pour cela, utilisez les outils ffmpeg, avec un fichier audio MP3 à débit constant p.ex. 128 kb/s
(durée 1 minute environ). La façon plus simple d'installer ffmpeg est la
version avec library statique disponible ici
(attention à choisir la bonne version,
selon uname -a). Un fichier audio :
wget http://www.music.helsinki.fi/tmt/opetus/uusmedia/esim/a2002011001-e02-128k.mp3
Exemple (serveur, client):
./ffmpeg -re -i a2002011001-e02-128k.mp3 -vn -acodec copy -f rtp rtp://192.168.56.101:9999
Copier l'information sdp affichée dans un fichier texte test.sdp.
Client :
./ffmpeg -protocol_whitelist file,udp,rtp -i test.sdp -acodec copy test.mp3
Déterminer dans quel ordre démarrer tcpdump (des deux côtés), le client et le
serveur.
wireshark propose un mode statistique RTP qui marche aussi sur une seule
trace (comment ?), vous pouvez l'utiliser pour vérifier les résultats obtenus
avec le script. Commenter aussi ce qui font/affichent les scripts.
- Répéter l'expérience avec du trafic TCP en compétition. Pour cela,
utiliser netcat ou iperf, qui vous donnera aussi des statistiques de
performance. Varier la durée du trafic TCP (durant une partie ou toute la
session streaming).
- Optionnel : Emulation d'un lien type xDSL avec traffic control (tc) et
netem
(exemple
d'utilisation de tc/netem). Vous allez modifier le script tc_cmd.sh du
paquet bufferbloat pour cela. D'abord, familiarisez-vous avec les
fonctionnalités de tc/netem utilisées pour émuler le lien de 1.5Mb/s du TP
(voir script tc_cmd.sh et comment il est appelé depuis bufferbloat.py).
Configuration souhaitée : 1.5 Mbit/s dans la voie descendante vers h2
(downstream) et 384 kbit/s dans la voie montante (upstream) depuis
h2.
Le filtre token bucket de tc affecte le trafic sortant uniquement, il faut
donc configurer les machines au deux bouts du lien Ethernet. Pour tester
la réduction asymétrique de la bande passante, utilisez iperf dans les
deux sens.
Répéter les expériences précédentes.
- TP du 3.4.2019 :
- TD3 sur TCP dans les réseaux sans fil, DiffServ (temps prévu : 0,5h
matin, 0,5h après-midi)
- Créer deux classes de QoS (RTP/autre) et paramétrer le noyau avec tc pour
obtenir des meilleures performances (gigue, délai) pour le RTP. Vous allez
modifier le script tc_cmd_diff.sh du
paquet bufferbloat pour cela. Ce script est utilisé dans la partie
"Different queues" de bufferbloat. Familiarisez-vous avec ses
fonctionnalités, pour cela vous pouvez aussi consulter un
article
sur traffic control dans Linux. Voici une une copie locale, si linuxwall est
hors ligne.
Les remarques ci-dessous sont pour une ancienne version du TP, mais reste en
partie valables. Par contre, pour simplifier la tâche, gardez l'approche
simpliste de tc_cmd_diff.sh (partage de la BP entre 2 classes). Il faut
donc juste modifier les éléments de classification pour que le trafic RTP
soit séparé de l'autre trafic.
Remarques:
- La QoS doit être mise en place sur la machine serveur ou routeur
head-end (c'est à son
interface réseau qui se trouve le goulet d'étranglement qui retarde le
trafic streaming).
- Il faut créer une qdisc htb avec deux classes (similaire à l'exemple
en section 1.3 de l'article linuxwall). La classe pour le RTP aura
priorité 1 et pourra "emprunter" de la bande passante de l'autre classe
(voir article). Le cap total restera à 8 Mbit/s
- Ensuite, utiliser iptables/netfilter pour marquer les paquets RTP. Pour
cela, filtrer sur le protocole UDP (le RTP n'est pas reconnu) et le numéro de port de destination (ou
port source, si configuré,
voir ici). La
marque correspondra au "handle" du htb, voire article section 1.2ff.
Répéter les expériences précédentes et vérifier que le trafic RTP est
moins perturbé (gigue et latence réduites/constantes, selon le choix du
paramétrage QoS).
Optionnel : googler "TCP ACK compression" (voir RFC 3449) et essayer de
créer une simulation
de ce phénomène (que avec du trafic TCP avec iperf ou netcat ; pas de
RTP). Pour cela, vous avez besoin de l'émulation d'un lien type xDSL
(option de TP précédant).
Ensuite, modifier la QoS de la machine client(!) pour que les paquets TCP ACK
soient prioritaires sur les autres paquets. Cela est aussi mentionné dans
l'article linuxwall. Vérifier les meilleures performances dans la voie
descendante (vers le client). NB certains interfaces noyau (comme
ip_conntrack)
mentionnées dans
l'article ont changé dans les versions plus récentes de linux - googler si
problème !