Skip to main content
Claudio Weidmann - Teaching

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)
  1. 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)
  2. 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
  3. 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.

  1. 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.


  2. 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.

  3. 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 !