HTTP/2: Hypertext Transfer Protocol versie 2

Protocol

Je zal de naam al vaak hebben gehoord: HTTP/2. Het HTTP protocol is een van de belangrijkste bouwstenen van ons huidige wereldwijde web. Vandaag gaan we het hebben over de opvolger van de huidige 1.1 versie, genaamd HTTP/2. Dit nieuwe protocol is gebaseerd op het SPDY protocol van Google en wordt al sinds eind 2015 ondersteund in de meeste grote browsers, zoals Chrome, Firefox, Safari en Edge. Veel webservers bieden deze ondersteuning al aan, al dan niet in de vorm van een plug-in.

Wat doet HTTP ook alweer?

Hypertext Transfer Protocol, of HTTP, is het protocol dat wordt gebruikt tussen een client en webserver. Dit protocol zorgt ervoor dat een request van een client voor een bepaald document door een webserver kan worden afgehandeld en dat deze het document weer terug kan sturen, waar om is gevraagd. In den beginne waren dit alleen nog GET requests, waarmee je een HTML document kon terugkrijgen. Maar inmiddels zijn er meerdere methodes bij gekomen waarmee ook formulieren en bestanden mee kunnen worden verstuurd.

Waarom HTTP/2

De buitengewone groei van het WWW heeft eraan bijgedragen dat versie 1.1 van het protocol voor veel zaken niet meer volstaat. Waar het World Wide Web 10 jaar terug vooral uit HTML en plaatjes bestond, bestaat een gemiddelde pagina uit CSS, plaatjes, video’s en Ajax calls.

Door de jaren heen zijn er meerdere workarounds bedacht om performance problemen tegen te gaan in versie 1.1 van het protocol. Om zoveel mogelijk overhead te beperken van nieuwe connecties wordt vaak gebruik gemaakt van zaken zoals spritesheets, domain sharding en het inline maken van content.

Met versie 2.0 van het protocol zijn al deze hacks niet meer nodig en kan de webserver en client, mits ze allebei de ondersteuning geven, zelf ervoor zorgen dat zo snel mogelijk alle resources worden doorgegeven.

Binair

Een van de grootste veranderingen is de switch van het tekstformaat naar binair formaat van de berichten die over en weer gaan. In versie 1.1 zien de berichten er nog ongeveer zo uit:

GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive

En response:

HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/html
Content-Length: 1354

<html>
<body>
<h1>Bla bla bla</h1>
...
</body>
</html>

In HTTP/2 bestaan de berichten nog alleen uit 2 delen. Een HEADERS frame, waar info staat over de request, en een DATA frame, waar de HTML of andere content in staat. Door ondersteuning voor multiplexing kan een response bericht meer dan 1 bestand bevatten. Hierdoor kunnen dus meerdere zaken tegelijkertijd worden aangeleverd over dezelfde lijn. De stukjes content kunnen daarbij in willekeurige volgorde door de webserver worden verstuurd. Het is dan aan de client om deze data te herschikken tot dezelfde bestanden.

Ook is de compressie verbeterd in HTTP/2 door het gebruik van de Huffman compressie. Waar voorheen compressie alleen van de content mogelijk, zijn nu ook de headers compacter gemaakt voor het vervoer over de lijn door deze compressie. Door multiplexing is het dus ook minder vaak nodig om de headers uit te wisselen.

Server Push

Een krachtig nieuw mechanisme in HTTP/2 is de server push. Nee, dit heeft niets met de Jedi truc te maken. Het is een manier voor de server om alvast extra resources de kant van de client op te sturen over dezelfde lijn, waarvan de applicatie op de server weet dat deze bij een document horen.

Stel dat je een HTML document hebt met links naar wat plaatjes, Javascript en een paar CSS bestanden. Dan zou je mbv headers in de HTML response deze direct mee kunnen sturen als onderdeel van de request. Voorheen kon je dit doen door CSS, Javascript en plaatjes op te nemen in de HTML zelf. Maar dit leverde vaak problemen op in de caching.

Met server push kunnen deze bestanden apart gecachet blijven en hoeft in het vervolg alleen nog de HTML opnieuw opgehaald te worden.

Prioritization

Een ander belangrijk mechaniek dat is geïntroduceerd is prioritization. Zoals verteld hoeft de volgorde van alle data frames niet op volgorde te zijn. Dit geeft de mogelijkheid om belangrijke data frames als eerste door te geven. Zaken zoals HTML en CSS worden dan als eerste verstuurd, zodat deze het eerste gerenderd kunnen worden. Daarnaast zorgt dit er ook voor dat data die snel kan worden opgehaald eerst wordt verstuurd en zaken met wat meer latency pas later. Dit zorgt voor een efficiënter gebruik van dezelfde lijn.

Onderhandeling

Maar hoe komen de client en webserver tot de afspraak om HTTP/2 te gebruiken? Hiervoor is er een uitbreiding op de Transport Layer Security (TLS), genaamd Application-Layer Protocol Negotiation of APLN. Deze uitbreiding zorgt ervoor dat het maken van de afspraak en het opzetten van een veilige verbinding in 1 stap gebeurd. Meer hierover is te vinden op de Wikipedia pagina van ALPN

Ondersteuning

Op het moment van schrijven bieden al veel webservers ondersteuning voor HTTP/2. Zo is er een mod_http2 module voor Apache. Voor nginx hoef je vanaf versie 1.9.5 niets extra’s te installeren. Op de HTTP/2 github is er een complete lijst van implementaties te vinden voor diverse pakketten.

 

Kah Tang

Kah Tang is a senior web developer with years of experience in Tridion, .NET and Java. He joined Indivirtual in 2006 to make the web a little better, one line of code at a time. You can also wake him up in the middle of the night for some good boardgames, Android, iOS and NodeJS.