This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
HTTP au fil des décennies: Une histoire de la physique , La latence, et l’adaptation à la dégradation
Sunday, 28 December 2025
HTTP n’a pas évolué't evolved. Il a été Force pour changer par la physique, latence , et mauvaise utilisationM SK2
Chaque version existe parce que la précédente a subi des contraintes considérables.
I' j’ai construit des applications Web depuis 1997. I ' j'ai défectué HTTPM SK3 les tempêtes de connexionMSC4 mesuré que les navigateurs ouvrent six connexions par hôte comme une " fonctionnalitéMST6 cursée à l’HTTPMSL7 la tête TCPMKL8deMHL9blocage de ligne sur les réseaux mobilesMLS10 et finalement vu HTTPMSKL11 admettre ce que nous savions tout au long de cette périodeMSCL12 le réseau est le problèmeMSL13
Ce n’est pas un tutoriel de protocole, c’est une histoire d’où nous sommes arrivés.
HTTP/1.0: Texte sans état sur des tuyaux non fiables
Le monde qui l'a fait
HTTP/1.0 a été conçu dans 1996 pour un monde qui n'existe plus.
- Connexions de dialup à 28.8kbps (si vous êtes chanceuxM SK2
- Les pages étaient des documents - texte , peut-être quelques petites imagesM SK2 hyperliens
- Les utilisateurs ont clické et attendu - la réponse immédiate n’était pas prévue
- Les serveurs étaient coûteux - universités et entreprisesM SK1 pas tous
Dans ce monde, , largeur de bande, non latenceM SK1 Une page de 50KB a pris 15 secondes pour être téléchargée sur le dial-up.
Ce que HTTP/1.0 a optimisé pour:
- Simplicité (debuggable avec telnet)
- Absence d'État (servers ne fonctionnent pas't suivi des connexionsM SK2
- Personne-disponibilité M SK1protocole de texte)
- Une demande, une réponse, la connexion fermée
GET /index.html HTTP/1.0
Host: example.com
HTTP/1.0 200 OK
Content-Type: text/html
<html>...
Simple. Elegant. Perfect pour M SK2 Et complètement inutilisable pour quelque chose que ce soit au-delà de la récupération du document
La pression qui l'a détruite
Puis le web a changé. Fast.
Par 1998, les pages n’étaient pas seulement des documents, mais des feuilles de style.
Chaque demande unique requise:
- Le coup de main TCP (1 RTTM SK1
- Demande/premier octet (~1 RTTM SK1
- La réponse reçue
- Connexion fermée
- Répéter pour chaque image
Une page comportant des ressources 20 signifiait 20 TCP handshakes. Sur une connexion à latence de \200ms Je ne me suis pas rendu compte de ce que j'avais fait. avant tout transfert de contenu.
L’hypothèse fondamentale de HTTP/1.0:
Le temps était bon.
Dans 1996,, il s’agissait de . La largeur des bandes était le créneau d’étranglement La latence était't - et soudainement, ces voyages d’entourage ont eu une importance
HTTP/1.0 a été conçu pour les documents. Le Web est devenu une plate-forme d’applications
HTTP/1.1: Nous'Nous y remédierons
Le monde qui l'a fait
HTTP/1.1 est arrivé dans 1997, tout comme le web explosait . Le boom de la dotcom était en train d’amorcer . Chaque entreprise avait besoin d’un site Web M SK4 Les pages Web étaient en train de devenir complexes.
La pression était claire: connection-per-requête a tué la performance. Mais le remaniement complet de l’HTTP n’était pas une option.
Ce qui a changé:
- Connections permanentes (
Connection: keep-alivepar défaut) - réutiliser la connexion TCP - Encodage de transfert ponctuel (réponses en amont sans connaître la taille de l’échantillon
- Intitulé d'hôte (hôte virtuel - sites multiples par IPM SK2 crucial pour l’hébergement partagé)
- Cache sémantique (
Cache-Control,ETag, Demandes conditionnellesM SK1 - Pipelinage (envoyer plusieurs demandes sans attendre les réponses)
Qu’a-t-on changé?
- Réponses toujours séquentielles (même avec le pipeliningM SK1
- Les en-têtes de texte sont toujours (repétés à chaque demande)
- Une seule réponse à la fois par connexion
GET /page.html HTTP/1.1
Host: example.com
Connection: keep-alive
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Cache-Control: max-age=3600
...
Pourquoi il est classé-de façon efficace
HTTP/1.1 n’a pas résolu le problème de performance, ' il l’a simplement déplacé.
Le pipelinage a échoué La spécification permet d'envoyer plusieurs demandes sur une seule connexion, mais:
- Les réponses devaient revenir dans l'ordre (têteM SK1de-blocage de lignes )
- Une réponse lente a bloqué tout ce qui était derrière elle.
- Les proxies de Buggy ont manqué des demandes en pipeline
- La plupart des navigateurs l'ont complètement désactivé.
Ainsi, les navigateurs se sont trompés. Au lieu de corriger le protocole , ils ont travaillé autour du protocole
- Ouverture 6 connexions parallèles par hôte (limite du navigateurM SK1
- Utilisation perte de domaines (
static1.example.com,static2.example.com) pour multiplier les connexions - Les feuilles de Sprite pour combiner les images
- CSS/JS bundling pour réduire les demandes
- CDNs pour réduire la latence
Aucun de ces éléments n’était le protocole qui fonctionne comme il a été conçu.
HTTP/1.1 évalué par chevauchement, non pas en fixant le modèleM SK2
Pourquoi cela a-t-il survécu?
HTTP/1.1 a fonctionné d'une manière assez bonne pour quinze ans. Non parce qu’il était bonM SK1 mais parce que l’environnement a compensé:
- Broadband arrive. 20mshakes de main au lieu de 200msM SK2 La douleur était tolérable.
- Moore' la loi a contribué. Les serveurs pouvaient gérer six connexions par navigateur par 2005.
- Les CDN ont masqué le problème. Les serveurs de bord 20ms à l'écart plutôt que 200ms.
- Desktop dominé. Connections câblées, faible latence, réseaux fiablesM SK2
Le protocole était encore brisé. Nous avions la chance que le monde l’ait caché.
Le coût réel
Ces six connexions par hôte n’étaient pas
- Chaque connexion signifiait un autre coup de main TCP
- Chaque connexion a fait concurrence pour la largeur de bande
- Les serveurs devaient entretenir plus de connexions concurrentes
- Head-of-blocage de ligne ajusté à TCP - perte d'un paquet sur une connexion
Le Web est devenu plus rapide dans l’ère HTTP/1.1 . Mais pas parce qu’il s’agit d’HTTP
- Les réseaux deviennent plus rapides
- Le caching est devenu plus intelligent
- La latence absorbée par les NCD
- Les navigateurs se sont améliorés dans le parallèle
Nous étions en train de construire une plate-forme d’application sur un protocole de recherche des documents.
La vérité incommode que personne ne reconnaît
Par 2010, la performance du web était une bataille constante contre HTTP lui-même
Les meilleures pratiques de l’époque disent la vérité
- Concatener tous vos JavaScript dans un seul fichier
- Spritez toutes vos images ensemble
- CSS critiques en ligne
- Utiliser des URI de données pour éviter les demandes
- Domain shard pour ouvrir d'autres connexions
- Mettre les scripts au bas de la page
Chacune d’entre elles est une solution de rechange pour "HTTP/1.1 ne peut handler beaucoup de demandes efficacement '
J’ai construit bon nombre de ces petits outils comme les générateurs de sprites.
Les navigateurs n’étaient pas plus rapides' parce que HTTP a été amélioré. Ils étaient plus vites parce qu’ils a travaillé autour de HTTP.
Six connexions par hôte n’est pas une fonctionnalité. Celle-ci ' est un hack. Le piratage de domaine ne constitue pas la meilleure pratiqueM SK3 Celles-ci
J’ai passé des années à enseigner aux développeurs de regrouper les éléments d’actifs, images sprites , et ressources critiques en ligneM SK2 Aucune de ces choses n’était " bonne architectureMSC4 C’est protocole de contrôle des dommages.
Le mythe "HTTP est simple" persistait parce que la complexité était cachée dans :
- Gestion de la connexion du navigateur
- Logique de bord du CDN
- Concatenation de l'outil
- La mise en commun de la connexion du serveur
HTTP/1.1 a fonctionné parce que tout fonctionne entourant Il a travaillé en heures supplémentaires pour compenser les pertes.
Si vous avez déjà vu un diagramme de HTTP qui ne montre pas la latence, une perte ou des modes de défaillance.
HTTP/2: Nous avons corrigé la mauvaise couche
Le monde qui l'a fait
Par 2010,, le web s’était transformé de nouveau . Deux changements massifs ont changé tout :
1. Mobile a eu lieu. L’iPhone a été lancé en 2007. Par 2012, le trafic mobile de la web explosait. soudainement les utilisateurs n’étaient pas sur une large bande passante par câbleM SK4 ils se trouvaient sur une 3GMSC6 puis sur un m4G+, avec une latence variable et des pertes fréquentes de paquets.
2. Pages Web remplacées par des applications Web Gmail. Google Maps. FacebookM SK2 TwitterMSC3 Il s’agissait non pas de documents avec des liens, mais d’applications nécessitant des dizaines ou des centaines de ressources.
Google a ressenti cette douleur à l’acuité.
SPDY: Google's Experiment
SPDY (pronounced "speedy") a été GoogleM SK3s answer to HTTPMST4s limitationsMSC5 Il n’était pas une tentative de normesMSSK6it était le code d’expédition de Google et voir ce qui fonctionnait.
Ce qu’a introduit le SPDY:
- Cadre binaire au lieu d'analyser le texte
- Écoulements multiples sur une seule connexion TCP
- Compression des titres ( ultérieurement refinée en HPACK pour HTTP /2)
- Prise par le serveur pour la fourniture de ressources proactives
- Prioritisation des cours d'eau charger les ressources critiques d'abord
Google a déployé SPDY à travers Chrome et ses propres services. Par 2012, Gmail , Google SearchM SK3 et YouTube ont tous mis en œuvre SPDYMST4 Les résultats étaient convaincantsMSC5 MST6 Réduction de la latence dans certains casMst7
Le chemin vers HTTP/2:
SPDY a prouvé que les concepts fonctionnent. L’ETF a pris note et utilisé SPDY comme point de départ pour HTTPM SK1 La spécification finale d’HTTP/2 (2015) n’est pas identique à SPDY MSC4 la compression des en-têtes a changé considérablement |(HPACK a remplacé SPDY='s zlib+-l’approche fondée sur les préoccupations liées à la sécurité.
Google a désapprouvé le SPDY dans 2016 une fois que HTTP /2 avait été suffisamment adopté M SK2 Mission accomplie : ils MSC4 ont forcé le Web à aller de l’avant en expédiant d’abord et en normalisant ultérieurement.
Ce que HTTP/2 a changé M SK1building on SPDY):
- Cadre binaire (pas de texte - partage plus efficaceM SK2
- Multiplexing (requêtes multiplesM SK1réponses interliées sur une connexion)
- Compression des titres (HPACK - ne répétant plus les mêmes en-têtes
- Prise par le serveur (envoyer les ressources avant que le client ne demande -, même si cela s’est avéré difficile à ajuster correctement et est maintenant largement répréhensible
- Connection unique par origine (pas plus d'explosion de connexion)
┌──────────────────────────────────────────┐
│ Single TCP Connection │
├──────────────────────────────────────────┤
│ Stream 1: GET /page.html │
│ Stream 3: GET /style.css │
│ Stream 5: GET /app.js │
│ Stream 7: GET /logo.png │
│ (all interleaved, no ordering required) │
└──────────────────────────────────────────┘
C'est ce que devrait avoir été le pipeline HTTP/1.1 Streams are independent . Une réponse lente ne bloque pas les autresM SK3 Les en-têtes sont comprimés. Le protocole correspond enfin à la façon dont nous utilisons réellement le web
Pourquoi cela a-t-il fonctionné (sur les réseaux appropriés)
HTTP/2 était parfaite pour le réseau à large bande. Dans le cas de l’ensemble des pays développés, la large bande était omniprésente dans les pays industrialisés lorsqu’elle a été standardisée.
Ce qui s’est amélioré:
- Tendance sous une charge légère (une connexion, aucun manœuvre à l'extérieur par demandeM SK2
- Moins de connexions (moins de serveur surcoût,moin lenteur du TCP -démarrageM SK3
- Amélioration de l’utilisation de la largeur de bande (sans limites de connexion artificielleM SK1
- Compression des entêtes (entêtes répétées comme les cookies ne coûtent plus de bande passante
- Il n'y a plus de concatenation/spriting nécessaire (un grand nombre de petits fichiers sont en règle maintenant )
Pour les utilisateurs qui utilisent des connexions câblées avec une faible perte de paquets, HTTP /2 a été une véritable amélioration. Les points de repère ont été très bonsM SK3 Les métriques ont été amélioréesMSC4 Google a déclaré la victoire
La pression qui l'a détruite
Mais le monde s’était déjà déplacé. Le mobile était maintenant la majorité du trafic Web.
Et les réseaux mobiles ont une propriété fondamentale que la large bande ne possède pas la perte de paquets est courante et imprévisible.
Garanties TCP en-livraison sur commande. S’il y a perte d’un paquet 47, les paquets
┌──────────────────────────────────────────┐
│ TCP Receive Buffer │
├──────────────────────────────────────────┤
│ [pkt 45][pkt 46][ ? ][pkt 48][pkt 49] │
│ ↑ │
│ Waiting for packet 47 │
│ │
│ Stream 1 data: BLOCKED │
│ Stream 3 data: BLOCKED │
│ Stream 5 data: BLOCKED (has pkt 48-49) │
│ Stream 7 data: BLOCKED │
└──────────────────────────────────────────┘
HTTP/2 tête résolue -de-blocage de ligne à la couche d'applicationM SK3 Puis TCP l'a réintroduite au niveau de transportMSC4
Un paquet perdu bloque tous les flux. Sur une connexion câblée propre, la perte de paquets est rare . sur les réseaux mobiles, WiFi perduM SK3 ou liens congestionnésMSC4 La perte du paquet est constanteMNK5 Et parce que HTTPMRK6 utilise un Unité connexion (par design), un paquet perdu bloque maintenant tout instead of just one of six connections.
HTTP/2 performance:
- Fabrication de câbles, perte faible: Excellent
- Mobile, perte modérée: Parfois plus grave par rapport à HTTP/1.1
- Haut latence, perte quelconque: Catastrophique
L’ironie est que :, HTTP et /2 visaient à corriger le problème de multiplexage du web.
Pourquoi HTTP/2 a-t-il été plus rapide?
Les premiers déploiements HTTP/2 ont révélé des améliorations réelles:
- Moins de connexions signifiaient une charge initiale plus rapide (TLS un coup d’oeil une foisM SK1 pas six fois )
- Réduction de la compression des en-têtes
- Le multiplexage a bien fonctionné pour les actifs de même origine
Tous ces outils que j’ai construits pour 1.1? Le tout a disparu avec HTTP/2, soudainement le regroupement était une chose malheureuseM SK2 HTTP /2' la multiplexation était excellente pour les biens de même origineMSC4 mais elle n’a pas contribuéMNK5 à traverser les demandes de provenanceMRK6 nous avons dû construire de nouveaux outils pour regrouper ces (webpack sur ce site, par exemple.
Mais la latence de la queue raconte une histoire différente. établissement d'un amélioré. Le PM SK1 s’est détérioré .
J’ai vu ce premier-hand : un client habilitant HTTP /2 à travers leur CDN et voyait la latence mobile P99 augmenter par 40%. Les tableaux de bord ont montré une amélioration sur le bureau de travail . Les billets d’appui sont venus des utilisateurs mobiles . Nous avons passé une semaine à constater que HTTP
Lorsque HTTP /2 fonctionne , il fonctionne merveilleusement МSK2 Quand un paquet tombe sur une connexion mobile au pire moment , , tout se frotte ,. Et les utilisateurs remarquent le frottage plus qu'ils ne le remarquent des médianes rapides .
Le problème fondamental:
HTTP/2 supposant que le TCP était assez bon
Pour la large bande, ce fut le ,; pour les mobiles, c’était le .; pour la téléphonie mobile, il s’agissait du ,; et jusqu’à ce que l’HTTP soit standardisé, ce n’est pas le MSC3; ou encore ce n'est pas celui de ..
HTTP/3: Bien, NousM SK2 allons descendre le panier
Le monde qui l'a fait
Selon 2015,, la preuve était claire. TCP était le problème.
Google avait exploité le QUIC expérimentalement depuis 2012. Ils avaient les données . Sur les réseaux mobiles, WiFi perduM SK3 et haute vitesseMSC4 connexions de latenceMNK5 HTTPMRK6 via TCP a échoué de façon qu’on ne pouvait pas fixer la ' sans changer la couche de transportMMK8
Mais vous pouvez 't seulement "fixer le TCP." IlM SK3est mis en place dans les noyaux des systèmes d’exploitationMSC4 Il+'est incorporé à tous les routeurs de route–, pare-feu,, et la boîte médiane sur l’Internet–. Changing TCP signifie attendre des décennies pour que l’infrastructure Internet entière soit mise à niveau.
Ainsi, Google a fait quelque chose audacieux: ils ont construit un nouveau protocole de transport sur UDP.
QUIC: Le protocole qui a remplacé le TCP (Sort Of)
QUIC (auparavant "Connexions Internet rapides par UDP", Maintenant seulement QUICM SK3 est un protocole de transport qui fonctionne sur UDP mais offre une fiabilité similaire à celle du TCPMST4Mst5 La principale idéeM st6 mettre en œuvre la fiabilité dans l’espace d’utilisateur, où vous pouvez iterer rapidement.
Pourquoi l’UDP est-elle une fondation?
UDP est délibérément minimal. Il ajoute des numéros de port à l’IP et... qu’il s’agit en principe de ce qui suit ' il n’y a pas d’articulations de main, non plus de fiabilité, non moins d’ordonnances, non pas de commandes, . Les paquets arrivent peut-être hors d’ordre.
Ce "dumbnessM SK1 est exactement ce que le QUIC a besoin . En construisant sur l’UDP M SK3 le QUIT pourrait :
- Déploiement sans changement de noyau - c'est seulement une bibliothèque
- Iterer rapidement - Les mises à jour de Chrome expédient constamment les nouvelles versions QUIC
- Passer par la plupart des pare-feu - Port UDP 443 fonctionne habituellement
- Mettre en œuvre son propre contrôle des congestions - n'est pas fixé aux algorithmes de TCP'
Que fait QUIC différemment:
| Préoccupations | TCP MSC2 QUIC S | |
|---|---|---|
| Unité de fiabilité | Connexion | |
| Tente de main | TCP + TLS séparé MSC2 Combiné SMC3faster ESMC4 ESMC5 | |
| Encryption | Optionnel (TLS) | Obligatoire MSC4fabriqué SMC5dans l’MSC6 MSC7 |
| Encadrement de blocage des lignes | Tous les données bloquées | Seulement le flux affecté MSC2 |
| Identification de la connexion | IP + Port SMK2 ID de connexion M | |
| Mise en œuvre | Nom du noyau |
L'ID de la connexion est particulièrement intelligente. Le TCP identifie les connexions par adresse IP et port . Changer soit ( démarrer des réseaux Wi-Fi–, Renouveler le raccordement NATM SK4 et la connexion décèdeMSC5 QUIC utilise un ID de la connection qui survie aux changements du réseauMNK6
Le chemin vers HTTP/3:
Tout comme SPDY a conduit à HTTP/2, Google' l’expérience QUIC a conduit HTTP /3. L’ETF a standardisé le QUIC dans M SK3 (RFC SSK5 et HTTPPSK6 (RF C \SSK8 est simplement la sémantique HTTP sur QUIC au lieu de TCPMSC9
Le QUIC standardisé diffère de Google' dans certains détails de l’original (le manœuvre cryptographique a été réorganisée, certains formats d’en-tête ont changéM SK3 mais l’architecture centrale MSC4 les flux avec une reprise indépendante des pertes sur UDP
HTTP/3 (2022) est HTTP sur QUIC. Il s’agit de l’admission que nous avons besoin d’aller en-dessous de HTTP pour corriger le problème.
Ce que HTTP/3 a changé
- QUIC sur UDP (non TCP)
- Récupération des pertes de niveau Stream- (un paquet perdu n’arrête que son flux )
- Établissement d'une connexion plus rapide (0-la reprise du RTT est possible )
- Encryption par défaut (TLS 1.3 intégrée à QUIC
- Migration des connexions (survives les changements d’adresse IP)
┌──────────────────────────────────────────┐
│ QUIC Connection │
├──────────────────────────────────────────┤
│ Stream 1: [pkt][pkt][pkt] ← flowing │
│ Stream 3: [pkt][ ? ][pkt] ← waiting │
│ Stream 5: [pkt][pkt][pkt] ← flowing │
│ Stream 7: [pkt][pkt] ← flowing │
│ │
│ Lost packet only affects Stream 3 │
└──────────────────────────────────────────┘
Ce qui restait le même:
- Sémantique HTTP (GET, POSTM SK2 en-têtes
- Logique de cache
- Patterns REST
- Tout au niveau de l'application
HTTP/3 n’a pas changé, ' ne change pas HTTP . Il a changé la façon dont HTTP survivt à la réalité.
Pourquoi QUIC est important (Dans le détail)
QUIC met en œuvre les garanties de fiabilité du TCP' par cours d'eau, non par connexionM SK1 C'est l'influence clé qui corrige le défaut fatal de HTTP/2'MSC3
TCP's promiseM SK1 "Tous les fichiers arrivent dans l’ordre ." QUIC's promiseM SK1 "Chaque byte dans ce courant arrive en ordre."
Cette distinction est la raison pour laquelle HTTP n’effondre pas sur les réseaux perdus.
Indépendance des cours d’eau:
Dans QUIC , chaque demande HTTP / la paire de réponse reçoit son propre flux . Les flux sont logiquement indépendants M- ils partagent une connexion pour l'efficacité P, mais la perte d'un paquet sur un flux ne bloque pas les autres MPSK5
QUIC Connection
├── Stream 1: GET /index.html [packets 1, 2, 3]
├── Stream 3: GET /style.css [packets 4, 5] ← packet 5 lost
├── Stream 5: GET /app.js [packets 6, 7, 8]
└── Stream 7: GET /logo.png [packets 9, 10]
Packet 5 is retransmitted. Only Stream 3 waits.
Streams 1, 5, 7 continue unaffected.
Comparez-le à HTTP/2 sur TCP: tous ces flux partagent une séquence de fichiers par TCP
Migration des connexions:
Le TCP identifie les connexions par un 4-couple:source IPM SK2port de source ,Port de destination IPPSK4Portde destinationMSC5 Changez l'une ou l'autre de ces options et la connexion est morte
Phone on WiFi → walks out of range → switches to cellular
TCP: Source IP changed. Connection dead. Full reconnect.
QUIC: Connection ID unchanged. Streams continue seamlessly.
Cela est important parce que les utilisateurs mobiles en permanence Switch networks. Sortir de votre maison, perdre WiFiM SK2 passer à un téléphone cellulaire . Avec TCPMSC4 chaque connexion décèdeMST5 avec QUICMSP6 vous ne pourriez même pas en prendre noteMst7
0-Reprise du RTTM SK1
TCP traditionnel + TLS nécessite plusieurs voyages de tour avant d’envoyer les données:
- TCP SYN/SYN -ACK/Ack M SK3 RTTMSC4
- Traitement des mains par TLS (1-2 RTT)
- Enfin: envoyer votre demande HTTP
QUIC combine le transport et les crochets de main cryptographiques. La première connexion prend 1 RTT. Mais pour retourner des utilisateurs avec des credentials cachedM SK3 QUIC offre MSC4RTTMNK5 envoyer immédiatement vos données avec votre premier paquetMRK6
First visit: Client ──[handshake]──> Server ──[response]──> Client (1 RTT)
Return visit: Client ──[data]──────────────────[response]──> Client (0 RTT)
0-RTT a des répercussions sur la sécurité.
Encryption comme premier citoyen de la classe -
Le TCP a été conçu dans le 1970s. L’encryption a été mise en place plus tard par TLSMSC2 Cela signifieM SK3
- Les en-têtes TCP sont des textes simples (on peut voir les numéros de port,numéro de séquenceM SK2
- Les boîtes intermédiaires peuvent inspecter et modifier le trafic TCP (et faire )
- L’encryption est facultative, souvent négociée après l’installation de la connexion
QUIC crypte presque tout depuis le début. Même les numéros de paquet sont cryptés. Ce n’est pas seulement pour la protection des renseignements personnelsM SK3 il évite le problème d’osification où les boîtes médianes dépendent du fait qu’elles puissent lire les en-têtesMSC4 ce qui rend impossible l’évolution du protocole .
TCP packet: [IP header][TCP header (plaintext)][TLS encrypted payload]
QUIC packet: [IP header][UDP header][QUIC header (mostly encrypted)][encrypted payload]
Le monde qui en a besoin
HTTP/3 est conçu pour le monde dans lequel nous vivons.
- Mobile-première: Plus de la moitié du trafic Web est mobile
- Réseaux non fiables: WiFiM SK1 cellulaire, réseaux publics congestionnés
- Utilisateurs mondiaux: Connections à haute latence avec des serveurs éloignés
- attentes en matière de protection des renseignements personnels: L'encryption est obligatoire , non facultative
Le protocole correspond enfin à la réalité du réseau. Trente ans après l’adoption de connexions câblées fiables par HTTP/1.0 , HTTP
Le coût du progrès
HTTP/3 n’est pas
- UDP est souvent bloqué par les pare-feu d’entreprise (retour à HTTP/2 requisM SK2
- Plus de CPU pour la mise en œuvre de l’espace d’utilisateur de QUIC' ( pas dans le noyau comme TCP, bien que cette lacune s’étend avec le bypass du noyaume et les stacks optimisésM SK3
- Nouveaux outils de débugging (tcpdump montre un UDP encryptéM SK1 HTTP non lisible)
- Interférence de Middlebox (un certain nombre de réseaux ne prévoient pas l’UDP)
Mais pour les réseaux mobiles, la première version correspondant à la façon dont les réseaux se comportent en réalité est celle de l’application initiale:
La vraie leçon dans toutes les versions
Chaque modification de la version HTTP s'est produite parce l'environnement a changé plus rapidement que le protocole.
| Version | Échéance MSC2 Environnement SMC3 Supplément SMC4 Pourquoi cela a-t-il échoué ? | |||||
|---|---|---|---|---|---|---|
| HTTPM SK1 | 1996 \ | Dialup \ , documents | La largeur des bandes est le créneau d'étranglement | Les pages sont devenues des applications \ , la latence a pris de l'importance | ||||
| HTTPM SK1 | 1999-2015 \ | Broadband, applications Web | La faible latence dissimule l'inefficacité | Le mobile est arrivé avec une perte de paquets | |||
| HTTPM SK1 | 2015-2022 \ | Peak de la large bande, Augmentation des mobiles | Le TCP est suffisamment fiable | Les mobiles sont devenus dominants | |||
| HTTPM SK1 | 2022+ \ | Mobile-firstMSC6 global | Rien n'est fiable | En cours de déploiement |
Le modèle est clair:
- Le protocole est conçu pour l'environnement actuel
- Changements environnementaux (faster than protocols can adapt)
- Les solutions de rechange s’accumulent (CDNs , hacks de connexionM SK2 bundling)
- Un nouveau protocole reconnaît la réalité
- Répéter
Le protocole continue de se rapprocher du réseau. Chacune des abstractions qui semblaient suffisantes a été retirée lorsque l’environnement l’exigeait.
Autres observations:
- "StatelessM SK1 est une lie que nous nous disons de dormir à la nuit . Chaque cookie de session , auth token M SK4 et l’en-tête du cache est gestion d’État que nous
- La plupart des résultats obtenus ont été attribués évaluations environnementales, non pureté du protocole. CDNs , proxies de cachementM SK3 mise en commun des connexionsMSC4 fusionnements de demandes - toutes indemnités pour les limitations du Protocole
- La chose "simple" demeurait en train de se déplacer . HTTPM SK3 était simpleMSC4 Puis nous avons besoin d’une connexion persistanteMST5 Puis du multiplexingM ST6 Puis un nouveau transportM st7 Chaque couche de complexité a résolu des problèmes réelsMst8
- Questions de calendrier. HTTP/2 aurait été parfait s'il arrivait dans M SK1 Par 2015, mobile avait déjà changé le jeu. Le protocole a été résolu hier
Ce qui n’a pas changé depuis 1.0
Voici la partie incommode de ', . malgré trente ans d’évolution du protocole
Demandes toujours défectueuses. Partition des réseaux. Absence de serveurs. Absences de temps se produisent
Les réseaux demeurent liés. 200 OK ne signifie pas que 't la réponse est correcte. La connexion a été fermée n’implique pas que la demande n’a pas eu de succès
Les caches servent encore des données bloquées.
Cache-Control est une requête, non un commandement. Les proxies font ce qu'ils veulent . L'invalidation du CDN est éventuelle au meilleur de ses chances
Les clients continuent à essayer mal. Utilisateur clique sur le bouton, rien ne se passeM SK1 clique de nouveau. Maintenant vous avez deux demandesMSC3 Questions d'idempotenceMNK4
Les développeurs ne comprennent toujours pas bien l’impotence. GET devrait être sécuritaire. PUT devrait être idempotent. POST est l’ouest sauvageM SK2 La plupart des APIs en arrivent à cette erreur .
// This is still your problem, regardless of HTTP version
public async Task<Result> CreateOrderAsync(Order order)
{
// What happens if this times out?
// Did the server receive it?
// Did it process it?
// Will the client retry?
// Will you create duplicate orders?
// HTTP/3 doesn't save you here.
// Idempotency keys do.
}
Si vous ne comprenez pas ce qui suit :
Ce que j’ai appris en fait
Après avoir construit des applications Web à travers toutes ces versions de protocole, ici ' c’est ce qui est retenu:
1. Le protocole n'est pas votre couche de fiabilité
HTTP vous donne une requête/sémantique de la réponse. Il ne garantit pas la livraison 'la correctionM SK3l'exactitude ou l'exactitude de la transmissionMSC5une seule fois traitéeMST6 QueMSL7est votre travail MST8
2. La latence est l’ennemi , non la largeur de bandeM SK2
La plupart des problèmes de performance sont ronds.
3. Chacune des pratiques exemplaires de "" a une date d’expiration.
Le partage des domaines était essentiel pour HTTP/1.1. Il' est activement préjudiciable à l’HTTPM SK2 ( détruisit le seul service de connexionMSC4 Avantage d’une connectionMNK5 MRK6 Consolider tout en un seul fichierMMK7 fut une évangélie MNK8 maintenant expédier de nombreux petits modules par HTTP+/2+ ou HTTP+ MNK10+ est souvent meilleur+MNK11+ La tactique change=MNK12+ L’objectif MGK13+ Réduire la latence=)+ demeure le même+MZK15+
4. Mesure sur les réseaux réelsM SK1
Les points de repère sur l’hôte local ne prouvent rien. Vos utilisateurs sont sur les réseaux mobiles , WiFi d’hôtel, et connexions à café saturéM SK3 Tester là-basMSC4
5. Les pièces boreuses sont les plus importantes
Démarrages. Retraits . Interrupteurs de circuitsCircuit2 IdempotenceM SK3 Connexion pooling. Ces détails inégaux déterminent si votre système fonctionne sous pressionMSC5
Conclusion
HTTP n’a pas été plus rapide parce qu’il est devenu plus intelligent. Le réseau était le problème..
Chaque version était juste pour son temps:
- HTTP/1.0 a été parfaite pour la recherche de documents par dialup
- HTTP/1.1 a été parfait pour les applications Web à large bande
- HTTP/2 a été parfait pour les connexions câblées à faible - perte
- HTTP/3 est construit pour le mobile-first,incredibleM SK2network reality que nous vivons en réalité
L’erreur consistait à penser qu’il s’agissait de solutions permanentes.
Les versions HTTP ne sont pas des mises à niveau au sens du consommateur. Elles sont des compensations optimisées pour différentes distributions de défaillance.
Et encore, après tout cela, les éléments fondamentaux demeurent:
- Demandes échouent
- Réseaux faux
- Cacher est difficile
- Questions liées à l'idempotence
Le protocole a évolué.
Mettre en place des systèmes qui survivront aux défaillances. Essai sur les réseaux réels . Comprendre que chaque version HTTP est un compromis formé par son époque, pas une mise à niveau qui obsolète ce qu’il y a eu avantM SK3
Que ce sont les trente ans de l’HTTP, que c’est le Web que nous avons construit et qu’au cours d’une autre décennie, les hypothèses de ,, HTTP, /3' seront probablement aussi datées que celles qui existent aujourd’hui.
Autres lectures
- RFC 9114: HTTP/3 - La spécification officielle
- RFC 9000: QUIC - Protocole de transport
- HTTP/2 Expliqué - Daniel StenbergM SK1excellent aperçu
- Réseau des navigateurs à haute performance - Ilya GrigorikM SK1s deep dive (free online)