- Maintenir la taille d’un site web sous les 14 kB peut réduire fortement le temps de chargement par rapport à 15 kB
- Ce phénomène est causé par l’algorithme de slow start de TCP, qui crée une différence de vitesse perceptible à cause de la limite de données envoyées lors de la première transmission
- 14 kB correspondent à la capacité des 10 paquets TCP que la plupart des serveurs envoient au départ
- Dans des environnements à forte latence comme l’internet par satellite, un aller-retour supplémentaire (RTT) peut entraîner plus de 612 ms de délai
- En pratique, il est efficace pour l’optimisation des performances web de garder le contenu principal sous les 14 kB, ou de placer les ressources critiques dans les 14 premiers kB
Vue d’ensemble et principe clé
- Il est bien connu que plus un site web est petit, plus il se charge vite
- En revanche, le fait qu’un passage de 14 kB à 15 kB provoque une différence majeure sur le temps de première réponse est moins intuitif
- La différence de vitesse entre une page de 15 kB et de 16 kB est minime, mais entre 14 kB et 15 kB, l’écart peut atteindre 612 ms
Qu’est-ce que TCP
- Le Transmission Control Protocol (TCP) fonctionne au-dessus d’IP (Internet Protocol) et garantit la fiabilité des paquets
- Lors d’une requête HTTP, le navigateur web envoie plusieurs paquets TCP
- Avec IP seul, il est impossible de savoir si les paquets sont bien arrivés, donc TCP fournit un mécanisme d’accusé de réception des paquets (ACK)
- Le serveur envoie d’abord une petite quantité de paquets, puis transmet des paquets supplémentaires après réception d’un ACK du navigateur
- En l’absence d’ACK, une procédure de retransmission des paquets est déclenchée
Qu’est-ce que le slow start de TCP
- Le slow start de TCP est un algorithme dans lequel le serveur augmente progressivement la quantité de paquets envoyés afin d’évaluer la qualité de la connexion réseau (bande passante)
- Au début de la connexion, le serveur n’envoie qu’un petit nombre de paquets (généralement 10)
- Si l’ordinateur du visiteur renvoie correctement les ACK, le volume d’envoi de paquets est doublé
- Si des ACK manquent, les paquets sont ensuite envoyés à une vitesse plus lente
- L’algorithme réel varie dans ses détails selon les implémentations, mais le principe reste le même
Pourquoi la limite de 14 kB
- La plupart des serveurs envoient 10 paquets TCP d’un coup pendant le slow start
- La taille maximale d’un paquet TCP est de 1500 octets, mais après retrait de l’en-tête (40 octets), il reste 1460 octets de données utiles
- Donc 10 x 1460 = 14600 octets (environ 14 kB), soit la limite maximale du premier envoi
- Si un site web ou une ressource critique tient sous les 14 kB (ou quelques dizaines de kB de données source avant compression), il peut s’afficher sans délai d’aller-retour supplémentaire au démarrage
À quel point un aller-retour peut-il ajouter du délai
Exemple de l’internet par satellite
- Un exemple représentatif d’environnement à forte latence est celui des utilisateurs de l’internet par satellite (plateformes pétrolières, paquebots de croisière, etc.)
- Lorsqu’un téléphone demande une page d’accueil, le trajet routeur → antenne satellite → satellite en orbite → station au sol → serveur prend de plusieurs dizaines à plusieurs centaines de ms sur chaque segment
- L’aller-retour complet inclut deux trajets dans l’espace, le passage par les segments réseau et le traitement côté serveur, ce qui ajoute environ 612 ms de délai
- Avec HTTPS, cela peut monter jusqu’à 1836 ms à cause des handshakes supplémentaires
Latence sur les réseaux terrestres
- Des latences de 100 à 1000 ms peuvent aussi apparaître sur les réseaux mobiles comme la 2G ou la 3G
- Des délais supplémentaires peuvent être causés par la congestion, la surcharge du serveur, la perte de paquets et d’autres conditions réseau
Stratégies d’optimisation web avec la règle des 14 kB
- L’essentiel est de rendre le site web ou la page aussi léger que possible
- L’idéal est de concevoir chaque page pour que son volume transféré compressé reste sous les 14 kB
- Avec compression, le contenu réel peut aller jusqu’à ~50 kB
- Réduire les vidéos en lecture automatique, les pop-ups, les trackers, le JS/CSS inutile et la plupart des éléments superflus permet généralement d’atteindre cet objectif
- Si faire tenir toute la page dans 14 kB est difficile, il est important de placer en priorité les ressources critiques et le contenu principal (CSS, JS, texte principal, etc.) dans les 14 premiers kB
- Les en-têtes HTTP (non compressibles) et les images (chargement strictement nécessaire / uniquement dans la zone visible ou avec placeholders) comptent aussi dans ces 14 kB
Exceptions à la règle des 14 kB et enjeux des protocoles récents
- La règle des 14 kB n’est pas une simplification excessive, mais il existe quelques exceptions
- Certains serveurs étendent la fenêtre initiale à 30 paquets
- Le handshake TLS peut permettre une fenêtre plus grande
- Le nombre de paquets transmissibles peut être mis en cache selon la route, ce qui permet d’en envoyer davantage lors d’une connexion suivante
- Même avec HTTP/2, la pratique qui consiste à démarrer à 10 paquets via le slow start de TCP change peu dans l’ensemble
- Avec HTTP/3 et QUIC aussi, la règle des 14 kB reste officiellement recommandée
Résumé et ressources de référence
- Les fondements techniques et des explications supplémentaires peuvent être consultés via les différents liens
- Première publication : 2022-08-25, dernière modification : 2022-08-26, auteur : Nathaniel, tags associés : performance web, HTTP, TCP
Liens de référence
- Structure des trames Ethernet et des en-têtes TCP, documents complémentaires sur la latence et la bande passante, spécifications TCP/QUIC, etc.
1 commentaires
Avis sur Hacker News
Les développeurs logiciel devraient s’intéresser un peu plus à la couche média ; j’ai surtout trouvé très pertinent ce que l’auteur souligne sur la fiabilité et la latence de la 3G/5G. Les radios impliquent presque toujours des retransmissions, et dans la plupart des communications HTTP, les paquets doivent arriver dans l’ordre pour que l’UI se mette à jour. En pratique, même une seule requête REST n’est réellement traitée en un seul paquet que si la requête et la réponse font moins de 1400 octets. Au-delà, cette requête « unique » est en réalité fragmentée en plusieurs paquets. Si l’un d’eux a un problème, l’écran ne peut se rafraîchir correctement que lorsque tous les paquets arrivent dans l’ordre. Si vous voulez tester, activez le mode 3G et la perte de paquets dans les outils de développement de Chrome : vous verrez qu’une toute petite optimisation peut déjà fortement améliorer la réactivité de l’UI. C’est donc un argument convaincant pour garder l’API et l’UI aussi petites que possible
Le poids transféré de ma page d’accueil est de 7,0 kB une fois compressé
L’objectif des 14 kB est assez ambitieux, mais l’idée de rester dans les 10 paquets initiaux est intéressante aussi. Il existe un projet comme 512kb.club qui se concentre, comme moi, sur le poids des sites web. On y compare la taille des sites comme un score de golf. Mon site (anderegg.ca) totalisait 71 kB toutes ressources confondues avant inscription. Grâce à ce projet, j’ai aussi découvert Cloudflare Radar, qui propose un bon outil pour analyser les sites et mesurer le poids des pages. Son but principal est d’être un tableau de bord global d’Internet, mais il inclut aussi un outil d’analyse de taille de page
Si vous voulez faire une expérience plus amusante avec ça, la taille de la fenêtre initiale (IW) peut être définie côté serveur. Par exemple, on peut l’ajuster comme ceci
Cela s’applique aussi à ce qui est expliqué dans le billet suivant : Blog Cloudflare - le phénomène où des FAI russes n’autorisent que les 16 premiers KB, rendant la plupart du web inutilisable. Selon l’analyse de Cloudflare, des FAI russes limitent le trafic de leurs utilisateurs nationaux, de sorte que seuls les 16 premiers kB de chaque ressource web se chargent
L’intersection entre les gens qui ne savent pas ce qu’est TCP Slow Start et ceux qui s’intéressent suffisamment au sujet pour se préoccuper jusqu’aux moindres retards de chargement d’un site web est très faible. Une startup doit d’abord se concentrer sur le fait d’être une startup, et seules les grandes entreprises ont les moyens de s’obséder avec ce type d’optimisation
Ma page d’accueil fait 17,2 KB ! (hors dépendances) Pour une page personnelle, j’ai vraiment travaillé l’optimisation à fond et j’ai même obtenu un score parfait de 100 à Lighthouse. Je pensais que ce serait impossible avant d’y arriver. Au fait, c’est fait avec Rails. Ce type d’optimisation vaut vraiment le coup. L’expérience d’une page qui apparaît à la vitesse de l’éclair, sans aucune sensation de latence, est en soi très satisfaisante
Je pense que l’article a deux faiblesses logiques
La génération actuelle a tendance à créer même les sites statiques simples avec des frameworks comme Next.js. Je trouve cela dommage, comme si l’époque HTML+CSS+js touchait à sa fin
Au-delà de la latence, réduire au minimum la consommation de ressources est une condition indispensable pour un avenir durable. L’impact environnemental du réseau est loin d’être négligeable. Je trouve dommage que le ton des commentaires soit un peu sarcastique. Cette optimisation n’est pas l’ultime solution, mais j’aurais aimé qu’on insiste davantage sur la baisse de consommation d’énergie