# 2.3 HTTP/2

Nachdem Sie sich mit den Grundlagen der Version HTTP/1.1 (aus 1997) vertraut gemacht haben, kommen wir zur Version HTTP/2 aus dem Jahr 2015. HTTP/2 ist abwärtskompatibel zu HTTP/1.1 und somit bleibt auch zukünftig das Wissen um HTTP/1.1 die Basis auf der die anderen Versionen aufbauen.

## Warum HTTP 2 notwendig wurde

Wie im Kapitel HTTP 1.1 beschrieben wurde, kommt das Protokoll aus einer Zeit (1997), in der Webseiten nicht annähernd so komplex waren, wie dies heutzutage der Fall ist. Ursprünglich enthielten Webseiten nur wenige Abbildungen und Elemente. Somit gab es nach der Übertragung der angeforderten Webseite nur wenige Elemente, die anschließend noch geladen werden mussten.

Insbesondere häufig genutzte Webseiten haben heutzutage eine erhebliche Last an Anfragen zu verkraften. Und wenn man bedenkt, dass in HTTP/1.1 für jedes in einer HTML-Seite enthaltene Element immer der komplette HTTP-Header übertragen wird, dann ist das vorhandene Einsparpotential hoch, wenn man nur die Änderungen übertragen würde.

Beispiel einer Anfrage an die Webseite www.thomaschewski.de.

Dies führt zur Übertragung von identischen Client-Request-Headern, abgesehen von der hier nicht angegebenen Request-Line, in der die angefragte Datei genannt wird.

    Host: www.thomaschewski.de
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/...
    Accept: */*
    Accept-Language: de,en-US;q=0.7,en;q=0.3
    Accept-Encoding: gzip, deflate, br
    Referer: https://www.thomaschewski.de/
    DNT: 1
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache

Man muss sich vor Augen führen, welch unnötige Netzwerkbelastung entsteht, wenn Informationsportale oft mehr als 100 Elemente aufweisen, die ein Nutzer je Webseite erhält.

## Was man in einem modernen Protokoll benötigt

Einige der Hauptgründe für die Entwicklung von HTTP/2 waren:

- Header-Komprimierung: HTTP/2 verwendet eine effiziente Kodierung für HTTP-Header. Dies reduziert die Größe der übertragenen Daten.
- Performance-Verbesserungen: Durch das Multiplexing von Anfragen über eine einzige Verbindung können mehrere Anfragen und Antworten gleichzeitig übertragen werden, was die Ladegeschwindigkeit von Webseiten deutlich verbessert.
- Priorisierung von Anfragen: HTTP/2 erlaubt es, wichtigen Ressourcen Priorität zu geben, damit diese schneller geladen werden.
- Server Push: Server können nun aktiv Ressourcen an den Client senden, bevor dieser überhaupt danach fragt, was die Wartezeit bis zum vollständigen Laden einer Seite reduziert.

## Verbesserungen in HTTP 2

Es gibt insgesamt einige relevante Verbesserungen in HTTP/2.

- Verschlüsselte Übertragung: HTTP/2 muss mit HTTPS verschlüsselt übertragen werden. Es gibt also bei HTTP/2 nur HTTPS und kein 'reines HTTP' mehr. Damit wird automatisch ein großer Mehrwert an Sicherheit erzeugt.

- Multiplexing: Der Aufbau mehrerer paralleler Verbindungen zum Server wird ersetzt durch nur einen "Stream" als bidirektionaler Datenfluss-Kanal (mit Multiplexing) zwischen Client und Server. In diesem "Stream" werden "Frames", als Datencontainer aneinandergereiht, eingesetzt. Der Kanal wird damit optimal ausgelastet und ist schneller, als die 'vielen' parallelen Verbindungen mit ihren Leerlauf- und Wartezeiten (Anmerkung: um dies zu verstehen, muss man beachten, dass die gesamte Bandbreite am Client ja gleich bleibt. In HTTP/1.1 wurde die Bandbreite auf 'viele' nicht optimal ausgelastete Verbindungen aufgeteilt).

- Header-Komprimierung: HTTP/2 ist ein binäres Protokoll und damit schon effizienter als die ASCII-Version HTTP/1.1. HTTP/2 nutzt das Protokoll HPACK zur Komprimierung der HTTP-Header, was die zu übertragende Datenmenge nochmals reduziert.

- Header-Reduzierung: In HTTP/2 werden viel weniger Header-Daten übertragen, da nur geänderte Zeilen übertragen werden. Alle Zeilen, die bei einer vorherigen Anfrage vorhanden waren, merkt sich der Server einfach.

- Priorisierung von Anfragen: Anfragen können mit Prioritäten versehen werden, was dem Server ermöglicht, wichtige Ressourcen zuerst zu senden.

- Server Push: Der Server kann nun Ressourcen an den Client pushen, noch bevor dieser zunächst die HTML-Datei übertragen bekommt und dann die darin enthaltenen Elemente explizit anfragt. Dies reduziert die Ladezeiten, da der Client nicht erst jede Ressource einzeln anfordern muss. Jedoch erfordert diese Funktion eine sorgfältige Handhabung, da ein übermäßiger oder unangemessener Einsatz von Server Push zu einer Verschwendung von Bandbreite führen kann, insbesondere wenn der Client die gepushten Ressourcen bereits gecacht hat oder diese gar nicht benötigt werden. In der Realität hat sie die gut gemeinte Idee "Server Push" wenig durchgesetzt.

In den folgenden zwei Youtube-Videos wird HTTP/2 gut erklärt:

- HTTP/2 in five minutes - https://www.youtube.com/watch?v=fJ0C4zN5uOQ

- HTTP/2 What you need to know (Länge: 1 Stunde) - https://www.youtube.com/watch?v=krEhLbAOalE