La Fibre

Télécom => Réseau => testdebit Comment tester son débit ? => Discussion démarrée par: vivien le 28 septembre 2011 à 20:33:30

Titre: TCPtrace - analyse du protocole TCP d'une capture wireshark
Posté par: vivien le 28 septembre 2011 à 20:33:30
TCPtrace est un outil pour analyser une capture Wireshark et voir de nombreux indicateur lié au protocole TCP

Detail des indicateurs fournis par TCPtrace :


Site officiel de TCPtrace : http://www.tcptrace.org/ (http://www.tcptrace.org/)
Le manuel en ligne (an anglais mais bien fait) : http://www.tcptrace.org/manual/index.html (http://www.tcptrace.org/manual/index.html)

Il est présent dans les dépots Debian et Ubuntu.

Ligne de commande : /usr/bin/tcptrace --nores_addr -lrW fichier.cap
Titre: TCPtrace - analyse du protocole TCP d'une capture wireshark
Posté par: vivien le 28 septembre 2011 à 20:35:07
Si vous souhaitez automatiser le post-traitement TCPtrace, j'ai déja écris un bout de code avec perl :

###################### TRAITEMENT DU FICIHIER .cap ######################
`/usr/bin/tcptrace --nores_addr -lrW $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.cap > $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace`;


###################### TRAITEMENT DU FICHIER .tcptrace ######################

### actual data pkts : PAQUETS ECHANGES ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "actual data pkts:"`;
$tmp = substr($valeur[0],23,10);
my $DownPaquets = sprintf("%.0f", $tmp);
$tmp = substr($valeur[1],23,10);
my $UpPaquets = sprintf("%.0f", $tmp);
if ($DownPaquets == 0) { `/bin/rm $Ramdisk_Dir/vigie.txt`; print "\nERREUR Nb paquets download = 0\n"; die "===> Paquets download = 0\n"; }
if ($UpPaquets == 0) { `/bin/rm $Ramdisk_Dir/vigie.txt`; print "\nERREUR Nb paquets upload = 0\n"; die "===> Paquets upload = 0\n"; }

### rexmt data pkts : PAQUETS RE-EMIS EN DOWNLOAD - PAQUETS RECUS EN DOUBLE (dupliqués) EN UPLAOD ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "rexmt data pkts:"`;
$tmp = substr($valeur[0],23,10);
my $DownPktsRetransmis = sprintf("%.0f", $tmp);
$tmp = substr($valeur[1],23,10);
my $UpPktsDupliques = sprintf("%.0f", $tmp);

### outoforder pkts : PAQUETS PERDU EN UPLOAD ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "outoforder pkts:"`;
# outoforder pkts : TRAITEMENT 2eme LIGNE (upload)
$tmp = substr($valeur[1],23,10);
my $UpPktsPerdus = sprintf("%.0f", $tmp);

### Calcul des pourcentages  ###
my $DownPaquetsUtile = $DownPaquets - $DownPktsRetransmis;
my $UpPaquetsUtile = $UpPaquets - $UpPktsDupliques;
my $UpPaquetsTotalCli = $UpPaquets + $UpPktsPerdus;
my $DownPcentRetransmis = sprintf("%.3f", 100 * $DownPktsRetransmis / $DownPaquetsUtile);
my $UpPcentDupliques = sprintf("%.3f", 100 * $UpPktsDupliques / $UpPaquetsUtile);
my $UpPcentPerdus = sprintf("%.3f", 100 * $UpPktsPerdus / $UpPaquetsUtile);

### Calcul des paquets retransmis en upload  ###
my $UpPcentRetransmis = sprintf("%.3f", $UpPcentPerdus + $UpPcentDupliques);


### DUPLICATE ACKS ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "duplicate acks:"`;
my $DownPktsdupacks = substr($valeur[0],23,10);
my $DownPcentdupacks = sprintf("%.3f", 100 * $DownPktsdupacks / $DownPaquetsUtile);
my $UpPktsdupacks = substr($valeur[1],23,10);
my $UpPcentdupacks = sprintf("%.3f", 100 * $UpPktsdupacks / $UpPaquetsUtile);

### TRIPLE DUPACKS ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "triple dupacks:"`;
my $DownPkts3dupacks = substr($valeur[0],23,10);
my $DownPcent3dupacks = sprintf("%.3f", 100 * $DownPkts3dupacks / $DownPaquetsUtile);
my $UpPkts3dupacks = substr($valeur[1],23,10);
my $UpPcent3dupacks = sprintf("%.3f", 100 * $UpPkts3dupacks / $UpPaquetsUtile);

### SEGMENTS ACQUITTES ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep " ack pkts sent:"`;
my $DownSegmentsAck = substr($valeur[0],23,10);
my $UpSegmentsAck = substr($valeur[1],23,10);
if ($DownSegmentsAck == 0) { `/bin/rm $Ramdisk_Dir/vigie.txt`; print "\nERREUR ségments acquittés down = 0\n"; die "===> ségments acquittés down = 0\n"; }
if ($UpSegmentsAck == 0) { `/bin/rm $Ramdisk_Dir/vigie.txt`; print "\nERREUR ségments acquittés up = 0\n"; die "===> ségments acquittés up= 0\n"; }

### PAQUETS ACK ENVOYES ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "segs cum acked:"`;
my $DownPktsAck = substr($valeur[0],23,10);
my $UpPktsAck = substr($valeur[1],23,10);
my $DownPcentPktsAck = sprintf("%.1f", 100 * $DownPktsAck / $DownSegmentsAck);
my $UpPcentPktsAck = sprintf("%.1f", 100 * $UpPktsAck / $UpSegmentsAck);

### MSS MAX ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "max segm size:"`;
$tmp = substr($valeur[0],23,10);
my $DownMss = sprintf("%.0f", $tmp);
$tmp = $tmp + 40; # MTU = MSS + 40 (20 entete TCP et 20 entete IP)
my $DownMtu = sprintf("%.0f", $tmp);
$tmp = substr($valeur[1],23,10);
my $UpMss = sprintf("%.0f", $tmp);
$tmp = $tmp + 40; # MTU = MSS + 40 (20 entete TCP et 20 entete IP)
my $UpMtu = sprintf("%.0f", $tmp);

### RWIN MAX ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "max win adv:"`;
$tmp = substr($valeur[0],62,10);
my $DownRwinMax = sprintf("%.1f", $tmp / 1000);
$tmp = substr($valeur[1],62,10);
my $UpRwinMax = sprintf("%.1f", $tmp / 1000);

### RTT ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "RTT full_sz min:"`;
$tmp = substr($valeur[0],23,10);
my $DownRttFullSzMin = sprintf("%.1f", $tmp);
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "RTT full_sz max:"`;
$tmp = substr($valeur[0],23,10);
my $DownRttFullSzMax = sprintf("%.1f", $tmp);
$tmp = substr($valeur[1],23,10);
my $GigueInterneSrvMax = sprintf("%.1f", $tmp);
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "RTT full_sz avg:"`;
$tmp = substr($valeur[0],23,10);
my $DownRttFullSzAvg = sprintf("%.1f", $tmp);

### TAILLE TOTALE ECHANGEE (INCLUS RETRANSMISSIONS) ###
@valeur = `/bin/cat $Ramdisk_Dir/$Port/$Client_Ip-$Client_id.tcptrace |/bin/grep "actual data bytes:"`;
$tmp = substr($valeur[0],23,10);
my $DownTransTotal = sprintf("%.2f", $tmp / 1000000);
$tmp = substr($valeur[1],23,10);
my $UpTransTotal = sprintf("%.2f", $tmp / 1000000);

### Calcul de la gigue ###
my $DownGigueInf = $DownRttFullSzAvg - $DownRttFullSzMin;
my $DownGigueSup = $DownRttFullSzMax - $DownRttFullSzAvg;
$tmp = ( $DownGigueInf > $DownGigueSup ) ? $DownGigueInf : $DownGigueSup;
my $DownGigueMax = sprintf("%.1f", $tmp);