Par contre dans la plupart des implémentations HTTP/2 est souvent moins performant en débit brut que HTTP/1. Donc pour du téléchargement web par exemple on utilise souvent encore plutôt du HTTP/1 en attendant HTTP/3.
C'est ce que je suis en train de vérifier en testant en local (PC directement connecté à un serveur situé à 30cm de lui) le débit HTTP/1 vs HTTP/2 avec Curl sur différentes latences.
Dans mon script perl (voir ci-dessous), je fais les requêtes sur "appliwave.testdebit.info", c'est pour avoir un certificat valide : j'ai récupéré le certificat de ce serveur et dans le fichier /etc/hosts, je fais pointer appliwave.testdebit.info vers 192.168.2.1, mon serveur local. Je suis donc en conditions parfaites (serveur dédié à mon test, client dédié à mon test et réseau parfait).
Je teste avec les latence +0ms, +1ms, +2ms, +4ms, +8ms, +16ms, +32ms, +64ms, +128ms, +256ms, +512ms, +1024ms
J'ai un problème pour mon script, il utilise tc pour rajouter de la latence :
`sudo tc qdisc change dev $interface root netem delay 4ms`;Le script est lancé avec l'utilisateur "vgu". COmme il faut les droits root (dans mon script j'utilise sudo), j'utilise
visudo pour modifier
/etc/sudoers, j'ai rajouté :
vgu ALL=NOPASSWD: /usr/sbin/tc
mais il demande toujours le mot de passe.
J'ai aussi testé pour qu'il ne demande de mot de passe pour aucune application, mais cela ne fonctionne pas :
vgu ALL=NOPASSWD: ALL
Je veut bien la bonne ligne à rentrer dans visudo.
#!/usr/bin/perl -w
use strict;
use Switch;
###################### testdebit.pl ######################
# Script perl de test de débit descendant pour Linux version 1.1 du 14 mars 2021
# Écrit par Vivien GUEANT sous Licence publique générale GNUv3
# Débit affichés en Mb/s (1 Mb/s = 1 000 000 bits)
# Taille affichée en Mo (1 Mo = 1 000 000 octets)
###################### Dépendances à installer sous Ubuntu :
# sudo apt install curl libswitch-perl
############# INITIALISATION DES CHEMINS #################
my $LOGFILE_NAME = "/home/vgu/testdebit_log.csv"; # Fichier de log
my $UP_FILE_NAME = "/home/vgu/testdebit_upload.iso"; # Fichier pour l'upload
my $interface = "eno2"; # Interface réseau pour NetEm 1 Gb/s
#my $interface = "enp1s0"; # Interface réseau pour NetEm 10 Gb/s
###################### FONCTION CURL ######################
sub curl
{
# VARIABLES PASSEES EN ARGUMENT
my ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom) = @_;
my @CurlResult = "";
###################### GENERATION DE LA DATE ######################
my $time = localtime(time);
my $Annee = substr($time,length($time)-4);
my $Jour = substr($time,8,2);
if ($Jour < 10){ $Jour = "0".substr($Jour,1); }
my $Mois = substr($time,4,3);
switch ("$Mois") {
case "Jan" { $Mois = "01"; }
case "Feb" { $Mois = "02"; }
case "Mar" { $Mois = "03"; }
case "Apr" { $Mois = "04"; }
case "May" { $Mois = "05"; }
case "Jun" { $Mois = "06"; }
case "Jul" { $Mois = "07"; }
case "Aug" { $Mois = "08"; }
case "Sep" { $Mois = "09"; }
case "Oct" { $Mois = "10"; }
case "Nov" { $Mois = "11"; }
case "Dec" { $Mois = "12"; }
}
my $Heure = substr($time,length($time)-13,8); # Calcul de l'heure avec les minutes et les secondes
my $DateHeure = $Annee."-".$Mois."-".$Jour." ".$Heure; # DateHeure pour MySQL
#my $Date = $Annee."-".$Mois."-".$Jour; # Date pour MySQL
my $Date = $Jour."/".$Mois."/".$Annee; # Date pour fichier CSV
$Heure = substr($time,length($time)-13,2); # Calcul de l'heure sans les minutes, ni les secondes
my $DateHeure0000 = $Annee."-".$Mois."-".$Jour." ".$Heure.":00:00"; # DateHeure sans les minutes, ni les secondes pour faciliter les grpahes
###################### GENERATION DE LA PERIODE DE TEST (0=err 1=HeureNuit, 2=HeureCreuse, 3=HeurePleine) ######################
my $BH = "0";
switch ("$Heure") {
case "00" { $BH = "1"; }
case "01" { $BH = "1"; }
case "02" { $BH = "1"; }
case "03" { $BH = "1"; }
case "04" { $BH = "1"; }
case "05" { $BH = "1"; }
case "06" { $BH = "1"; }
case "07" { $BH = "2"; }
case "08" { $BH = "2"; }
case "09" { $BH = "2"; }
case [10..17] { $BH = "2"; }
case [18..22] { $BH = "3"; }
case "23" { $BH = "2"; }
}
###################### GENERATION DE LA PERIODE DE TEST (0=err 1=Semaine, 2=WeekEnd) ######################
my $WeekEnd = substr($time,0,3);
switch ("$WeekEnd") {
case "Mon" { $WeekEnd = "1"; }
case "Tue" { $WeekEnd = "1"; }
case "Wed" { $WeekEnd = "1"; }
case "Thu" { $WeekEnd = "1"; }
case "Fri" { $WeekEnd = "1"; }
case "Sat" { $WeekEnd = "2"; }
case "Sun" { $WeekEnd = "2"; }
else { $WeekEnd = "0"; }
}
###################### Téléchargement CURL ######################
if("$type_test" eq "download") {
print ("Fichier en cours de téléchargement : $serveur_url\n");
@CurlResult = `curl -$serveur_proto $serveur_http -s -w %{speed_download}-%{time_namelookup}-%{time_connect}-%{time_starttransfer}-%{time_total}-%{size_download}-%{remote_ip} -o /dev/null "$serveur_url"`;
}
if("$type_test" eq "upload") {
print ("Fichier en cours d'upload : $UP_FILE_NAME vers $serveur_url\n");
@CurlResult = `curl -$serveur_proto $serveur_http -s -w %{speed_upload}-%{time_namelookup}-%{time_connect}-%{time_starttransfer}-%{time_total}-%{size_upload}-%{remote_ip} -F filecontent=@"$UP_FILE_NAME" -o /dev/null "$serveur_url"`;
}
###################### Post-traitelment données brut CURL ######################
my @CurlData = split(/-/, $CurlResult[0]);
##### speed_download / speed_upload
$CurlData[0] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $debit_tout_inclus = 8 * $CurlData[0] /1000000;
##### DNS time_namelookup
$CurlData[1] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $dns = 1000 * $CurlData[1];
##### time_connect (inclus : DNS)
$CurlData[2] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $dns_time_connect = 1000 * $CurlData[2];
##### time_starttransfer (inclus : DNS + time_connect)
$CurlData[3] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $dns_ping_start = 1000 * $CurlData[3];
##### time_total (inclus : DNS + time_connect + time_starttransfer)
$CurlData[4] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $time_total = 1000 * $CurlData[4];
##### size_download / size_upload
my $taille = $CurlData[5] /1000000;
##### remote_ip
my $remote_ip = $CurlData[6];
##### calculs
my $ping_tcp = $dns_time_connect - $dns;
my $start_transfer = $dns_ping_start - $dns_time_connect;
my $temps_transfert = $time_total - $dns_ping_start;
###################### Si division par 0, on quitte proprement ######################
if ("$temps_transfert" eq "0") {
print "Erreur de division par 0: temps_transfert=0 obtenu par time_total=$time_total - dns_ping_start=$dns_ping_start\n";
print LOG ("$DateHeure;$Date;$Heure;$BH;$WeekEnd;$DateHeure0000;$serveur_nom;$type_test;$taille;IPv$serveur_proto;0;$debit_tout_inclus;$dns;$ping_tcp;$start_transfer;$dns_ping_start;$temps_transfert;$remote_ip\n");
}
else {
my $debit_utile = 8000 * $taille / $temps_transfert;
###################### Sortie vers le fichier CSV ######################
print LOG ("$DateHeure;$Date;$Heure;$BH;$WeekEnd;$DateHeure0000;$serveur_nom;$type_test;$taille;IPv$serveur_proto;$debit_utile;$debit_tout_inclus;$dns;$ping_tcp;$start_transfer;$dns_ping_start;$temps_transfert;$remote_ip\n");
###################### Sortie au format texte ######################
print ("#####################################################################################\n");
print ("###################### Résultats du test du $Date à $Heure heure\n");
print ("###################### Transfert $type_test d'un fichier de $taille Mo en IPv$serveur_proto\n");
print ("#####################################################################################\n");
print ("Nom : $serveur_nom\n");
print ("Débit moyen utile (DNS + SYN exclu): $debit_utile Mb/s\n");
print ("Débit moyen réel (temps1+t2+t3+t4): $debit_tout_inclus Mb/s\n");
print ("Temps1: résolution DNS : $dns ms\n");
print ("Temps2: connexion [SYN]+[SYN ACK] : $ping_tcp ms\n");
print ("Temps3: entre [SYN ACK] et 1er paq : $start_transfer ms\n");
print ("Somme de Temps1 + Temps2 + Temps3 : $dns_ping_start ms\n");
print ("Temps4: temps de transfert utile : $temps_transfert ms\n");
print ("Taille utile transférée : $taille Mo\n");
print ("Remote IP : $remote_ip\n");
print ("Date et heure : $DateHeure\n");
print ("#####################################################################################\n\n");
}
}
########################################################################
########################## DEBUT DU PROGRAMME ##########################
########################################################################
############# INITIALISATION DES VARIABLES #################
my $type_test ="0"; # download ou upload
my $serveur_proto = "0"; ## 4 pour IPv4 ou 6 pour IPv6
my $serveur_http = "0"; ## --http1.1 ou --http2
my $serveur_url = "0"; ## Url du serveur avec http:// ou https://
my $serveur_nom = "0"; ## Nom du serveur
###################### Sleep aléatoire de 3 minutes (180 secondes) avant le lancement ######################
#my $random = int(rand(180)) + 1;
#print ("Pause de $random secondes\n");
#`/bin/sleep $random`;
# Initialisation NetEm
`sudo tc qdisc add dev $interface root netem delay 0ms`;
############# OUVERTURE DU FICHIER DE LOG CSV #################
open(LOG, ">>$LOGFILE_NAME") || die "===> Kill : Impossible d'ouvrir le fichier de log $LOGFILE_NAME";
###########################################################
########################## TESTS ##########################
###########################################################
############# Tests Download IPv4
$type_test = "download";
$serveur_proto = "4";
`sudo tc qdisc change dev $interface root netem delay 0ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-0ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-0ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 1ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 2ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-2ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-2ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 4ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-4ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-4ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 8ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-8ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-8ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 16ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-16ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-16ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 32ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-32ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-32ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 64ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-64ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-64ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 128ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-128ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-128ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 256ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-256ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-256ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 512ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-512ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-512ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
`sudo tc qdisc change dev $interface root netem delay 1024ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1024ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1024ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://appliwave.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
############# Initialisation des tests d'Upload #############
if (-e "$UP_FILE_NAME") {
# Le fichier à uploader existe
}
else {
print ("Fichier upload $UP_FILE_NAME absent => Téléchargement\n");
`curl -o "$UP_FILE_NAME" "https://appliwave.testdebit.info/250Mi.iso"`
}
############# Tests Upload IPv4
$type_test = "upload";
$serveur_proto = "4";
#############
$serveur_nom = "Bouygues BBR";
$serveur_url = "https://paris.testdebit.info/dl/262144000.iso";
#curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#`/bin/sleep 20`;
############# Fermeture du fichier de log et supression du fichier #############
close LOG || die "===> Kill (à la fin du programme) : Problème à la fermeture du fichier de log $LOGFILE_NAME : $!";