Académique Documents
Professionnel Documents
Culture Documents
Kewin Dousse
Projet de Bachelor
Filière Informatique
Haute Ecole d’Ingénierie et d’Architecture de Fribourg
Fribourg, Suisse
Version 1.0
HTTP 1.1 est resté pendant longtemps le protocole de transfert le plus utilisé
pour le web. Les applications web d’aujourd’hui recherchent la performance sans
cesse, et HTTP/2 est une réponse à ce besoin. Ce projet analyse le protocole
HTTP/2, puis décrit la conception et l’implémentation d’un outil démonstratif de
ses nouveautés et termine par analyser ses performances observées.
Keywords. HTTP2, Web, Protocol
Table des matières
1 Introduction 9
1.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Analyse 12
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.1.1 Principes de base . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Fonctionnement des frames . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.2 Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.1 Streams et multiplexage . . . . . . . . . . . . . . . . . . . . 14
2.3.2 Priorisation et dépendance . . . . . . . . . . . . . . . . . . . 15
2.4 Types de frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.1 DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.2 HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.3 PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.4 RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.5 SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.6 PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 22
2.4.7 PING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4.8 GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4.9 WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . 24
2.4.10 CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 25
2.5 HPACK : Compression des headers . . . . . . . . . . . . . . . . . . 25
2.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.2 Principe de base . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.3 Représentation . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6 PUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7 Utilisation du protocole . . . . . . . . . . . . . . . . . . . . . . . . 30
2.7.1 Première connexion . . . . . . . . . . . . . . . . . . . . . . . 30
3
TABLE DES MATIÈRES TABLE DES MATIÈRES
3 Conception 31
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.1 Idée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.2 But de l’outil . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.1 Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.2 Serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.1 Téléchargement de la page web . . . . . . . . . . . . . . . . 32
3.3.2 Mise en place sur le serveur . . . . . . . . . . . . . . . . . . 32
3.3.3 Benchmark de la page . . . . . . . . . . . . . . . . . . . . . 33
3.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4 Réalisation 36
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2 Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.1 Choix du client . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3.1 Serveur HTTP . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3.2 Téléchargement de la page web . . . . . . . . . . . . . . . . 39
4.3.3 Copie et ajustements . . . . . . . . . . . . . . . . . . . . . . 39
4.3.4 Configuration automatique de PUSH . . . . . . . . . . . . . 41
4.3.5 Page de benchmark . . . . . . . . . . . . . . . . . . . . . . . 42
4.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5 Validation 46
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2 Test du Serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.1 Correspondance des pages téléchargées . . . . . . . . . . . . 47
5.2.2 Conformité des protocoles . . . . . . . . . . . . . . . . . . . 49
5.2.3 HTTP 1.1 sur le port 8081 . . . . . . . . . . . . . . . . . . . 49
5.2.4 HTTP/2 sur le port 8082 . . . . . . . . . . . . . . . . . . . . 50
5.2.5 HTTP/2 avec PUSH sur le port 8083 . . . . . . . . . . . . . 50
5.3 Test des Benchmarks . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6 Résultats 54
6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2 Exécutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4
TABLE DES MATIÈRES TABLE DES MATIÈRES
6.2.1 Explications . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.2 Observations . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7 Conclusion 60
7.1 Conclusion du projet . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.1.1 Délivrables . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.1.2 Conclusion générale . . . . . . . . . . . . . . . . . . . . . . . 60
7.1.3 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.2 Conclusion personnelle . . . . . . . . . . . . . . . . . . . . . . . . . 61
C Documentation 72
C.1 Localisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
C.2 Contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
C.2.1 Forge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
C.2.2 DVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
D Code source 73
D.1 README.md . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
D.2 copyExample . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
D.3 downloadSite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
D.4 clearSite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
D.5 setDelay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
D.6 app/.htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
D.7 app/index.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
D.8 app/downloadSite.php . . . . . . . . . . . . . . . . . . . . . . . . . 81
D.9 app/compareSite.php . . . . . . . . . . . . . . . . . . . . . . . . . . 83
D.10 app/delay.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
D.11 example/.htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
D.12 example/index.html . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
D.13 example2/.htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
D.14 example2/index.html . . . . . . . . . . . . . . . . . . . . . . . . . . 92
E Résultats complets 94
5
TABLE DES MATIÈRES TABLE DES MATIÈRES
F Procès-verbaux 95
6
Table des figures
1.1 Schéma classique de l’affichage d’une page web avec HTTP 1.1. . . 10
1.2 Evolution du transfert nécessaire pour une page web entre le 15 mai
2011 et 2016[4]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.1 Chacun des 4 Virtual Host est accessibles par un port différent. . . 38
4.2 Vue de la page d’accueil de l’application . . . . . . . . . . . . . . . 39
4.3 Vue de la page de téléchargement . . . . . . . . . . . . . . . . . . . 40
4.4 Vue de la page de benchmarks, en cours de test du domaine google.ch. 42
4.5 Script setDelay . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7
TABLE DES FIGURES TABLE DES FIGURES
8
Chapitre 1
Introduction
1.1 Contexte
HTTP est l’abréviation de "HyperText Transfer Protocol ", ou "Protocole de
transfert hypertexte" en français. Il s’agit d’un protocole de communication, utilisé
entre un serveur et un client pour transférer des données. Ce protocole est un des
piliers du fonctionnement du web actuel. La première version standardisée de ce
protocole, nommée HTTP 1.0, date de 1996[1]. Depuis, une version actualisée de
ce protocole a vu le jour sous le nom de HTTP 1.1 en 1997[2].
Voilà maintenant presque vingt ans que la version 1.1 du protocole existe, et elle
reste celle sur laquelle repose la plupart des communications du web d’aujourd’hui.
Durant cette période, le fonctionnement général de ces communications sur le web
n’a donc pas changé, mais son utilisation a explosé ; le trafic Internet mondial
augmente de manière exponentielle depuis maintenant quinze ans.
Bien que tout le trafic ne soit pas du HTTP, nous nous rendons bien compte
de l’évolution fulgurante de l’utilisation de ces technologies. HTTP est principale-
ment utilisé pour transférer des données d’un site web à un utilisateur. L’affichage
complet d’une page web se fait petit à petit. La figure 1.1 montre un schéma d’une
connexion classique à une page web, divisée en différentes étapes :
1. L’utilisateur demande au navigateur d’accéder à la page d’accueil du site
web.
2. Le navigateur demande le code HTML de la page d’accueil au serveur
concerné.
3. Le serveur donne au navigateur le code HTML de la page, qui va être lu et
compris. Ici, la page désire afficher une image et nécessite un autre fichier
de script.
4. Le navigateur envoie une demande par fichier supplémentaire nécessaire.
9
1.1. CONTEXTE CHAPITRE 1. INTRODUCTION
Serveur
Client
Navigateur web
Utilisateur
1 2
3
6
index.html
4
5
image.png
4
5
script.js
Figure 1.1 – Schéma classique de l’affichage d’une page web avec HTTP 1.1.
10
CHAPITRE 1. INTRODUCTION 1.2. OBJECTIFS
Figure 1.2 – Evolution du transfert nécessaire pour une page web entre le 15 mai
2011 et 2016[4].
HTTP/2 va conserver une partie du protocole HTTP 1.1 afin de ne pas casser
la compatibilité avec les applications web existantes. En effet ; la partie de haut
niveau, visible par les applications, restera inchangée : Par exemple les méthodes,
les codes de statut, l’interprétation des URIs ou la signification des en-têtes ne
change pas. Les différences de HTTP/2 résident principalement dans la manière
dont ces informations sont représentées et sont échangées sur le réseau. Le but
de ce projet va donc être de se pencher sur le fonctionnement, les contraintes, les
améliorations apportées et les performances de HTTP/2.
1.2 Objectifs
À la fin du projet, nous serons en possession :
— D’une étude du fonctionnement du protocole HTTP/2.
— D’un comparatif de HTTP/2 avec ses alternatives.
— D’une analyse des contraintes de HTTP/2 par rapport à HTTP 1.1 : Quels
sont les changements nécessaires à faire dans la configuration actuelle des
serveurs.
— De statistiques sur les améliorations et les performances de HTTP/2 ainsi
que d’outils permettant de les mesurer.
11
Chapitre 2
Analyse
2.1 Introduction
HTTP/2 a été développé sur la base d’un autre protocole de transfert expé-
rimental. Celui-ci se nomme SPDY et a été développé principalement par Google
depuis environ 2010. Son but était déjà de réduire le temps de chargement des pages
web en se servant de plusieurs techniques comme la compression, le multiplexage
et la priorisation de ressources.
Les résultats concluants de SPDY ont poussé les discussions vers la rédaction
d’un nouveau standard, qui allait se nommer HTTP/2. Le développement s’est
ainsi peu à peu tourné vers HTTP/2, reprenant les bases de SPDY tout en y
apportant des modifications et améliorations.
12
CHAPITRE 2. ANALYSE 2.2. FONCTIONNEMENT DES FRAMES
2.2.2 Format
Chaque type de frame utilise un format prédéfini. Leur en-tête est identique :
Elles utilisent toutes un header fixe de 9 octets. La figure 2.1 décrit cette structure.
Type Type de la frame. Représenté par un entier non signé de 8 bits. Doit
correspondre à un des types définis.
13
2.3. STREAMS CHAPITRE 2. ANALYSE
0 7 8 15 16 23 24 31
Length Type
Flags R Stream ID
Stream ID
Frame payload
❤❤❤❤
❤❤❤❤❤❤❤❤❤❤
❤
❤❤❤❤ ❤❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤
❤❤❤❤❤
❤
Flags Flags de la frame, utilisé par certains types spécifiques. Doit être laissé à
0 lorsque non utilisé.
2.3 Streams
2.3.1 Streams et multiplexage
HTTP 1.1 ouvrait une connexion TCP par fichier demandé, jusqu’à 6 connexions
sur le même serveur. Ces 6 connexions étaient ensuite réutilisées pour transférer les
prochains fichiers : Ceci a pour effet de limiter le nombre de transferts concurrents
par serveur à 6 fichiers.
Contrairement à HTTP 1.1, HTTP/2 n’ouvre qu’une seule connexion TCP par
serveur contacté, peu importe le nombre de ressources à demander sur ce serveur.
Le but est à présent de transférer toutes les requêtes et les réponses à travers cette
seule connexion. Pour y parvenir, HTTP/2 utilise plusieurs streams multiplexés.
14
CHAPITRE 2. ANALYSE 2.3. STREAMS
Serveur
Client
Stream 2 Stream 2 Stream 2 Stream 5
HEADERS DATA DATA HEADERS
Stream 3 Stream 4
HEADERS DATA
15
2.3. STREAMS CHAPITRE 2. ANALYSE
Dépendance
Stream 2
Stream 1 Stream 3
À partir de ceci, il est donc possible de créer une structure en forme d’arbre
de dépendance des streams. Ceci signifie que les streams à la racine de l’arbre (en
haut) sont les plus importants à transmettre et seront transmis en priorité, alors
que les streams proches des feuilles (en bas) seront transmis plus tard.
Poids
Chaque dépendance peut se voir assigner un poids. Le poids est une valeur
entière entre 1 et 256. Ce poids va déterminer l’importance de ce stream particulier,
par rapport aux autres ayant la même dépendance. Le poids d’un stream qui serait
le seul a dépendre d’un autre n’aurait donc aucun effet, car ces poids n’ont de
signification que par rapport aux autres.
La figure 2.4 montre un arbre de dépendance avec un poids assigné à chacune
d’entre-elles. Nous pouvons en retirer les informations suivantes :
— Les streams 1, 3 et 4 dépendent du stream 2.
— Le stream 5 dépend du stream 2.
— Le stream 4 a deux fois plus de poids que le stream 1, qui a lui-même deux
fois plus de poids que le stream 3.
— Le poids de 12 du stream 5 n’a aucun effet, car il s’agit du seul stream
dépendant du stream 4.
16
CHAPITRE 2. ANALYSE 2.4. TYPES DE FRAMES
Stream 2
4 2 8
12
Stream 5
Figure 2.4 – Un exemple arbre de dépendances avec poids pour chaque stream.
Mécanisme facultatif
Notons que la priorisation des streams n’est qu’une demande du client au ser-
veur : Ceci ne force pas le serveur à adopter un tel comportement. Il ne s’agit que
d’une recommandation ; Le serveur peut très bien décider de ne pas écouter cette
recommandation et ignorer totalement la dépendance et les poids des streams.
17
2.4. TYPES DE FRAMES CHAPITRE 2. ANALYSE
2.4.1 DATA
La frame de type DATA va servir
La frame de type DATA, représentée à la figure 2.5 possède la valeur de Type
0x0 et utilise deux flags :
END_STREAM (bit 0) Lorsque activé, signifie que cette frame est la der-
nière frame de DATA du stream.
PADDED (bit 3) Lorsque activé, signifie que cette frame peut contenir du
padding, et indique la présence du champ Pad Length.
0 7 8 15 16 23 24 31
Pad Length
Data
❤❤❤
❤
❤❤❤ ❤❤❤❤❤❤
❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤
❤❤❤❤ ❤
❤❤
Padding
❤❤❤❤
❤❤❤ ❤❤❤❤❤❤
❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤
❤❤❤❤ ❤
❤❤
Padding Octets de remplissage. Doivent être tous 0. Ne peut être présent que
si Pad length est présent et supérieur à 0.
18
CHAPITRE 2. ANALYSE 2.4. TYPES DE FRAMES
2.4.2 HEADERS
La frame de type HEADERS, représentée à la figure 2.6 possède la valeur de
Type 0x1 et utilise quatre flags :
END_STREAM (bit 0) Lorsque activé, signifie que ce header block est le
dernier qui va être envoyé pour ce stream.
END_HEADERS (bit 2) Lorsque activé, signifie que cette frame contient
un header block complet, et ne va pas être suivie par des frames CONTI-
NUATION.
PADDED (bit 3) Lorsque activé, signifie que cette frame peut contenir du
padding, et indique la présence du champ Pad Length.
PRIORITY (bit 5) Lorsque activé, signifie que cette frame contient les champs
E, Stream Dep. et Weight.
0 7 8 15 16 23 24 31
Padding
❤❤❤❤
❤❤❤❤❤❤❤❤❤❤
❤
❤❤❤ ❤
❤❤❤❤❤❤❤❤❤❤
❤❤❤ ❤
❤❤❤❤❤❤❤❤❤❤
❤❤ ❤ ❤
❤❤❤❤❤❤❤❤❤
❤❤❤❤❤
❤
19
2.4. TYPES DE FRAMES CHAPITRE 2. ANALYSE
Padding Octets de remplissage. Doivent être tous 0. Ne peut être présent que
si Pad length est présent et supérieur à 0.
20
CHAPITRE 2. ANALYSE 2.4. TYPES DE FRAMES
2.4.3 PRIORITY
La frame de type PRIORITY possède la valeur de Type 0x2, et n’utilise aucun
flag.
Cette frame contient 3 champs différents :
2.4.4 RST_STREAM
La frame de type RST_STREAM possède la valeur de Type 0x3, et n’utilise
aucun flag.
Elle ne contient qu’un seul champ :
2.4.5 SETTINGS
La frame de type SETTINGS possède la valeur de Type 0x4, et utilise un flag :
ACK (bit 0) Lorsque activé, signifie que l’envoyeur acquitte la réception et
l’application des règles d’une précédente frame SETTINGS reçue. Lorsque
activé, cette frame doit avoir un contenu vide.
Elle contient une succession de deux champs :
21
2.4. TYPES DE FRAMES CHAPITRE 2. ANALYSE
2.4.6 PUSH_PROMISE
La frame de type PUSH_PROMISE, représentée à la figure 2.7 possède la
valeur de Type 0x5 et utilise deux flags :
END_HEADERS (bit 2) Lorsque activé, signifie que cette frame contient
un header block complet, et ne va pas être suivie par des frames CONTI-
NUATION.
PADDED (bit 3) Lorsque activé, signifie que cette frame peut contenir du
padding, et indique la présence du champ Pad Length.
0 7 8 15 16 23 24 31
Padding
❤❤❤❤
❤❤❤❤❤❤❤❤❤❤
❤
❤❤❤❤ ❤❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤❤❤
❤❤❤❤ ❤
❤❤❤ ❤❤❤❤
❤❤❤❤❤
❤
R Bit réservé.
22
CHAPITRE 2. ANALYSE 2.4. TYPES DE FRAMES
Padding Octets de remplissage. Doivent être tous 0. Ne peut être présent que
si Pad length est présent et supérieur à 0.
23
2.4. TYPES DE FRAMES CHAPITRE 2. ANALYSE
2.4.7 PING
La frame de type PING possède la valeur de Type 0x6, et utilise un flag :
ACK (bit 0) Lorsque activé, signifie que l’envoyeur acquitte la réception d’une
première frame PING ayant un flag ACK désactivé.
Elle ne contient qu’un seul champ :
2.4.8 GOAWAY
La frame de type GOAWAY possède la valeur de Type 0x7, et n’utilise aucun
flag.
Elle contient 4 champs :
R Bit réservé.
2.4.9 WINDOW_UPDATE
La frame de type WINDOW_UPDATE possède la valeur de Type 0x8, et
n’utilise aucun flag.
Elle contient 2 champs :
R Bit réservé.
24
CHAPITRE 2. ANALYSE 2.5. HPACK : COMPRESSION DES HEADERS
2.4.10 CONTINUATION
La frame de type CONTINUATION possède la valeur de Type 0x9, et utilise
1 flag :
END_HEADERS (bit 2) Lorsque activé, signifie que cette frame termine
un header block, et ne va donc pas être suivie par d’autres frames CONTI-
NUATION.
0 7 8 15 16 23 24 31
25
2.5. HPACK : COMPRESSION DES HEADERS CHAPITRE 2. ANALYSE
Nom Valeur
connection keep-alive
Header Field{ :path /index.html
:method GET Header List
referer http ://www.heia-fr.ch
... ...
Figure 2.9 – Un Header List est composé de plusieurs Header Fields, eux-même
composés d’un nom et d’une valeur.
Header List
↓ Encodage
Header Block
↓ Décodage
Header List
Dans leur ordre d’apparition, chaque Header Field est transformé en son Header
Field Representation. La suite de tous ces Header Fields Representation, assemblés
bout-à-bout, se nomme un Header Block. Il s’agit de l’information effective qui va
être transférée sur le réseau.
2.5.3 Représentation
Le but est donc d’utiliser un encodage rendant un Header Field Representa-
tion plus courts que leur Header Field correspondant. Le principe de l’encodage est
simple : Utiliser un tableau mettant en correspondance des Header Fields utilisés
très fréquamment avec un index. Le Header Field Representation sera tout simple-
ment l’index lui-même. Ce tableau se nomme l’Index Address Space, et est séparé
en deux parties distinctes : La Static Table, et la Dynamic Table. La figure 2.11
illustre cette structure.
26
CHAPITRE 2. ANALYSE 2.5. HPACK : COMPRESSION DES HEADERS
0 Contenu pré-défini
Static Table
61
62 Contenu dynamique
Dynamic Table
62+k
27
2.6. PUSH CHAPITRE 2. ANALYSE
littéralement. Afin de gagner un peu de place, les caractères sont encodés grâce à
code de Huffman : Il s’agit de remplacer chaque caractère par une valeur, pouvant
être représentée par un nombre variable de bits.
Cette correspondance est également pré-définie et immuable. Ceci permet d’en-
coder les caractères très courants sur un nombre faible de bits, afin d’occuper le
moins de place possible en moyenne par caractère. La figure 2.13 montre la repré-
sentation binaire de quelques caractères.
On remarque que la représentation de caractères très courants comme les lettres
’a’ et ’e’ ne prennent que 5 bits, tantis que la représentation de caractères plus
rares comme ’<’ utilise 15 bits. Pour toute la table comprenant 255 caractères
différents, chaque caractère nécessite entre 5 et 30 bits.
2.6 PUSH
Avec HTTP 1.1, il était nécessaire que le client demande au serveur chacune des
ressources dont il a besoin. Bien que ce concept ne soit pas mauvais, un problème
de performances se pose avec la manière dont la plupart des sites web de nos jours
son construits.
En effet, le client va généralement devoir demander un seul fichier en premier
(par exemple un fichier index.html), attendre que le fichier arrive, l’analyser,
se rendre compte que d’autres fichiers sont nécessaires, puis seulement envoyer
d’autres demandes vers le ou les serveurs.
Ce processus va typiquement demander au moins deux aller-retour complets
sur le réseau : Les requêtes des fichiers référencés par la page ne peuvent partir
qu’après la réception du fichier initial.
Il est possible de faire mieux. HTTP/2 propose un mécanisme facultatif où le
serveur peut délibérément envoyer des fichiers en plus au client, avant même que
28
CHAPITRE 2. ANALYSE 2.6. PUSH
celui-ci décide de les demander. Le but pour le serveur va donc être d’envoyer aussi
tôt que possible les fichiers référencés par la page web demandée par le client. Ce
processus a été appelé PUSH.
index.html index.html
style.css
GET style.css
(b) HTTP/2 avec PUSH
style.css
Pour des raisons de sécurité évidentes, les fichiers que le serveur PUSH ne sont
pas directement traités par le client. Ces fichiers sont mis temporairement dans
le cache HTTP du client. Ainsi, lorsque le client va demander un fichier, il est
possible que ce fichier soit déjà disponible dans son cache.
La figure 2.14 montre la différence entre HTTP 1.1 (figure 2.14a) et HTTP/2
avec PUSH (figure 2.14b) au niveau du temps nécessaire pour charger l’entièreté
des ressources d’une page web simple.
On s’aperçoit que PUSH permet d’économiser du temps car il est possible
d’envoyer directement les ressources nécessaires.
Notons que cette fonctionnalité est facultative, et qu’un certain paramétrage est
à mettre en place par le développeur du site web. HTTP/2 ne peut pas "deviner"
29
2.7. UTILISATION DU PROTOCOLE CHAPITRE 2. ANALYSE
30
Chapitre 3
Conception
3.1 Introduction
3.1.1 Idée
Après avoir pris connaissance du fonctionnement de HTTP/2, il est maintenant
temps d’y toucher concrètement. Nous allons mettre en place un environnement
permettant l’utiliser afin de regarder les effets du protocole en action. Ceci va se
faire à travers le développement d’un outil démonstratif, qui va permettre de se
rendre compte à la fois de la mise en place et de l’installation de l’environnement
nécessaire au protocole, et de s’intéresser aux résultats que celui-ci apporte.
L’idée de l’outil est la suivante : Un serveur va télécharger une page web exis-
tante, puis la servir alternativement à un client en HTTP 1.1, en HTTP/2, et en
HTTP/2 avec PUSH. Le client pourra ensuite tester et comparer les différences de
performances entre les 3 méthodes.
3.2 Architecture
L’architecture de l’outil se compose donc d’une machine Client, et d’une ma-
chine Serveur.
31
3.3. PRINCIPE CHAPITRE 3. CONCEPTION
3.2.1 Client
La machine Client est celle qui va contrôler l’exécution de l’outil. Le Client a
deux rôles principaux :
— Définir quelle page d’accueil va être testée
— Effectuer l’accès aux pages téléchargées, et mesurer le temps nécessaire a
leur chargement.
Ces opérations pourront être effectuées à l’aide d’un navigateur web compatible
HTTP/2. L’utilisateur sera donc libre d’utiliser l’outil sur la page d’accueil qu’il
désire, ainsi que de lancer des mesures de performance sur celle-ci.
3.2.2 Serveur
La machine Serveur est celle qui va s’occuper du chargement et de la configu-
ration des trois serveurs différents, en plus de servir à la machine Client les pages
web permettant de contrôler l’outil. Le Serveur a donc deux rôles principaux :
— Télécharger les pages web demandées par le Client
— Servir de 3 manières les pages web téléchargées
3.3 Principe
L’outil va donc devoir procéder en plusieurs étapes afin d’arriver au but final,
qui est de servir au client une page web par différentes méthodes.
La figure 1.1 montre le schéma du processus de téléchargement d’une page web,
ainsi que sa copie vers les 3 serveurs HTTP d’une machine de l’école.
32
CHAPITRE 3. CONCEPTION 3.3. PRINCIPE
Figure 3.1 – Téléchargement initial de la page d’un site d’exemple, et copie dans
les 3 serveurs
33
3.4. CONCLUSION CHAPITRE 3. CONCEPTION
tic.heia-fr.ch
1 2
index.html image.png script.js
3.4 Conclusion
La motivation de l’outil est simple : Nous voulons pouvoir comparer les perfor-
mances de HTTP/2 par rapport aux performances de HTTP 1.1. Afin d’atteindre
ce but, nous avons choisi un concept poussant l’utilisateur de s’investir dans le
34
CHAPITRE 3. CONCEPTION 3.4. CONCLUSION
processus en lui permettant de tester le site web de son choix, afin de se rendre
compte des résultats sur un cas qui lui est parlant.
En ce qui concerne l’outil lui-même, l’implémentation va donc reposer sur une
architecture Client - Serveur classique.
35
Chapitre 4
Réalisation
4.1 Introduction
Le code de l’outil étant réparti entre un Client et un Serveur, plusieurs techno-
logies et langages différents vont intervenir. Ce chapitre va mettre en lumière les
aspects techniques du développement des deux côtés de l’outil.
4.2 Client
4.2.1 Choix du client
Le choix du client HTTP/2 détermine à la fois le degré confort de l’utilisateur
quand à l’utilisation de l’outil, et les possibilités d’automatisation des tests avec
JavaScript.
Plusieurs clients compatibles HTTP/2 existent déjà, il est donc nécessaire de
faire un choix et de s’y tenir afin d’avoir des résultats constants pour le reste du
développement.
La page https://github.com/http2/http2-spec/wiki/Implementations
liste certaines des implémentations connues de clients HTTP/2. Parmi cette liste,
plusieurs clients ont été envisagés, au vu de leurs fonctionnalités et de leur simpli-
cité d’utilisation :
— nghttp2
— node-http2
— Chromium
Bien que nghttp2 et node-http2 auraient également été utilisables, le choix
s’est rapidement porté sur Chromium pour une simple raison qui le distingue
très clairement des autres : Il s’agit d’un projet lié à Google Chrome, qui est un
navigateur déjà très largement répandu. Il se trouve d’ailleurs que Google Chrome
36
CHAPITRE 4. RÉALISATION 4.3. SERVEUR
lui-même supporte déjà le protocole HTTP/2 (avec TLS) depuis la version 41[11].
De plus, celui-ci comporte une palette d’outils pour développeurs : Ceci peut être
utile pour observer et comprendre certains comportements.
Une fois le client choisi, installé et fonctionnel, le projet n’y impose pas d’autre
limites outre l’activation de l’exécution du JavaScript.
4.3 Serveur
Le serveur doit assumer la tâche du téléchargement de pages web, et de leur
service ensuite. En ce qui concerne la machine utilisée, il s’agit d’une machine
virtuelle linux interne à l’école.
Configuration du serveur
Le serveur va devoir non seulement répondre aux requêtes demandant les copies
des sites web téléchargés (en HTTP 1.1, HTTP/2 et HTTP/2+PUSH), mais il va
également devoir servir certaines autres pages. En effet, il faut que l’utilisateur
soit accueilli sur une première page pour qu’il puisse renseigner quel domaine il
souhaite tester. Il est donc non seulement nécessaire de servir des pages web dans
les 3 méthodes différentes mentionnées, mais il faut également servir certaines
autres pages propres à l’application.
Pour des raisons de simplicité de compréhension, nous allons donc créer 3 + 1
= 4 "Virtual Hosts" selon les termes de Apache. Chaque Virtual Host correspond
à un point d’entrée différent vers la machine serveur : Dans notre cas, chacun
d’entre eux sera accessible par un numéro de port différent. La figure 4.1 montre
un schéma de cette architecture.
37
4.3. SERVEUR CHAPITRE 4. RÉALISATION
index.html
Serveur HTTP/2
Apache
Pages téléchargées
Web Server :8082
example.com other.com
example.com other.com
Figure 4.1 – Chacun des 4 Virtual Host est accessibles par un port différent.
Les Virtual Hosts sont donc accessibles par les ports suivants :
:8081 Il s’agit de l’accès aux pages téléchargées, servies ici avec le protocole
HTTP 1.1.
:8082 Il s’agit de l’accès aux pages téléchargées, servies ici avec le protocole
HTTP/2, sans PUSH de ressources.
:8083 Il s’agit de l’accès aux pages téléchargées, servies ici avec le protocole
HTTP/2 ainsi qu’un PUSH de ressources configuré automatiquement.
38
CHAPITRE 4. RÉALISATION 4.3. SERVEUR
Bien qu’un accès non sécurisé aurait été possible, il a été décidé pour des
raisons de cohérence que toutes les communications allaient être sécurisées, et
sont donc accessibles par https uniquement. Attention toutefois : Le certificat SSL
utilisé pour ces connexions est auto-signé. Il est fort possible que l’utilisateur doive
autoriser manuellement la connexion à ces pages.
Une fois que l’utilisateur a entré le nom de domaine qu’il souhaite utiliser, il
est redirigé vers une page PHP, qui lance un script bash nommé downloadSite.
39
4.3. SERVEUR CHAPITRE 4. RÉALISATION
Un deuxième ajustement est nécessaire pour la suite : Il faut que cette page
transmette les performances de son temps chargement à l’outil. Cela se fait par
l’ajout d’un script JavaScript, lancé en fin de chargement de la page, qui va envoyer
ses informations qui seront récupérées plus tard.
Cependant, des aspects de sécurité implémentés dans les navigateurs restreignent
- à raison - considérablement les communications possibles entre plusieurs pages
web. Il a été nécessaire d’utiliser l’API pour navigateurs postMessage[14], permet-
tant à une page de communiquer des informations à une autre.
1 <script>window.addEventListener("load", function(){parent.postMessage(JSON.
stringify(window.performance.timing), "*");}, false);</script></html>
40
CHAPITRE 4. RÉALISATION 4.3. SERVEUR
Il est également important pour la suite d’indiquer que ces ressources ne peuvent
pas être stockées dans le cache du navigateur : On désire qu’elles soient entière-
ment chargées à chaque fois, afin de pouvoir faire des tests consécutifs dans les
mêmes conditions. Ceci est réalisé par l’ajout des lignes suivantes dans le fichier
de configuration global Apache de chacun des Virtual Host :
1 Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
2 Header set Pragma "no-cache"
41
4.3. SERVEUR CHAPITRE 4. RÉALISATION
La figure 4.4 montre une vue de cette page en cours d’utilisation : On peut y
voir que l’utilisateur a lancé le benchmark de la page google.ch. On remarque aussi,
dans le champ du haut, que le délai du serveur a été défini à 500 millisecondes.
42
CHAPITRE 4. RÉALISATION 4.3. SERVEUR
Répétition des tests Lors d’une phase de test, chaque page est chargée succes-
sivement en HTTP 1.1, HTTP/2 puis HTTP/2+PUSH depuis les Virtual Hosts
configurés auparavant. Une fois le chargement d’une page terminée, celle-ci trans-
met ses informations du temps de chargement nécessaire à la page principale, qui
va ensuite les afficher dans la colonne correspondante du tableau. Une fois la page
43
4.4. CONCLUSION CHAPITRE 4. RÉALISATION
complète, elle est déchargée afin de s’assurer qu’aucune exécution JavaScript sup-
plémentaire ne perturbe la suite des tests.
Au fur et à mesure des tests, les différentes statistiques s’accumulent, et la page
affiche pour chaque mesure :
— Le temps moyen
— Le temps le plus long
— Le temps le plus court
Les 6 premières lignes correspondent à des temps en millisecondes qui vont s’ajou-
ter les uns aux autres sur tout le chargement de la page, tandis que les 3 dernières
lignes correspondent au temps total avant l’arrivée de certains événements lors du
chargement de la page. Voici une explication des mesures reportées :
Redirect time Temps nécessaire à la redirection initiale vers la page correcte.
DNS time Temps nécessaire à la résolution DNS.
TCP time Temps nécessaire à l’établissement de la connexion TCP.
Request time Temps écoulé entre l’envoi de la requête et le début de la ré-
ponse.
Response time Temps nécessaire pour recevoir la totalité de la réponse
DOM Processing time Temps écoulé entre le début et la fin du chargement
du contenu de la page.
Ainsi que des temps totaux, qui sont mesurés depuis le lancement de la première
requête du navigateur :
Time to responseEnd Temps total jusqu’à la fin de la réception de la re-
quête initiale.
Time to domContentLoaded Temps total jusqu’à la fin du traitement du
contenu de la première requête.
Time to domComplete Temps total jusqu’à la fin du chargement complet
de la page.
Une fois les tests terminés, l’utilisateur a la possibilité d’en lancer à nouveau :
Le résultat de ceux-ci sera cumulé avec les tests déjà terminés.
4.4 Conclusion
La réalisation de cet outil a nécessité l’utilisation et l’interaction de plusieurs
technologies à différents niveaux. Plusieurs problèmes ont été rencontrés pendant
la phase d’implémentation, mais ont pu être résolus : Par exemple, le navigateur
ignorait totalement les ressources PUSHées tant que celles-ci n’avaient pas un
header comprenant le champ as valide. Ce genre de comportement est de manière
44
CHAPITRE 4. RÉALISATION 4.4. CONCLUSION
45
Chapitre 5
Validation
5.1 Introduction
Le but de ce chapitre est de montrer que l’outil opère de manière correcte, et
conforme à nos attentes. Nous allons effectuer des tests et comparer les résultats
attendus aux résultats espérés afin de valider le fonctionnement du code.
46
CHAPITRE 5. VALIDATION 5.2. TEST DU SERVEUR
Transferts de fichiers identiques Est-ce que les fichiers transférés sont les
mêmes, et y’a-t-il les mêmes erreurs sur la copie que sur le domaine officiel ?
Le test a été effectué sans prendre en compte l’exécution du JavaScript après
la fin du chargement de la page : En effet, le code JavaScript n’est pas prévu pour
être migré ainsi et il est donc normal et attendu que celui-ci n’agisse pas de la
même manière sur la copie du site.
heia-fr.ch La figure 5.2 montre que la page copiée n’a pas le même aspect que
la page sur le domaine initial.
La figure 5.3 montre comment s’affiche la page originale, et la figure 5.4 montre
comment s’affiche la page copiée. En effet, les caractères spéciaux sur la page
originale s’affichent correctement, alors que les caractères spéciaux sur la page
copiée sont remplacés par des caractères inconnus.
Après inspection, le problème vient de l’encodage de la page. Le site web ori-
ginal déclare de manière contradictoire l’encodage de la page. On trouve, dans le
header de la réponse de la page :
1 Content-Type:text/html;charset=ISO-8859-1
47
5.2. TEST DU SERVEUR CHAPITRE 5. VALIDATION
Cette contradiction ne pose pas de problème sur la page originale, car la dé-
finition du header a la priorité sur la définition de la balise. Cependant, lors du
téléchargement de la page, seul le contenu est enregistré. La page copiée déclare
donc son contenu comme étant encodé en utf-8, alors qu’elle devrait être décodée
en ISO-8859-1 comme le suggère le header de la page originale.
Bien que visuellement dérangeante, cette différence mineure ne change pas la
manière dont la page sera servie et évaluée par la suite. Une amélioration de
l’outil pourrait donc être de prendre en compte les headers reçus qui écrasent des
configurations déclarées dans le contenu de la page elle-même, et de répercutes ces
changements sur le contenu de la page elle-même.
github.com La figure 5.5 montre que tous les résultats observés sont identiques
aux résultats attendus. Nous pouvons donc valider l’exécution de l’outil sur ce site.
48
CHAPITRE 5. VALIDATION 5.2. TEST DU SERVEUR
Nous allons simplement charger cette page dans un onglet avec successivement
le numéro de port :8081, :8082 et :8083 pour observer le trafic réseau engen-
dré, disponible dans l’onglet "Network" dans les Outils de développeur de Chrome
Canary.
Figure 5.7 – Trafic réseau pour la page de test ’example2’ servie en HTTP 1.1
49
5.2. TEST DU SERVEUR CHAPITRE 5. VALIDATION
La figure 5.7 montre que la page est bien chargée avec le protocole HTTP 1.1,
et que l’accès à l’image se fait après la fin de l’accès à la page web. Il s’agit là bien
du résultat attendu.
Figure 5.8 – Trafic réseau pour la page de test ’example2’ servie en HTTP/2
La figure 5.8 montre que la page est bien chargée avec le protocole HTTP/2,
abrégé en h2 dans la colonne "Protocol ", et que l’accès à l’image se fait de manière
classique, après la fin de l’accès à la page web. Il s’agit là également du résultat
attendu. Nous pouvons remarquer au passage le gain de bande passante du pro-
tocole HTTP/2 par rapport à HTTP 1.1 : La taille du transfert de chacune des
ressources a diminué de 10% : La page d’accueil est passée de 1.2 KB à 997 B, et
l’image est passée de 3.3 KB à 3.0 KB. Ceci est l’effet d’optimisations telles que
la compression des headers, expliquée au chapitre consacré à HPACK.
Figure 5.9 – Trafic réseau pour la page de test ’example2’ servie en HTTP/2 avec
PUSH
La figure 5.9 montre que la page est bien chargée avec le protocole HTTP/2,
abrégé en h2 dans la colonne "Protocol ", et que l’accès à l’image est chargée par
un Push du serveur : Ceci est indiqué par la mention de "Push" dans la colonne
"Initiator ". Cela signifie que l’image a été PUSHée depuis le serveur, que le navi-
gateur l’a correctement reçue et interprétée. Il n’y a d’ailleurs pas d’autre requête
de tentative d’accès à cette image. Il s’agit ici également du résultat attendu.
50
CHAPITRE 5. VALIDATION 5.3. TEST DES BENCHMARKS
51
5.4. CONCLUSION CHAPITRE 5. VALIDATION
La figure 5.10 montre le résultat du benchmark pour les trois méthodes. Nous
pouvons y relever le "Request time", qui est proche à chaque fois de 500ms ; Il
s’agit du délai que nous avons ajouté au serveur.
Afin de valider ces résultats, il a été nécessaire de lancer trois tests différents
via l’interface de WebPageTest : Un pour chaque méthode.
Les figures 5.11, 5.12 et 5.13 montrent les résultats tirés de WebPageTest
concernant les temps de chargements.
Nous pouvons principalement comparer la dernière des deux colonnes "Time",
qui correspond à la mesure nommée "Time to domComplete" de notre outil.
Nous voyons que dans tous les exemples, les temps sont légèrement plus élevés
d’environ 200ms sur WebPageTest : Il s’agit du délai supplémentaire engendré par
le fait que l’accès se fait depuis Paris, au lieu d’y accéder depuis le sous-réseau
même. En dehors de ceci, les temps affichés sont très cohérents entre eux.
Nous pouvons donc dire que le benchmark fait correctement son travail, et nous
donne les temps que nous attendions.
5.4 Conclusion
Nous pouvons voir qu’après des tests concrets sur des différentes parties de
l’application, les résultats observés sont ceux attendus. Nous pouvons donc dire
52
CHAPITRE 5. VALIDATION 5.4. CONCLUSION
53
Chapitre 6
Résultats
6.1 Introduction
Maintenant que nous savons que l’outil nous donne des résultats corrects, il peut
être intéressant de l’exécuter sur plusieurs domaines différents afin de constater
les différences de performances entre les protocoles, et entre les pages web elles-
même. Ces informations peuvent par exemple nous donner des indications sur les
potentiels bénéfices à passer de HTTP 1.1 à HTTP/2.
6.2 Exécutions
6.2.1 Explications
L’outil a été lancé sur une série de sites web : Il s’agit pour certains des sites
web les plus populaires en Suisse, et certains autres ont été choisis arbitrairement,
de manière à avoir un échantillon représentatif d’une variété assez large de types
de pages web.
Pages d’exemple En plus de ceux-ci, deux sites d’exemple ont été mis en place,
afin de représenter deux cas différents de pages web : Le premier affiche un total
de 400 images et sert à mettre en lumière les bénéfices de HTTP/2 par rapport à
HTTP 1.1.
Le premier exemple, accessible à l’adresse https://fraudit.tic.heia-fr.
ch/compareSite.php?siteName=example est une composition de 400 images.
La figure 6.1 montre la page en chargement.
Le deuxième exemple est un site très simple, n’affichant qu’une seule image :
Il s’agit de la même page qu’utilisée au chapitre 5.2.2
54
CHAPITRE 6. RÉSULTATS 6.2. EXÉCUTIONS
55
6.2. EXÉCUTIONS CHAPITRE 6. RÉSULTATS
ms
0 5000 10000 15000 20000 25000 30000
google.ch
facebook.com
youtube.com
wikipedia.org
amazon.com
20min.ch
heia-fr.ch
reddit.com
cff.ch
http2.github.io
Site d'exemple 1
Site d'exemple 2
56
CHAPITRE 6. RÉSULTATS 6.2. EXÉCUTIONS
6.2.2 Observations
Nous pouvons relever plusieurs faits intéressants dans ces statistiques.
HTTP 1.1 : Connexions TCP limitantes Tout d’abord sur la figure 6.2 no-
tons la variance élevée des performances des différents sites web dans les conditions
testées. Nous pouvons voir que, bien que toues les sites web aient un temps de char-
gement supérieur lorsque la latence est de 500ms, le site d’exemple 1 pousse cette
différence à l’extrême lorsqu’il est chargé en HTTP 1.1. Ceci s’explique par le fait
que, pour charger 400 images du même domaine en HTTP 1.1, seules 6 connexions
TCP sont disponibles : Le navigateur doit donc charger les images successivement
6 par 6. Contrairement au HTTP/2, où il est possible de démarrer le chargement
des 400 images en même temps.
57
6.2. EXÉCUTIONS CHAPITRE 6. RÉSULTATS
9 000
8 000
7 000
6 000
5 000
ms
4 000
3 000
2 000
1 000
0
HTTP 1.1 HTTP/2 HTTP/2+PUSH HTTP 1.1 HTTP/2 HTTP/2+PUSH
Latence : 0ms Latence : 500ms
La tendance ici est même inverse : On remarque d’après la figure 6.3 que le PUSH
a tendance a dégrader les performances atteintes par HTTP/2 : Seuls 4 sites sur
les 12 ont profité bénéfiquement de ce changement. Le temps de chargement né-
cessaire moyen augmente en effet d’environ 17% dans des conditions de latence
faibles, et d’environ 12% avec une latence de 500ms.
58
CHAPITRE 6. RÉSULTATS 6.3. CONCLUSION
100.00%
50.00%
0.00%
google.ch
facebook.com
youtube.com
wikipedia.org
amazon.com
20min.ch
heia-fr.ch
reddit.com
cff.ch
http2.github.io
Site d'exemple 1
Site d'exemple 2
-50.00%
-100.00%
6.3 Conclusion
Ces mesures de différents sites et différentes situations montrent des résultats
très convaincants pour HTTP/2 d’une manière générale. Celui-ci a en effet mon-
tré une amélioration sans conditions du temps de chargement. Il s’agit ici d’un
argument de force pour le passage à HTTP/2 : Il suffit de passer sur ce nouveau
protocole, sans configuration particulière pour déjà bénéficier d’avantages consé-
quents.
En revanche, l’utilisation de PUSH doit être faite avec parcimonie. Nous avons
vu que les performances de cet ajout sont très variables, et peuvent même souvent
s’en trouver dégradées si cela est fait avec peu de considération. Cependant, nous
avons également remarqué que lorsqu’il est configuré manuellement, ce concept
peut apporter des résultats bénéfiques supplémentaires conséquents. Notons tout
de même que l’algorithme de configuration automatique du PUSH utilisé ici est
très grossier et grandement améliorable : Les performances moyennes de la confi-
guration automatique sont clairement améliorables.
59
Chapitre 7
Conclusion
60
CHAPITRE 7. CONCLUSION 7.2. CONCLUSION PERSONNELLE
7.1.3 Perspectives
HTTP/2 est une technologie récente, et en plein essor. Nous pouvons constater
ici ces bénéfices grâce à un outil automatisant le processus de test. L’outil est
cependant améliorable dans plusieurs directions distinctes :
Plus de personnalisation de l’état simulé du réseau Ajouter de la va-
riance à la latence, des pertes de paquets etc...
Automatisation du changement des paramètres réseau Tester program-
matiquement plusieurs conditions réseau
Amélioration du PUSH automatique La configuration automatique du PUSH
est très brute et ne prend pas en compte beaucoup de paramètres.
Compatibilité avec des pages spécifiques L’outil ne peut actuellement trai-
ter qu’une page d’accueil d’un site web. Il pourrait être intéresser de pouvoir
spécifier d’analyser une autre page du domaine que celle-ci.
Compatibilité avec d’autres navigateurs L’outil n’est actuellement tota-
lement compatible et testé qu’avec Google Chrome.
Génération de graphes Les statistiques sont affichées sur la page de bench-
mark de manière brute. Des graphiques automatiquement générés pour-
raient augmenter l’attrait de la page.
61
Bibliographie
62
BIBLIOGRAPHIE BIBLIOGRAPHIE
63
Glossaire
Dynamic Table est une table qui associe des Header Fields rencontrés fré-
quamment avec un index. Cette table est dynamique et spécifique à un
contexte d’encodage ou de décodage.. 7, 26, 27, 64
Index Address Space est la table constituée de l’ajout d’une Dynamic Table
à la glsStatic Table. 7, 26, 27
64
Glossaire Glossaire
Virtual Host se traduit en "Hôte Virtuel". Il s’agit, dans Apache, d’une re-
présentation d’un serveur virtuel.. 7, 37, 38, 40, 41, 43
65
Remerciements
66
Déclaration d’honneur
Je, soussigné, Kewin Dousse, déclare sur l’honneur que le travail rendu est le
fruit d’un travail personnel. Je certifie ne pas avoir eu recours au plagiat ou à
toutes autres formes de fraudes. Toutes les sources d’information utilisées et les
citations d’auteur ont été clairement mentionnées.
67
Annexe A
68
Annexe B
B.1 Activités
Le développement du projet peut se découper en quatre phases, qui elles-mêmes
se divisent en plusieurs activités. Voici la liste de ces activités :
1. Analyse du nouveau protocole
(a) Listing des concepts introduits
(b) Etude de chacun des nouveaux concepts
(c) Rédaction de la documentation
2. Analyse des alternatives
(a) Listing des alternatives
(b) Pour chacune :
i. Etude du fonctionnement
ii. Différences notables avec HTTP/2
iii. Possibilité d’utilisation avec HTTP/2
3. Mise en place d’un environnement HTTP/2
(a) Serveur
i. Listing et comparaison des implémentations existantes
ii. Choix et installation d’une implémentation
iii. Etude des changements nécessaires par rapport à HTTP 1.1
(b) Client
i. Listing et comparaison des implémentations existantes
ii. Choix et installation d’une implémentation
4. Conception et réalisation d’un outil de mesure
69
B.2. PLANIFICATION ANNEXE B. CAHIER DES CHARGES
B.2 Planification
Le projet comporte une série de dates-clé qu’il est important de respecter :
Les dates en rouge sont des dates de rendu officielles. Les autres représentent
des jalons dans l’avancement du projet.
70
ANNEXE B. CAHIER DES CHARGES B.3. DIAGRAMME DE GANTT
71
Annexe C
Documentation
C.1 Localisation
L’ensemble des documents du projet est disponible à l’adresse suivante :
https://redmine.forge.hefr.ch/projects/http2
Le code à son état du 15.07.2016 se trouve sur le dépôt git à l’adresse suivante :
https://gitlab.forge.hefr.ch/kewin.dousse/http2-demo
Le code, maintenu à jour, se trouve sur le dépôt git à l’adresse suivante :
https://github.com/Protectator/http2-demo
C.2 Contenu
C.2.1 Forge
Le projet présent sur la forge contient toutes les versions de chacun des
documents suivants, sous l’onglet « Documents » :
— Cahier des charges
— Rapport Final
— Les 11 procès-verbaux réalisés durant le projet, du 1 juin au 13 juillet 2016.
C.2.2 DVD
Le DVD contient l’arborescence de fichiers suivants :
— Sources/ : Contient l’ensemble du code source du projet, accompagné d’un
README pour l’installation
— PVs/ : Contient l’ensemble des PVs liés au projet
— Rapport_HTTP2_Dousse_Kewin.pdf : Document du rapport
— README.txt : Description du contenu du DVD
72
Annexe D
Code source
D.1 README.md
README.md
1 # http2-demo
2
3 Compare the differences of performance to serve a same page of your choice
using :
4
5 * HTTP 1.1
6 * HTTP/2
7 * HTTP/2 with PUSHed resources
8
9 # Requirements
10
11 You’ll need :
12
13 * An Unix environment
14 * [Apache](https://httpd.apache.org/) + PHP5
15
16 # Installing
17
18 ### Disclaimer
19
20 Before you install this, please read this :
21
22 This is an **experimental** application and it is **not safe** to use in a
production environment. Do not run it on a publicly available server.
23
24 ### App structure
25
26 * Clone/Extract/Copy all the content to a directory. Let’s say you use ‘/srv/
http2-demo/‘ for the rest of the explanations.
27 ‘‘‘bash
28 mkdir -p /srv/http2-demo/
29 cd /srv/http2-demo/
30 ‘‘‘
73
D.1. README.MD ANNEXE D. CODE SOURCE
31
32 * In it, create 3 directories named ‘1‘, ‘2‘, and ‘2push‘.
33 ‘‘‘bash
34 mkdir 1
35 mkdir 2
36 mkdir 2push
37 ‘‘‘
38
39 * Give write permissions to the group ‘www-data‘ (or the one Apache is
running as) for folders ‘app‘, ‘1‘, ‘2‘ and ‘2push‘, and execute for
folder ‘app‘.
40 ‘‘‘bash
41 sudo chgrp -R www-data app 1 2 2push
42 sudo chmod -R u+xwr *
43 sudo chmod -R g+wr app 1 2 2push
44 sudo chmod -R g+x app
45 ‘‘‘
46
47 ### Apache Configuration
48
49 Configure 4 virtual hosts on Apache :
50
51 * The first will be for the main application. Its root is the folder ‘app‘ of
the project, in this case ‘/srv/http2-demo/app/‘.
52
53 ‘‘‘
54 <VirtualHost *:443>
55 DocumentRoot /srv/http2-demo/app/
56
57 <Directory "/srv/http2-demo/app/">
58 Require all granted
59 Options +Indexes
60 </Directory>
61
62 SSLEngine On
63 SSLCertificateFile /etc/ssl/certs/your-cert.pem # Change path to your
cert file
64 SSLCertificateKeyFile /etc/ssl/private/your-cert.key # Change path to your
cert file
65 </VirtualHost>
66 ‘‘‘
67
68 * The three others will serve the downloaded pages in HTTP 1.1, HTTP/2 and
HTTP/2+PUSH. Here, We’ll use ports respectively 8081, 8082 and 8083.
69
70 Folder ‘/srv/http2-demo/1‘ will contain pages served over HTTP 1.1 on port
‘:8081‘
71
72 ‘‘‘
73 <VirtualHost *:8081>
74 DocumentRoot /srv/http2-demo/1/
75
76 <Directory "/srv/http2-demo/1/">
77 Require all granted
78 Options +Indexes
79 AddDefaultCharset ISO-8859-1
74
ANNEXE D. CODE SOURCE D.1. README.MD
75
D.2. COPYEXAMPLE ANNEXE D. CODE SOURCE
D.2 copyExample
copyExample
1 #!/bin/bash
2
3 mkdir -p "./1/example"
4 mkdir -p "./2/example"
5 mkdir -p "./2push/example"
6 mkdir -p "./1/example2"
7 mkdir -p "./2/example2"
8 mkdir -p "./2push/example2"
9 cp ./example/* ./1/example/
10 cp ./example/* ./2/example/
11 cp ./example/* ./2push/example/
12 cp ./example2/* ./1/example2/
13 cp ./example2/* ./2/example2/
14 cp ./example2/* ./2push/example2/
15
16 cat > ./2push/example/.htaccess <<- EOM
17 <Files "index.html">
18 Header add Link ’</example/img-0-0.png>;rel=preload;as=image’
19 Header add Link ’</example/img-0-1.png>;rel=preload;as=image’
20 Header add Link ’</example/img-0-2.png>;rel=preload;as=image’
21 Header add Link ’</example/img-0-3.png>;rel=preload;as=image’
22 Header add Link ’</example/img-0-4.png>;rel=preload;as=image’
23 Header add Link ’</example/img-0-5.png>;rel=preload;as=image’
24 Header add Link ’</example/img-0-6.png>;rel=preload;as=image’
76
ANNEXE D. CODE SOURCE D.3. DOWNLOADSITE
D.3 downloadSite
downloadSite
1 #!/bin/bash
2
3 rm -rf "./1/$1"
4 rm -rf "./2/$1"
5 rm -rf "./2push/$1"
6 mkdir -p "./1/$1"
7 mkdir -p "./2/$1"
8 mkdir -p "./2push/$1"
9
10 wget --no-clobber --page-requisites --adjust-extension --convert-links --
restrict-file-names=nocontrol --remote-encoding --no-parent --span-hosts
--no-directories --directory-prefix=./1/$1/ $1
11
12 # Generic headers
13 echo ’Header always set Access-Control-Allow-Origin "*"’ >> "./1/$1/.htaccess
"
77
D.3. DOWNLOADSITE ANNEXE D. CODE SOURCE
78
ANNEXE D. CODE SOURCE D.4. CLEARSITE
62 echo "’";
63 done >> "./2push/$1/.htaccess"
64 echo ’</Files>’ >> "./2push/$1/.htaccess"
D.4 clearSite
clearSite
1 #!/bin/bash
2
3 rm -r 1/*
4 rm -r 2/*
5 rm -r 2push/*
6 ./copyExample
D.5 setDelay
setDelay
1 #!/bin/bash
2
3 # Check if root user
4 if [[ ‘id -u‘ -ne 0 ]] ; then echo "This script must be run as root" ; exit 1
; fi
5
6 # Delete past root class
7 tc qdisc del dev eth0 root
8
9 # Create the default root class
10 tc qdisc add dev eth0 handle 1: root htb
11
12 # Create children classes
13 tc class add dev eth0 parent 1: classid 1:11 htb rate 1000Mbps
14 tc class add dev eth0 parent 1: classid 1:12 htb rate 1000Mbps
15 tc class add dev eth0 parent 1: classid 1:13 htb rate 1000Mbps
16
17 # Apply rules on classes
18 tc qdisc add dev eth0 parent 1:11 handle 10: netem delay "$1ms"
19 tc qdisc add dev eth0 parent 1:12 handle 20: netem delay "$1ms"
20 tc qdisc add dev eth0 parent 1:13 handle 30: netem delay "$1ms"
21
22 # Apply filters
23 tc filter add dev eth0 protocol ip prio 1 u32 match ip sport 8081 0xffff
flowid 1:11
24 tc filter add dev eth0 protocol ip prio 1 u32 match ip sport 8082 0xffff
flowid 1:12
25 tc filter add dev eth0 protocol ip prio 1 u32 match ip sport 8083 0xffff
flowid 1:13
26
79
D.6. APP/.HTACCESS ANNEXE D. CODE SOURCE
D.6 app/.htaccess
app/.htaccess
1 <Files "downloadSite.php">
2 php_value output_buffering Off
3 php_flag "output_buffering" Off
4 </Files>
D.7 app/index.html
app/index.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/semantic.min.css"/>
5 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/components/popup.min.css"/>
6
7 <meta charset="utf-8"/>
8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0"/>
10
11 <title>http2-demo</title>
12 <style type="text/css">body{background-color:#FFFFFF;}.ui.menu .item img.
logo{margin-right:1.5em;}.main.container{margin-top:7em;}.wireframe{
margin-top:2em;}.ui.footer.segment{margin:5em 0em 0em;padding:5em 0em;}.
after-footer{background:#1b1c1d;}</style>
13 </head>
14 <body>
15 <div class="ui stackable inverted menu" id="topBar">
16 <div class="ui container">
17 <a href="/" class="header item">
18 http2-demo
19 </a>
20 <a href="/" class="item">Home</a>
21 </div>
22 </div>
23 <div class="ui main text container" style="margin-top: 1.5em;" id="
stickContext">
24 <div class="ui middle aligned center aligned grid">
25 <div class="column">
26 <h2 class="ui image">http2-demo</h2>
27 <h3 class="ui">Compare HTTP 1.1, HTTP/2 and HTTP/2 + PUSH</h3>
80
ANNEXE D. CODE SOURCE D.8. APP/DOWNLOADSITE.PHP
D.8 app/downloadSite.php
app/downloadSite.php
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/semantic.min.css"/>
5 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/components/popup.min.css"/>
6
7 <meta charset="utf-8"/>
8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0"/>
10
11 <title>http2-demo</title>
12 <style type="text/css">body{background-color:#FFFFFF;}.ui.menu .item img.
logo{margin-right:1.5em;}.main.container{margin-top:7em;}.wireframe{
margin-top:2em;}.ui.footer.segment{margin:5em 0em 0em;padding:5em 0em;}.
after-footer{background:#1b1c1d;}</style>
81
D.8. APP/DOWNLOADSITE.PHP ANNEXE D. CODE SOURCE
13 </head>
14 <body>
15 <div class="ui stackable inverted menu" id="topBar">
16 <div class="ui container">
17 <a href="/" class="header item">
18 http2-demo
19 </a>
20 <a href="/" class="item">Home</a>
21 </div>
22 </div>
23 <div class="ui main text container" style="margin-top: 1.5em;" id="
stickContext">
24 <div class="ui middle aligned center aligned grid">
25 <div class="column">
26 <h2 class="ui image">http2-demo</h2>
27 <h3 class="ui">Compare HTTP 1.1, HTTP/2 and HTTP/2 + PUSH</h3>
28 <div class="ui stacked segment left aligned" id="dlContent">
29 <p>Download of <?php echo htmlspecialchars($_GET[’url’]); ?>
in progress... You’ll be redirected once it has ended.</p>
30 <p>If you haven’t been redirected after a minute, click <a
href="https://fraudit.tic.heia-fr.ch/compareSite.php?siteName=<?php echo
htmlspecialchars($_GET[’url’]); ?>">here</a>.
31 <pre id="feedback">
32 </pre>
33 </div>
34 </div>
35 </div>
36 </div>
37 <div class="ui inverted vertical footer segment">
38 <div class="ui center aligned container">
39 <div class="ui horizontal inverted small divided link list">
40 <span class="item">http2-demo</span>
41 </div>
42 </div>
43 </div>
44 <div class="after-footer"></div>
45 <?php
46
47 ob_implicit_flush();
48
49 $shell_instruction = ’cd ..; /srv/http2-demo/downloadSite ’;
50 $shell_instruction .= escapeshellarg($_GET[’url’]);
51
52 while (@ ob_end_flush()); // end all output buffers if any
53 $proc = popen($shell_instruction, ’r’);
54 while (!feof($proc))
55 {
56 fread($proc, 4096);
57 @ flush();
58 }
59 $status = pclose($proc);
60 if ($status == 0) {
61 $script = "<script type=’text/javascript’> window.location.replace(’https
://fraudit.tic.heia-fr.ch/compareSite.php?siteName=".htmlspecialchars(
$_GET[’url’]). "’);</script>";
62 echo $script;
82
ANNEXE D. CODE SOURCE D.9. APP/COMPARESITE.PHP
63 } else {
64 echo "<script>feedback.innerHTML = ’Download failed : ";
65 echo $status;
66 echo "’;</script>";
67 }
68 ?>
69 </body>
70 </html>
D.9 app/compareSite.php
app/compareSite.php
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/semantic.min.css"/>
5 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/components/popup.min.css"/>
6
7 <meta charset="utf-8"/>
8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0"/>
10
11 <title>http2-demo</title>
12 <style type="text/css">body{background-color:#FFFFFF;}.ui.menu .item img.
logo{margin-right:1.5em;}.main.container{margin-top:7em;}.wireframe{
margin-top:2em;}.ui.footer.segment{margin:5em 0em 0em;padding:5em 0em;}.
after-footer{background:#1b1c1d;}</style>
13 </head>
14 <body>
15 <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-
BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></
script>
16 <div class="ui stackable inverted menu" id="topBar" style="margin-top: 0px;">
17 <div class="ui container">
18 <a href="/" class="header item">
19 http2-demo
20 </a>
21 <a href="/" class="item">Home</a>
22 </div>
23 </div>
24 <div class="ui main text" style="margin-top: 1.5em;" id="stickContext">
25 <div class="ui middle aligned center aligned grid container">
26 <div class="column">
27 <h2 class="ui image">http2-demo</h2>
28 <h3 class="ui">Compare HTTP 1.1, HTTP/2 and HTTP/2 + PUSH</h3>
29 <div class="ui stacked segment">
30 <h4 class="ui">Site <?php echo htmlspecialchars($_GET[’
siteName’]); ?></h4>
31 <div class="ui form">
83
D.9. APP/COMPARESITE.PHP ANNEXE D. CODE SOURCE
84
ANNEXE D. CODE SOURCE D.9. APP/COMPARESITE.PHP
85
D.9. APP/COMPARESITE.PHP ANNEXE D. CODE SOURCE
116 <script>
117 var origins = ["https://fraudit.tic.heia-fr.ch:8081",
118 "https://fraudit.tic.heia-fr.ch:8082",
119 "https://fraudit.tic.heia-fr.ch:8083"];
120
121 total = [];
122 total[’avg’] = [];
123 total[’avg’][0] = [];
124 total[’avg’][1] = [];
125 total[’avg’][2] = [];
126 total[’min’] = [];
127 total[’min’][0] = [];
128 total[’min’][1] = [];
129 total[’min’][2] = [];
130 total[’max’] = [];
131 total[’max’][0] = [];
132 total[’max’][1] = [];
133 total[’max’][2] = [];
134 total[’pass’] = 0;
135 total[’tests’] = 0;
136
137 function round1(float) {
138 return Math.round(float * 10) / 10;
139 }
140
141 window.addEventListener("message",
142 function (e) {
143 var timing = JSON.parse(e.data);
144 var stats = [<?php echo implode(", ", $values); ?>];
145 console.log("Message recieved ! : " + e.origin + " : " + e.data);
146 var i;
147 switch(e.origin) {
148 case origins[0]:
149 for (i = 0; i < stats.length; i++) {
150 if (total[’avg’][0][i]) {
151 total[’avg’][0][i] += stats[i];
152 } else {
153 total[’avg’][0][i] = stats[i];
154 }
155 if (total[’min’][0][i]) {
156 total[’min’][0][i] = Math.min(total[’min’][0][i],
stats[i]);
157 } else {
158 total[’min’][0][i] = stats[i];
159 }
160 if (total[’max’][0][i]) {
161 total[’max’][0][i] = Math.max(total[’max’][0][i],
stats[i]);
162 } else {
163 total[’max’][0][i] = stats[i];
164 }
165 var currentAvg = total[’avg’][0][i]/total[’pass’];
166 var currentMin = total[’min’][0][i];
167 var currentMax = total[’max’][0][i];
168 $(’#stat-h1-’ + i).html("<b>" + round1(currentAvg) +
"</b> | " + currentMin + " | " + currentMax);
86
ANNEXE D. CODE SOURCE D.9. APP/COMPARESITE.PHP
169 }
170 break;
171 case origins[1]:
172 for (i = 0; i < stats.length; i++) {
173 if (total[’avg’][1][i]) {
174 total[’avg’][1][i] += stats[i];
175 } else {
176 total[’avg’][1][i] = stats[i];
177 }
178 if (total[’min’][1][i]) {
179 total[’min’][1][i] = Math.min(total[’min’][1][i],
stats[i]);
180 } else {
181 total[’min’][1][i] = stats[i];
182 }
183 if (total[’max’][1][i]) {
184 total[’max’][1][i] = Math.max(total[’max’][1][i],
stats[i]);
185 } else {
186 total[’max’][1][i] = stats[i];
187 }
188 var currentAvg = total[’avg’][1][i]/total[’pass’];
189 var currentMin = total[’min’][1][i];
190 var currentMax = total[’max’][1][i];
191 $(’#stat-h2-’ + i).html("<b>" + round1(currentAvg) +
"</b> | " + currentMin + " | " + currentMax);
192 }
193 break;
194 case origins[2]:
195 for (i = 0; i < stats.length; i++) {
196 if (total[’avg’][2][i]) {
197 total[’avg’][2][i] += stats[i];
198 } else {
199 total[’avg’][2][i] = stats[i];
200 }
201 if (total[’min’][2][i]) {
202 total[’min’][2][i] = Math.min(total[’min’][2][i],
stats[i]);
203 } else {
204 total[’min’][2][i] = stats[i];
205 }
206 if (total[’max’][2][i]) {
207 total[’max’][2][i] = Math.max(total[’max’][2][i],
stats[i]);
208 } else {
209 total[’max’][2][i] = stats[i];
210 }
211 var currentAvg = total[’avg’][2][i]/total[’pass’];
212 var currentMin = total[’min’][2][i];
213 var currentMax = total[’max’][2][i];
214 $(’#stat-h2push-’ + i).html("<b>" + round1(currentAvg
) + "</b> | " + currentMin + " | " + currentMax);
215 }
216 break;
217 default:
218 console.log(e.origin + " : " + e.data);
87
D.9. APP/COMPARESITE.PHP ANNEXE D. CODE SOURCE
219 }
220 },
221 false);
222
223 $("#launchButton").click(function() {
224 $("#launchButton").prop(’disabled’, true);
225 $("#testInput").prop(’disabled’, true);
226 $("#launchButton").addClass(’loading disabled’);
227 $("#testInput").addClass(’disabled’);
228 $("#delay").prop(’disabled’, true).addClass(’disabled’);
229 $("#delayButton").prop(’disabled’, true).addClass(’disabled’);
230 total[’tests’] += parseInt($("#numberOfTests")[0].value);
231 launchBenchmark(500, parseInt($("#numberOfTests")[0].value));
232 });
233
234 $("#delayButton").click(function(){
235 var delayValue = $("#delay")[0].value;
236 $("#delay").prop(’disabled’, true).addClass(’disabled’);
237 $("#delayButton").prop(’disabled’, true).addClass(’disabled’);
238 $.get("/delay.php?delay=" + delayValue, function(data) {
239 if (data.substring(0, 5) == "ERROR") {
240 alert(data);
241 } else {
242 alert("Delay has been set to " + data + "ms.");
243 }
244 $("#delay").prop(’disabled’, false).removeClass(’disabled’);
245 $("#delayButton").prop(’disabled’, false).removeClass(’disabled’)
;
246 });
247 });
248
249 function launchBenchmark(delay, times) {
250 $(’#h1container’).html("");
251 $(’#h2container’).html("");
252 $(’#h2pushcontainer’).html("");
253 $(’<iframe>’, {
254 id: ’h1’,
255 style: ’width:100%; height:100%;’
256 }).appendTo(’#h1container’);
257 $(’<iframe>’, {
258 id: ’h2’,
259 style: ’width:100%; height:100%;’
260 }).appendTo(’#h2container’);
261 $(’<iframe>’, {
262 id: ’h2push’,
263 style: ’width:100%; height:100%;’
264 }).appendTo(’#h2pushcontainer’);
265 total[’pass’]++;
266 $("#runningTest").html("Test " + total[’pass’] + " / " + total[’tests
’]);
267 console.log("Starting test " + total[’pass’]);
268 console.log("Initializing iframes");
269 var h1 = $(’#h1’);
270 var h2 = $(’#h2’);
271 var h2push = $(’#h2push’);
88
ANNEXE D. CODE SOURCE D.10. APP/DELAY.PHP
D.10 app/delay.php
app/delay.php
1 <?php
2 chdir("..");
3 $amount = intval($_GET[’delay’]);
4 $cmd = "sudo ./setDelay ".$amount;
5 exec($cmd, $output, $returnVal);
6 if ($returnVal != 0) {
7 echo "ERROR : ".$returnVal;
8 var_dump($output);
89
D.11. EXAMPLE/.HTACCESS ANNEXE D. CODE SOURCE
9 } else {
10 echo $amount;
11 }
12 ?>
D.11 example/.htaccess
example/.htaccess
1 Header always set Access-Control-Allow-Origin "*"
2 Header always set Access-Control-Allow-Methods "GET, OPTIONS"
D.12 example/index.html
example/index.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/semantic.min.css"/>
5 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/components/popup.min.css"/>
6
7 <meta charset="utf-8"/>
8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0"/>
10
11 <title>Example website</title>
12 <style type="text/css">body{background-color:#FFFFFF;}.ui.menu .item img.
logo{margin-right:1.5em;}.main.container{margin-top:7em;}.wireframe{
margin-top:2em;}.ui.footer.segment{margin:5em 0em 0em;padding:5em 0em;}.
after-footer{background:#1b1c1d;}</style>
13 </head>
14 <body>
15 <div class="ui stackable inverted menu" id="topBar">
16 <div class="ui container">
17 <a href="/" class="header item">
18 http2-demo
19 </a>
20 <a href="/" class="item">Home</a>
21 </div>
22 </div>
23 <div class="ui main text container" style="margin-top: 1.5em;" id="
stickContext">
24 <div class="ui middle aligned center aligned grid">
25 <div class="column">
90
ANNEXE D. CODE SOURCE D.12. EXAMPLE/INDEX.HTML
91
D.13. EXAMPLE2/.HTACCESS ANNEXE D. CODE SOURCE
D.13 example2/.htaccess
example2/.htaccess
1 Header always set Access-Control-Allow-Origin "*"
2 Header always set Access-Control-Allow-Methods "GET, OPTIONS"
D.14 example2/index.html
example2/index.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/semantic.min.css"/>
5 <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/
semantic-ui/2.1.8/components/popup.min.css"/>
6
7 <meta charset="utf-8"/>
8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
9 <meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0"/>
10
11 <title>Example website</title>
12 <style type="text/css">body{background-color:#FFFFFF;}.ui.menu .item img.
logo{margin-right:1.5em;}.main.container{margin-top:7em;}.wireframe{
margin-top:2em;}.ui.footer.segment{margin:5em 0em 0em;padding:5em 0em;}.
after-footer{background:#1b1c1d;}</style>
13 </head>
14 <body>
15 <div class="ui stackable inverted menu" id="topBar">
16 <div class="ui container">
17 <a href="/" class="header item">
18 http2-demo
19 </a>
20 <a href="/" class="item">Home</a>
21 </div>
22 </div>
23 <div class="ui main text container" style="margin-top: 1.5em;" id="
stickContext">
24 <div class="ui middle aligned center aligned grid">
25 <div class="column">
26 <h3 class="ui">This page’s purpose is to better show the
differences in HTTP 1.1, HTTP/2 and HTTP/2 + PUSH. </h3>
27 <table style="border: 0px;">
28 <tr>
29 <td><img src="img-0-0.png"></td>
30 </tr>
31 </table>
32 </div>
33 </div>
92
ANNEXE D. CODE SOURCE D.14. EXAMPLE2/INDEX.HTML
34 </div>
35 <div class="ui inverted vertical footer segment">
36 <div class="ui center aligned container">
37 <div class="ui horizontal inverted small divided link list">
38 <span class="item">http2-demo</span>
39 </div>
40 </div>
41 </div>
42 <div class="after-footer"></div>
43 </body>
44 <script>window.addEventListener("load", function(){parent.postMessage(JSON.
stringify(window.performance.timing), "*");}, false);</script>
45 </html>
93
Annexe E
Résultats complets
94
Annexe F
Procès-verbaux
95
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
1 juin 2016, de 9h45 à 10h20, en C10.19
Rédaction du PV le 1 juin
Compte-rendu
Points de discussion
• Discussion préalable
Une première discussion informelle a eu lieu lundi entre M. Scheurer et M. Dousse, clarifiant premièrement
quelques détails administratifs liés au projet, ainsi que quelques suggestions de recherches pour la séance
d'aujourd'hui.
La première discussion s'est portée sur le contenu du cahier des charges. Étant donné que le projet va
principalement consister en l'exploration d'une nouvelle technologie, le cahier des charges sera établi sur la
base d'une analyse préliminaire, destinée à contextualiser HTTP/2 parmi les produits existants et futurs.
La structure générale du Cahier des charges a été proposée : Une ébauche du contenu de celui-ci sera
envoyé vendredi.
Parmi d'éventuelles alternatives à HTTP/2, la technologie QUIC a été discutée brièvement. Basée sur UDP
au lieu de TCP, QUIC utilise obligatoirement TLS, et également une partie de HTTP/2. Cette technologie
étant étroitement liée avec le développement de HTTP/2, elle sera prise en compte au moins dans l'analyse
préliminaire, nécessaire à l'élaboration du cahier des charges.
Kewin ayant déjà reçu l'identité de l'expert assigné, quelques précisions ont été apportées sur son rôle dans
le projet ainsi que l'utilité et la fréquence des rencontres avec celui-ci.
Conclusion
La rédaction du Cahier des charges est la tâche actuelle à compléter pour le projet, une version d'ébauche
sera envoyée vendredi. Une analyse préliminaire de certains concepts sont nécessaires à son élaboration.
1/1
96
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
8 juin 2016, de 9h45 à 10h20, en C10.19
Rédaction du PV le 8 juin
Compte-rendu
Points de discussion
• PV précédent
Après quelques corrections durant la semaine, le cahier des charges a été présenté et validé.
• Etat de l’analyse
L’analyse du protocole HTTP/2 est quasiment terminée. Les principes centraux du protocole ont été
présentés : HPACK, une seule connexion TCP par domaine, les streams, et le principe de PUSH. Reste
maintenant à mettre en forme ce contenu et à rédiger la partie d’Analyse dans le rapport. Quelques
paragraphes seront également consacrés à QUIC, et comparé à HTTP/2. Ceci sera fait pour la semaine
prochaine, mercredi.
• Forme du rapport
Lors de la dernière réunion, Kewin avait proposé de rédiger le rapport en anglais. Il s’est trouvé que l’effort
rédactionnel à fournir pour ce document était trop grand pour assumer ceci en anglais, et la décision a été
prise de rédiger l’entier du document en français.
• VM
Une discussion a eu lieu et l’environnement sera, à moins de rencontrer des problèmes, faite sur la VM
existante qui a servi au projet de semestre précédent, Framework Audit.
Conclusion
Le chapitre d’analyse sera complété pour la semaine prochaine. L’environnement HTTP/2 sera également
mis en place et prêt à être utilisé pour la suite des phases du projet.
1/1
97
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
15 juin 2016, de 9h45 à 10h30, en C10.19
Rédaction du PV le 15 juin
Compte-rendu
Points de discussion
• PV précédent
• Etat de l’analyse
L’avancement de l’analyse a pris un peu de retard. Il reste à expliquer le multiplexage et PUSH, ainsi que de
montrer les principes de QUIC. Ceci sera fait et envoyé jusqu’à samedi.
• Suite du projet
Après quelques explications, il se trouve que Kewin n’avait pas d’idée fixe de quelle direction allait prendre la
suite du projet. Bien que différentes idées d’outils aient été proposées, le cheminement n’était pas clair et
toutes n’étaient pas réalisables dans le temps du projet. Il a été clarifié que le but était de pouvoir produire
des mesures pertinentes sur HTTP/2 pour certaines utilisations, ainsi qu’un outil pouvant les automatiser.
Le problème était de savoir quel genre d’outil créer, et quelles statistiques nous allions pouvoir en tirer. Il a
été décidé que l’intérêt de l’outil allait être de mettre en lumière les différences de HTTP 1.1 et de HTTP/2 du
point de vue d’un développeur.
L’outil va comparer l’utilisation de HTTP 1.1 et de HTTP/2 sur un même site statique. Il va pouvoir permettre
de se rendre compte des gains de performances espérés via la mise en place de HTTP/2 à plusieurs
niveaux, ainsi que de montrer les changements de configuration nécessaires à ces résultats. Nous aurons
donc typiquement 3 cas différents à comparer : L’utilisation de HTTP 1.1 uniquement, de HTTP/2 sans
optimisations, et de HTTP/2 avec optimisations (telles que PUSH).
Conclusion
Une fois la phase d’analyse terminée, la deuxième partie du projet porte donc sur la réalisation d’un outil
permettant de mesurer et de comparer des performances et des configurations de HTTP/2. Cette démarche
va commencer dès lundi, avec la proposition finale du concept de l’outil.
1/1
98
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
20 juin 2016, de 13h30 à 14h05, en C10.19
Rédaction du PV le 21 juin
Compte-rendu
Points de discussion
• PV précédent
• Outil démonstratif
L’outil proposé était le suivant : Une interface web permet à un utilisateur d’entrer l’adresse d’un site web, qui
sera ensuite servi de 3 manières : HTTP 1.1, HTTP/2, et HTTP/2 avec PUSH. Une comparaison des
performances de chaque site sera ensuite affichée.
Après discussion, une idée est venue : Faire varier la latence entre les sites (avec un outil nommé vanem
par exemple), et observer le comportement de cette variable sur le temps de chargement total . La question
a également été posée : Faut-il charger les sites et récolter les résultats du chargement du côté client ou
serveur ? Une recherche est nécessaire pour déterminer la meilleure méthode.
Il est maintenant nécessaire de démarrer la mise en place de l’infrastructure de cet outil. Le processus
d’automatisation n’est pas la partie urgente, et sera probablement faite plus tard.
• Analyse
Dans le rapport, l’analyse actuelle semble suffisante. L’importance est maintenant sur la partie
Conception/Réalisation.
Conclusion
La mise en place de l’infrastructure de l’outil (les 3 manières de servir le site web) est à présent nécessaire
afin de commencer à réaliser des tests.
1/1
99
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
22 juin 2016, de 9h50 à 10h00, en C10.19
Rédaction du PV le 22 juin
Compte-rendu
Points de discussion
• PV précédent
• Outil démonstratif
La configuration des sites web servis en HTTP 1.1 et HTTP/2 est terminée. Il reste à configurer la partie
PUSH des sites web à servir en HTTP/2 avec PUSH.
Une recherche sera relancée sur l’outil wanem, que Kewin avait mal orthographié lors de la discussion
précédente.
WebPageTest est un outil en ligne analysant le chargement des sites Web. Il existe une API afin d’y accéder
de manière automatisée, limitée à 200 requêtes par jour. Une étude sera faite sur l’utilisabilité de cette
mesure.
Kewin rendra compte vendredi de l’avancement actuel de l’outil, et des prochaines étapes du projet.
Conclusion
L’architecture de l’outil est presque en place, tandis que la recherche de la faisabilité de l’automatisation du
processus d’analyse de site web est en cours.
1/1
100
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
24 juin 2016, de 10h00 à 10h50, en C10.15
Rédaction du PV le 24 juin
Compte-rendu
Points de discussion
• Présentation générale du protocole HTTP/2
Kewin a tout d’abord présenté de manière générale le protocole HTTP/2 ainsi que les différences principales
avec la version 1.1 du protocole : Les streams, le multiplexage, la compression des headers et le PUSH des
ressources.
• Présentation du projet
La réunion a ensuite continué sur une discussion sur le Cahier des Charges : Présentation du contexte du
projet, des objectifs de celui-ci, du planning défini et des activités. Nous sommes à la semaine 4, la moitié du
temps prévu pour le projet, et sommes dans les temps et en cohésion avec le planning.
La discussion s’est ensuite portée sur l’explication de l’outil qui va être réalisé : Télécharger un site web, et le
servir de manière statique de 3 manières différentes : HTTP 1.1, HTTP/2 et HTTP/2 avec PUSH.
• Prochaine réunion
La prochaine réunion avec l’expert a été définie : Elle se passera le lundi 4 juillet à 10h00.
1/1
101
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
29 juin 2016, de 9h45 à 10h15, en C10.19
Rédaction du PV le 29 juin
Compte-rendu
Points de discussion
• PV précédent
Le deuxième problème, actuellement non résolu, est le principe de PUSH des fichiers. Des tests sur une
page téléchargée assez simple, google.ch, montrent les problèmes suivants : Le serveur signale au client
que des images vont être PUSHées, celles-ci arrivent en effet jusqu’au client, mais le client les demande
ensuite une seconde fois. Ce problème va donc être investigué.
De plus, il semblerait que la configuration du PUSH doive être effectuée dans un fichier central, et qu’un
redémarrage du serveur soit nécessaire pour le changement de celui-ci. Ce qui laisse peu de flexibilité sur
l’automatisation de cette tâche. Une possibilité de configuration à la volée existe (avec des fichiers
.htaccess), mais elle interférerait avec la structure des fichiers téléchargés.
Conclusion
Il est nécessaire que ces problèmes soient investigué et résolus afin que la suite du développement de l’outil
continue. Kewin tiendra les superviseurs à jours avant la fin de la semaine de l’état de ces problèmes.
1/1
102
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
4 juillet 2016, de 10h00 à 10h20, en C10.19
Rédaction du PV le 4 juillet
Compte-rendu
Points de discussion
• Etat de l’implémentation
Kewin a présenté l’état actuel de l’implémentation : Une page web est mise en place et permet d’entrer un
nom de domaine à servir. Une fois validé, un script télécharge la page d’accueil de celui-ci et l’utilisateur est
redirigé vers une page sur laquelle il peut cliquer sur 3 liens, servant chacun la page d’une manière
différente : HTTP 1.1, HTTP/2 et HTTP/2 avec PUSH. L’implémentation d’une page procédant à un
benchmark automatique en JavaScript a été démarrée et est actuellement en cours de réalisation.
Après quelques réponses à des questions techniques de l’expert, le point est fait sur l’avancement du projet
dans le temps : L’avancement est en concordance avec le planning et touche à sa fin dans quelques jours.
Conclusion
L’avancement est en concordance avec le planning, et d’ici deux ou trois jours les benchmarks en JavaScript
et avec l’outil externe WebPageTest devraient être terminés.
1/1
103
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
6 juillet 2016, de 9h45 à 10h10, en C10.19
Rédaction du PV le 6 juillet
Compte-rendu
Points de discussion
• PV précédent
L’implémentation du benchmark a été faite ainsi : Une fois le site web choisi téléchargée, l’utilisateur est
redirigé vers une page qui va ouvrir la page consécutivement en HTTP 1.1, HTTP/2 puis HTTP/2 + PUSH,
chacun dans une frame. Une fois un chargement de page complété, les résultats (temps nécessaire pour
charger la page) sont affichés dans un tableau comparatif, et le chargement de la prochaine méthode prend
place.
Il est aussi possible de définir, à l’aide d’un script via un accès SSH au serveur, un délai avant de servir les
pages afin de simuler une latence sur le réseau.
• Améliorations prévues
Quelques améliorations à ce benchmark ont été proposées et seront encore implémentées jusqu’à la fin de
la semaine :
• La configuration et mise en place d’un site « de référence », pour lequel on attend certains résultats
fixés à l’avance.
• La possibilité de lancer le test plusieurs fois d’affilée et d’afficher une moyenne des performances.
D’autres idées ont également été proposées et seront réalisées si le temps le permet : La possibilité de
régler la latence via l’interface web directement.
Conclusion
L’implémentation arrive à sa fin. Quelques détails sont à ajouter et retoucher, puis la rédaction des chapitres
correspondants dans le rapport sera entamée.
1/1
104
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
11 juillet 2016, de 8h00 à 8h15, en C10.19
Rédaction du PV le 11 juillet
Compte-rendu
Points de discussion
• Benchmarks
Kewin a présenté l’état de l’implémentation : Le benchmark des pages est terminé. Il est à présent possible
de lancer le test plusieurs fois d’affilée sur la même page web, et d’obtenir des statistiques sur le résultat
final de ces tests : Moyenne, minimum et maximum de chacun des temps pour les 3 méthodes.
• Travail restant
Il ne reste à présent que du travail rédactionnel : Il s’agit d’écrire la fin du rapport. À savoir, les chapitres de
Conception, Réalisation, Résultats et Conclusion.
Conclusion
Pour la dernière semaine, l’important est donc de rassembler les concepts et les résultats obtenus afin de
former le contenu du rapport.
1/1
105
ANNEXE F. PROCÈS-VERBAUX
PV de réunion
13 juillet 2016, de 9h45 à 10h15, en C10.03
Rédaction du PV le 13 juillet
Compte-rendu
Points de discussion
• PV précédent
• Implémentation finale
Kewin a montré l’état final de l’outil : Il est désormais possible de lancer une succession de tests sur la page
web. Un tableau comparatif des résultats est tenu à jour au long des tests avec la valeur moyenne, minimum
et maximum de chaque temps. Il est également possible de régler la latence du serveur depuis l’interface
web. Notons toujours que cette implémentation pour une utilisation d’une seule personne à la fois.
• Rapport
L’implémentation de la modification de la latence via interface web a pris du temps sur la rédaction du
rapport. Il reste une partie de la Conception, Réalisation, Validation et Résultats à écrire. Kewin a présenté la
structure des chapitres, qui semble convenir.
• Flyer
Il a été rappelé que le Flyer était à rendre vendredi également, et qu’il s’adressait aux visiteurs de
l’exposition : Il est donc nécessaire de rédiger une description compréhensible par le grand public, et qui
donne envie de s’intéresser au projet.
Conclusion
Bien qu’avec un peu de retard, il ne reste plus que le rapport à terminer d’écrire ainsi que faire le flyer pour
vendredi. Le code est terminé, même si une ou deux corrections de bug seront encore faites (et
mentionnées) après le rendu du rapport, et avant la présentation.
1/1
106