jeudi 4 novembre 2010

Analyser les pertes de paquets UDP via un flux multicast RTP

Le concept :

De plus en plus de FAI mettent un couche supplémentaire pour les flux multicast (ceux qui transporte la TV) : RTP (Real-time Transport Protocol)



RTP rajoute 12 octets par paquet IP avec des informations d'horodatage et un n° de séquence. C'est ce dernier qui nous intéresse : il est incrémenté de un a chaque paquet : Cela nous permet de savoir si nous avons perdu des paquets.

Ce tuto a été testé avec les 3 FAI suivants :
- NeufBox de SFR
- Bbox de Bouygues Telecom
- ClubBox de Club-Internet

Il faut être abonné a l'offre TV pour que cela puisse fonctionner.

Nous allons utiliser VLC pour nous abonner aux flux multicast et Wireshark / Tshark pour analyser ces pertes de paquet.

Voici une liste de quelques IP multicast pour faire les tests :

IP multicast    port    Nom de la chaine TV             Débit IP     diffusion      Flux RTP disponible avec les Box
233.136.0.11665000ARTE SD MPEG42,47 Mb/sflux en clairNeufBox, Bbox de Bouygues Telecom
233.136.0.12765000I>Tele SD MPEG42,47 Mb/sflux en clairNeufBox, Bbox de Bouygues Telecom
233.60.197.864000I>Tele SD MPEG23,5 Mb/sflux en clairNeufBox, Bbox de Bouygues Telecom
233.49.82.737500TF1 HD MPEG4 adsl6,05 Mb/sflux cryptéNeufBox, Bbox de Bouygues Telecom
233.136.0.2017500France2 HD MPEG4 fibre optique12,28 Mb/sflux cryptéNeufBox fibre optique uniquement

Le plan de service complet de la NeufBox de SFR est consultable ici : http://lafibre.info/index.php/topic,3701.0.html


1ére étape : Installer VLC, Wireshark et Tshark.


2éme étape : Configurer Wireshark pour le RTP (Real-time Transport Protocol)

Pour Wireshark 1.0.7 (Ubuntu 9.04) :
1/ mkdir ~/.wireshark
2/ wget http://iperf.fr/download/wireshark/preferences.wireshark1.0.7-ubuntu9.04
3/ mv preferences.wireshark1.0.7-ubuntu9.04 ~/.wireshark/preferences
4/ wget http://iperf.fr/download/wireshark/disabled_protos.wireshark1.0.7-ubuntu9.04
5/ mv disabled_protos.wireshark1.0.7-ubuntu9.04 ~/.wireshark/disabled_protos

Pour Wireshark 1.0.3 (Ubuntu 8.10) :
1/ mkdir ~/.wireshark
2/ wget http://iperf.fr/download/wireshark/preferences.wireshark1.0.3-ubuntu8.10
3/ mv preferences.wireshark1.0.3-ubuntu8.10 ~/.wireshark/preferences
4/ wget http://iperf.fr/download/wireshark/disabled_protos.wireshark1.0.3-ubuntu8.10
5/ mv disabled_protos.wireshark1.0.3-ubuntu8.10 ~/.wireshark/disabled_protos


3éme étape : S'abonner au flux multicast avec VLC

cvlc rtp://@233.136.0.116


4éme étape : Lancer la capture + analyse temps réel avec Tshark

Lancer dans un autre terminal sans fermer la commande VLC :
sudo tshark -i eth0 -n -s 68 -w /tmp/capture_temporaire.cap -a duration:600 -z rtp,streams

A la fin de la capture il suffit de quitter VLC "CTRL" + "C" pour se dé-abonner du flux multicast



Voici un script pour lancer la capture depuis la Crontab en permanence :

#!/bin/bash
####################################################################################
# SYNOPSIS : est appelé depuis la crontab - pas d'options                          #
#                                                                                  #
# DESCRIPTION :                                                                    #
#   Fait une capture pendant 59minutes et 50 secondes                              #
#                                                                                  #
# DEPENDANCES :                                                                    #
#   /bin/bash                                                                      #
#   /bin/date                                                                      #
#   /bin/sync                                                                      #
#   /bin/rm                                                                        #
#   /usr/sbin/ntpdate                                                              #
#   /usr/bin/tshark                                                                #
#   /usr/bin/cvlc                                                                  #
#   /usr/bin/killall                                                               #
#   /usr/bin/sudo                                                                  #
#                                                                                  #
####################################################################################

# abonnement au flux
/usr/bin/sudo -u vgu /usr/bin/cvlc rtp://@233.49.82.73 &
# date de début de capture
/bin/date >> /root/capture.txt
# Capture avec Tshark
/usr/bin/tshark -i eth0 -n -s 68 -w /tmp/ramdisk0/capture_temporaire.cap -a duration:175 -z rtp,streams >> /root/capture.txt
# désabonnement du flux
/usr/bin/killall vlc
# Supressions des fichiers et sync pour ne pas avoir une grosse écriture qui fait perdre des paquets au début du tcpdump
/bin/rm /tmp/ramdisk0/capture_temporaire.cap
# MISE A L'HEURE (la mise à l'heure ne soit pas se faire pendant la capture)
/usr/sbin/ntpdate 194.158.119.97 >> /root/ntpdate.vg.log
# Ecriture du cache sur le disque pour que dump ne se produise pas pendant l'écriture
/bin/sync
# date de fin de capture
/bin/date >> /root/capture.txt
# Ecriture du cache sur le disque pour que dump ne se produise pas pendant l'écriture
/bin/sync

Le rendre exécutable : sudo chmod +x capture.sh

Pour mettre les préférence wireshark (2éme étape), il faut se connecter en root avec sudo -i pour avoir les variables environnement du root

La ligne a mettre dans la crontab :
lancement toutes les 3min : 0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * /root/capture.sh
lancement toutes les 4min : 0,4,8,12,16,20,24,28,32,36,40,44,48,52,56 * * * * /root/capture.sh


#!/bin/bash
####################################################################################
# SYNOPSIS : est appelé depuis la crontab - pas d'options                          #
#                                                                                  #
# DESCRIPTION :                                                                    #
#   Fait une capture pendant 59minutes et 50 secondes                              #
#                                                                                  #
# DEPENDANCES :                                                                    #
#   /bin/bash                                                                      #
#   /bin/date                                                                      #
#   /bin/sync                                                                      #
#   /bin/rm                                                                        #
#   /usr/sbin/ntpdate                                                              #
#   /usr/sbin/tcpdump                                                              #
#   /usr/bin/tshark                                                                #
#   /usr/bin/cvlc                                                                  #
#   /usr/bin/killall                                                               #
#   /usr/bin/sudo                                                                  #
#   /usr/bin/sleep                                                                 #
#                                                                                  #
####################################################################################

# abonnement au flux
/usr/bin/sudo -u vgu /usr/bin/cvlc rtp://@233.49.82.73 &
# date de début de capture
/bin/date >> /root/capture.txt
# Capture avec TCPdump
/usr/sbin/tcpdump -i eth0 -n -s 68 -w /tmp/ramdisk0/capture_temporaire.cap host 233.49.82.73 &
/bin/sleep 3550
/usr/bin/killall -s INT tcpdump
# désabonnement du flux
/usr/bin/killall -s INT vlc
# Post-traitement avec Tshark
/usr/bin/tshark -n -r /tmp/ramdisk0/capture_temporaire.cap -q -z rtp,streams >> /root/capture.txt
# Supressions des fichiers et sync pour ne pas avoir une grosse écriture qui fait perdre des paquets au début du tcpdump
/bin/rm /tmp/ramdisk0/capture_temporaire.cap
# MISE A L'HEURE (la mise à l'heure ne soit pas se faire pendant la capture)
/usr/sbin/ntpdate 194.158.119.97 >> /root/ntpdate.vg.log
# Ecriture du cache sur le disque pour que dump ne se produise pas pendant l'écriture
/bin/sync
# date de fin de capture
/bin/date >> /root/capture.txt
# Ecriture du cache sur le disque pour que dump ne se produise pas pendant l'écriture
/bin/sync


1ére étape : Installer VLC et Wireshark qui sont 2 logiciels libres.

En graphique sous Ubuntu, allez dans me menu Applications => Ajouter / supprimer... sélectionner "Afficher toutes les applications disponibles" et recherchez VLC et Wireshark.

Pour faire l'installation en ligne de commande :
sudo aptitude install vlc wireshark


 2éme étape : Configurer Wireshark pour le RTP (Real-time Transport Protocol)
Démarrez Wireshark.
Allez dans le menu Edit => Preferences...


Cliquez sur la petite flèche à gauche de Protocols


Cherchez RTP dans le bas de la liste (c'est par ordre alphabétique)
Cochez la 2éme case comme montré ci-dessous :

Cliquez sur Valider.

A partir de maintenant Wireshark et Tshark sont capable de décoder le protocole RTP

3éme étape : S'abonner au flux multicast avec VLC

Via une ligne de commande il suffit d'entrer la ligne suivante dans un terminal :
cvlc rtp://@233.136.0.116


Via l'interface graphique de VLC cela se fait en 3 étapes :








L'interface a utiliser est la première dans la liste qui a des paquets qui s'incrémente régulièrement. En Ethernet généralement c'est eth0





La capture temporaire (avant enregistrement) est réalisée dans /tmp
4éme étape : Lancer la capture avec Wireshark

5éme étape : Analyser la capture avec Wireshark

Aller dans le menu Telephony puis RTP et enfin Show All Streams





Exemples de résultats :

Pas bon :
# tshark -i eth3 -a duration:600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth3
142323 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0x1324FE6A MPEG-II transport streams 141011  1464 (1.0%)         4127.30            1.13            0.24 X
==============================================================

# tshark -i eth3 -a duration:600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth3
141168 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0x1324FE6A MPEG-II transport streams 141068  1283 (0.9%)         5394.35            0.46            0.24 X
==============================================================

Parfait :
# tshark -i eth0 -a duration:600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
142342 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0x1324FE6A MPEG-II transport streams 142269     0 (0.0%)            4.31            0.03            0.02
==============================================================

# tshark -i eth0 -a duration:600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
142430 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0x1324FE6A MPEG-II transport streams 142352     0 (0.0%)            4.30            0.03            0.02
==============================================================

Modem Dlink :
root@bt8silq2:~# tshark -i eth0 -a duration:3600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
855204 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0x1324FE6A MPEG-II transport streams 854739     0 (0.0%)            4.31            0.03            0.02
==============================================================


root@vivien:~# tshark -i eth0 -a duration:3600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
915734 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0x1324FE6A MPEG-II transport streams 845987  8675 (1.0%)         8102.02            0.48            0.12 X
==============================================================

Modem TG787 20min :
root@bt8silq2:~# tshark -i eth0 -a duration:1200 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
285038 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0xB2D9803F MPEG-II transport streams 284895     0 (0.0%)            4.31            0.51            0.01
==============================================================

root@vivien:~# tshark -i eth0 -a duration:1200 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
284856 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0xB2D9803F MPEG-II transport streams 257782 27010 (9.5%)        45797.12            0.65            0.27 X
==============================================================

Modem TG787 20min :
root@bt8silq2:~# tshark -i eth0 -a duration:1200 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
285087 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0xB2D9803F MPEG-II transport streams 284901     0 (0.0%)            4.33            0.83            0.01
==============================================================

root@vivien:~# tshark -i eth0 -a duration:1200 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
287700 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0xB2D9803F MPEG-II transport streams 262157 22702 (8.0%)        31113.13            0.68            0.27 X
==============================================================

Modem TG787 60min :
root@bt8silq2:~# tshark -i eth0 -a duration:3600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
749068 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0xB2D9803F MPEG-II transport streams 748642     0 (0.0%)            4.32            1.24            0.01
==============================================================

root@vivien:~# tshark -i eth0 -a duration:3600 -q -z rtp,streams
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
903653 packets captured
========================= RTP Streams ========================
    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  84.96.146.150  5000   233.136.0.116 65000 0xB2D9803F MPEG-II transport streams 826094 28748 (3.4%)        48968.63            0.85            0.27 X
==============================================================

Aucun commentaire:

Enregistrer un commentaire