Om de opbouw te versnellen, combineert HTTP/2 verschillende technieken. Al sinds 1999, toen HTTP 1.1 ingevoerd werd, had men door dat het niet gunstig is voor de laadtijd van een webpagina om voor elk opgevraagd element een eigen TCP-verbinding te openen en daarna weer te sluiten. Dat zou dan bijvoorbeeld bij elke afbeelding of script gebeuren. HTTP 1.1 biedt daarom het zogeheten ‘keepalive’, waarbij een verbinding geopend blijft voor verdere pagina-elementen.
Maar het verwerken van alle aanvragen gebeurt per TCP-verbinding weer keurig stuk voor stuk, elke aanvraag komt terecht in een wachtrij. Een grote afbeelding in het begin van een reeks kan he downloaden van andere aanvragen dus afremmen (head of line blocking). Ook zogeheten ‘chunked transfer’, waarbij grote elementen gesplitst worden, lost dat probleem niet op. Browsers openen daarom vaak meerdere parallelle TCP-verbindingen. Dat zorgt met elke verbindingsopbouw echter wel voor meer belasting bij de server.
HTTP/2 omzeilt dat probleem door multiplexing. Als een client bijvoorbeeld een background.png, script.css en style.css van de server wil hebben, brengt die eerst een TCP-verbinding tot stand. Daarna verdeelt de client de aanvragen over HTTP/2-frames en wijst aan elk frame een ID toe. De frames verstuurt hij zoals het uitkomt. De server stelt de elementen samen op basis van de ID.

Als een bepaalde aanvraag compleet is, wordt die verwerkt en het resultaat verstuurd, eventueel gemengd met frames van andere elementen. De browser stelt de frames samen en kan met renderen beginnen zodra een element compleet is. Als een afbeelding pas een seconde later komt, blokkeert dat het verwerken van andere elementen niet.
Multiplexing biedt vooral voordelen als een pagina uit veel elementen bestaat. Een goed voorbeeld is de demo van de ontwikkelaars van de programmeertaal Go. Die pagina bevat een afbeelding die uit 15 bij 15 deelafbeeldingen bestaat. Dat resulteert in 255 aanvragen. Via de koppelingen boven de afbeelding kun je kiezen of de pagina met HTTP 1.1 of HTTP/2 moet worden geladen en hoe lang de server elk element vertraagt.

Met de ontwikkelaarsconsole in Chrome is goed te zien dat de afbeeldingen met HTTP 1.1 stuk voor stuk binnenkomen. Het laden van de webpagina met 255 afbeeldingen duurt bijna 6 seconden.
Een blik in de ontwikkelaarsconsole van de browser is daarbij zeker de moeite waard. We gebruiken hier Chrome, maar bij andere browsers werkt dat vergelijkbaar. Open de console met F12 (of met een rechter muisklik en ‘Inspecteren’). Ga naar het tabblad ‘Network’ en klik op de rode opnameknop. Laad de pagina dan via de links met de verschillende protocollen. In de kolom ‘Waterfall’ zie je hoe efficiënt HTTP/2 werkt in vergelijking met de voorganger.

Met HTTP/2 laadt dezelfde inhoud in 0,75 seconden omdat de afbeeldingen elkaar niet afremmen.
Google Chrome verbergt de belangrijkste informatie aanvankelijk. Klik met de rechtermuisknop op de kolomkop en activeer de kolom ‘Protocol’. Dan zie je vrij eenvoudig of een site HTTP/2 al gebruikt. Een ‘h2’ in de kolom ‘Protocol’ wijst op het nieuwe protocol. Bij grotere websites zie je vaak dat niet alle elementen via hetzelfde protocol geleverd worden. Dat kan bijvoorbeeld komen doordat afbeeldingen of reclame van een andere server moeten worden geladen.
Een andere testtool op de commandline is tot nu toe voorbehouden aan Linux- en Mac-gebruikers. Windows 10 heeft daar nog geen variant van. Je kunt curl dwingen alleen met HTTP/2 te werken:
curl –http2 https://www.google.nl
Als die opdracht geen data oplevert, werkt de server alleen met HTTP 1.1 of 1.0.