Alles Wissenswerte zu HTTP2

HTTP2 ist die nächste Generation des erfolgreichen Internetprotokolls HTTP für das World Wide Web. 1999 wurde der Standard für HTTP/1.1 veröffentlicht und seitdem gab es keine signifikanten Änderungen oder Verbesserungen am Protokoll. Mit HTTP2, welches auf SPDY („speedy“) basiert, das von Google entwickelt wird, soll ein neuer Standard auf den Weg gebracht werden, der einige der größten Schwächen von HTTP/1.x beseitigen wird. 

HTTP/1: Ein altertümliches Protokoll

Mit HTTP/1.0 war es noch nötig für jede Anfrage an den Server eine neue Verbindung aufzubauen. Hat eine Webseite viele verknüpfte Ressourcen (CSS Dateien, JavaScripte, Bilder), würde das zu einer Menge zusätzlicher Roundtrips führen. Durch die ganzen extra TCP Handshakes und weil TCP spezifikationsbedingt damit anfängt nur kleine Pakete zu senden, kann sich die Übertragungsgeschwindigkeit nie so richtig entfalten.

Der direkte Nachfolger HTTP/1.1 hatte es dann erlaubt, mehrere Anfragen über eine bestehende TCP Verbindung zu senden. Diese Anfragen werden dann eine nach der anderen in derselben Reihenfolge beantwortet. Da die Anfragen nacheinander abgearbeitet werden, kann es gelegentlich zum sogenannten „Head-Of-Line Blocking“ kommen. Wenn eine angefragte Datei aus irgendeinem Grund blockiert, z.B. weil sie erst vom Server generiert werden muss, müssen andere statische Dateien trotzdem darauf warten, bis die blockierende Datei vollständig gesendet wurde, obwohl ausreichend Ressourcen für eine sofortige Übertragung der statischen Dateien vorhanden wären.

Ein weiteres Problem mit HTTP/1.x ist, dass der Client für jede benötigte Ressource eine eigene Anfrage versenden muss. Das verlangsamt das Herunterladen aller verlinkten Ressourcen einer Webseite (CSS, JavaScripte, Bilder, etc.) um die Zeit, die es dauert die zusätzlichen Anfragen an den Server zu versenden und die Antwort zu erhalten.

Zeitgemäße Performance

Der Gedanke hinter HTTP2 ist es, diese und weitere Schwächen zu beseitigen, um das Surfen im World Wide Web zu verbessern.

Für das Problem mit dem Head-Of-Line Blocking bietet HTTP2 das Multiplexen von Anfragen an. Die Anfragen werden dabei einzelnen Streams zugewiesen und die Streams wiederum werden in einzelne Frames aufgeteilt. Diese Frames werden ineinander geflochten versendet, was das „gleichzeitige“ versenden mehrerer Streams erlaubt.

Der „Push Promise“ oder „Server Push“ ist die Möglichkeit, verknüpfte Ressourcen ohne Anfrage des Clients, dem Client zuzusenden. Dabei wird auf Serverseite eine Anfrage simuliert, und dem Client das „Versprechen“ zugesendet, dass er die Ressourcen bekommt. Ist der Client nicht interessiert, kann er das „Versprechen“ ablehnen.

Um weitere Bandbreite zu sparen, werden die HTTP Header in HTTP2 komprimiert. Da übliche Verfahren wie „Deflate“ Sicherheitsprobleme mit sich bringen, wurde ein spezielles Kompressionsverfahren mit dem Namen HPACK entworfen.

Weitere interessante Neuerungen sind Funktionen zum „Flow Control“ und der Priorisierung. Mit dem Flow Control lässt sich das Übertragen der zu sendenden Bytes auf einzelne Streams oder auf die gesamte Verbindung einschränken. Ein Empfänger kann so dem Sender ein Limit der zu übertragenen Daten mitteilen. Es ist zwingend, dass sich der Sender an dieses Limit hält. Die Priorisierung hingegen erlaubt es dem Client, „Empfehlungen“ zu geben, mit welcher Priorität der Server welche Streams bearbeiten soll, d.h. wie er die zur Verfügung stehenden Ressourcen aufzuteilen hat. Der Server muss sich aber nicht zwingend an diese Empfehlungen halten.

Wachsende Verbreitung

Unterstützung für das neue Protokoll gibt es in unterschiedlichen Formen. Zum einen gibt es die SPDY/3 und die HTTP2 (SPDY/4) Spezifikationen, die sich im Großen und Ganzen kaum unterscheiden. Am weitesten verbreitet bei den Webservern scheint aber nur SPDY/3 zu sein.

Für Apache gibt es mod_spdy, um SPDY/3 zu nutzen. mod_spdy setzt das Modul mod_ssl mit „Next Protocol Negotiation“ (NPN) Unterstützung voraus. Um mod_spdy mit PHP zu nutzen, sollte man wegen den in mod_spdy verwendeten Threads komplett auf mod_php verzichten und stattdessen php-cgi über mod_fcgid nutzen. Es ist mit mod_spdy ebenfalls möglich, ein Push Promise mit PHP zu erzeugen, in dem man den „X-Associated-Content“ Header setzt.

Der Webserver nginx unterstützt das SPDY Protokoll schon eine weile und seit 1.6 auch SPDY/3.1. Allerdings wird das entsprechende Modul standardmäßig nicht mit kompiliert und Unterstützung für den Push Promise gibt es ebenfalls noch nicht.

HTTP2 ist bei den Browsern schon weiter verbreitet. Im Chrome lässt sich HTTP2 (SPDY/4) aktivierten, in dem man in der Adresszeile chrome://flags/#enable-spdy4 eingibt und dort SPDY/4 aktiviert. Beim Firefox kann man in der Adresszeile about:config eingeben und die Option network.http.spdy.enabled.http2draft auf „true“ setzen.

Update

Ab Firefox 36 gibt es zusätzlich die Option network.http.spdy.enabled.http2 und Ab Firefox 37 sind sowohl http2 als auch http2draft standardmäßig aktiviert.

Zum Testen gibt es eine Demo-Seite, die einen in der Programmiersprache Go implementierten HTTP2 Server nutzt: https://http2.golang.org/. Interessant ist vor allem die https://http2.golang.org/gophertiles Demo, die man mit der HTTP/1.1 Version vergleichen kann.

Quellen

https://tools.ietf.org/html/draft-ietf-httpbis-http2-16

Ihr Lichtflut.Medien-Team
www.lichtflut-medien.de