# Hypertext Transfer Protocol

Hypertext Transfer Protocol (HTTP) is het protocol voor de communicatie tussen een webclient (meestal een webbrowser of een app) en een webserver. Dit protocol wordt niet alleen veel op het wereldwijde web gebruikt, maar ook op lokale netwerken (we spreken dan van een intranet).
In HTTP is vastgelegd welke vragen (de Engelse term hiervoor is requests) een cliënt aan een server kan stellen en welke antwoorden (de Engelse term is responses) een webserver daarop kan teruggeven. Elke vraag bevat een URL die naar een webcomponent of een statisch object zoals een webpagina of plaatje verwijst.

## HTTP-requests

Een HTTP-request bestaat uit de requestsoort, de URL, de headervelden (koptitelvelden) en eventueel een inhoud. Een overzicht van de HTTP-requestmethoden:
* GET – Ontvang het document gespecificeerd door de URL.
* HEAD – Ontvang alleen de headers van het op te vragen document.
* POST – Zend gegevens naar de server.
* PUT – Vervang het document op de server door de verzonden data.
* DELETE – Verwijder het document.
* TRACE – Retourneert de aanvraag zodat een client kan zien welke wijzigingen of aanvullingen zijn gemaakt door tussenstations.
* OPTIONS – Vraag de mogelijkheden op dit niveau aan van de server.
* CONNECT – Vervangt de verbinding door een transparante TCP-/IP-tunnel, om bijvoorbeeld SSL-versleutelde communicatie (HTTPS) via een onversleutelde HTTP proxy te ondersteunen.
* PATCH – Gedeeltelijke modificatie van het document (vervang een deel door de verzonden data).
De belangrijkste headervelden zijn:
* Content-Length: Geeft de lengte van de inhoud aan.
* Location: Indien de server de webbrowser naar een andere pagina doorverwijst wordt hierbij het benodigde pad gevoegd.
* Server: Omvat een beknopte beschrijving van de serversoftware (bijvoorbeeld "Apache/2.2.9 (Win32) PHP/5.2.6").
* User-Agent: Geeft informatie over de aanvrager. Dit is meestal een webbrowser.
* Date: De datum en het tijdstip waarop het document verzonden is.
* Host*: Omdat het pakket naar een IP-adres wordt gestuurd weet de server niet op welk domein men aan het surfen is. In HTTP 1.1 is het verplicht om met deze header het domein mee te delen.
* geïntroduceerd in HTTP 1.1
Een complete aanvraag inclusief de headervelden kan er voor HTTP 1.1 als volgt uitzien:

## HTTP-responses

Een HTTP-response bestaat uit een resultaatcode, headervelden en een body (de boodschap). De resultaatcode bestaat uit minimaal drie cijfers. Het eerste cijfer is het belangrijkste:
* 1xx: een mededelende boodschap van de webserver die nog gevolgd zal worden door andere data
* 2xx: een boodschap van de server dat de gevraagde actie succesvol is afgehandeld
* 3xx: een "redirect" naar een andere locatie, om wat voor reden ook
* 4xx: een foutboodschap die door de client veroorzaakt is, zoals het verkeerd typen van een URL
* 5xx: een foutboodschap die door de server veroorzaakt is, zoals een fout in een CGI-script
De meest voorkomende resultaatcodes zijn:
* 200 OK – Het gevraagde document is succesvol opgevraagd.
* 304 Not Modified – T.o.v. de versie in de cache is de pagina niet gewijzigd.
* 400 Bad Request - De gebruiker heeft een fout gemaakt in het verzoek waardoor deze niet verwerkt kan worden.
* 403 Forbidden – Het opgevraagde document mag niet opgevraagd worden.
* 404 Not Found – Het opgevraagde document bestaat niet.
* 405 Method Not Allowed – De gebruikte requestmethode is niet toegestaan.
* 410 Gone – Het opgevraagde document heeft bestaan maar is niet meer beschikbaar. Vergelijkbaar met foutcode 404.
* 451 Unavailable For Legal Reasons - een website niet kan worden weergegeven vanwege juridische redenen
* 500 Internal Server Error – De webserver heeft de gevraagde actie niet kunnen uitvoeren.
* 503 Service Temporarily Unavailable – De webserver is tijdelijk in onderhoud.
Een reactie op bovenstaande aanvraag kan er dan als volgt uitzien:

## Geschiedenis

De oorspronkelijke versie van HTTP staat bekend onder de naam HTTP 1.0. In eerste instantie voldeed dit protocol goed, maar met de populariteitsexplosie van het internet kwam er ook een aantal tekortkomingen in dit protocol aan het licht. Deze werden opgelost in de volgende versie, HTTP 1.1. Vanaf circa 1997 is de standaard op het World Wide Web dan ook verschoven van HTTP 1.0 naar HTTP 1.1.
Een van de belangrijkste beperkingen van HTTP 1.0 was dat er op ieder IP-adres slechts 1 domein gehuisvest kon worden. Vanwege de enorme groei van het aantal WWW-domeinen, zou dit al gauw tot een tekort aan IP-adressen geleid hebben. HTTP 1.1 ondersteunt dan ook het huisvesten van meer dan 1 domein op hetzelfde IP-adres. Andere belangrijke toevoegingen in HTTP 1.1, die voornamelijk tot doel hebben de responsiesnelheid te verhogen, zijn:
* ondersteuning van caching
* niet meer per se na elke respons de verbinding verbreken (zogenoemde persistent connection), zoals in HTTP 1.0 wel gebeurde
* de mogelijkheid om (dynamisch gegenereerde) pagina's in gedeeltes te verzenden. Hierdoor kan al met het verzenden van het eerste deel begonnen worden voordat de gehele pagina is gegenereerd, zelfs zonder dat bekend is hoe lang de pagina uiteindelijk zal gaan worden.
Technische details van HTTP staan beschreven in verschillende RFC's. HTTP-versie 1.0 staat in het RFC met nummer 1945. Versie 1.1 van het protocol staat in RFC met nummer 2616.

### HTTP/2

In 2012 begon het werk aan de opvolger van HTTP 1.1, genaamd HTTP/2: IETF richtte de werkgroep HTTP Working Group op. Het was een reactie op de ontwikkeling van het SPDY-protocol dat als experimenteel protocol ontwikkeld werd door Google om de laadtijden van webpagina's te verbeteren ten opzichte van HTTP 1.1.
HTTP/2 is gebaseerd op SPDY en behoudt tegelijk een hoge mate van compatibiliteit met HTTP 1.1. Andere voordelen zijn de lagere latency (vertraging) en andere snelheidsverbeteringen. De grootste verandering is de mogelijkheid om multiplexing toe te passen: meerdere verzoeken kunnen via één verbinding verzonden worden. Hiervoor is headercompressie nodig. De specificatie HPACK specifieert de headercompressie voor HTTP/2.
Daarnaast gebruikt HTTP/2 minder verbindingen tussen de server en de client. HTTP/2 specifieert ook een manier om inhoud van de server naar de browser te sturen, zonder dat de client continu moet vragen of er nieuwe inhoud beschikbaar is.
HTTP/2 bood in het begin een variant aan zonder TLS/SSL-encryptie aan in RFC 7540, maar amper gebruikt, werd dit encryptieloze mechanisme in RFC 9113 weggehaald. Zo kozen bepaalde softwareleveranciers zoals Mozilla ervoor HTTP/2 enkel te implementeren met SSL.
In februari 2015 werd de HTTP/2-specificatie uitgerold. Midden mei 2015 werd de finale versie van de specificatie vastgelegd als RFC 7540.