HTTP (HyperText Transfer Protocol) ist ein Netzwerkprotokoll auf Anwendungsebene, das festlegt, wie Inhalte über das Internet übertragen werden. HTTP/2 ist die neueste Version zum Zeitpunkt dieser Veröffentlichung.
Die erste Version des Protokolls, HTTP/0.9, wurde 1991 veröffentlicht. 1996 kam HTTP/1.0. Und der Vorgänger von HTTP/2 war HTTP/1.1, das 1999 veröffentlicht wurde. Danach gab es lange Zeit keine Aktualisierungen mehr.
Eine Alternative zu HTTP/1.1 wurde im Jahre 2009 entwickelt. Es war das SPDY-Protokoll. Die Entwickler erkannten, dass die bestehende Version keine ausreichende Datenübertragungsgeschwindigkeit bot. Ziel war es, die Art und Weise, wie die Software Anfragen empfängt und sendet, zu ändern und so das Internet zu beschleunigen. Aus diesem Protokoll ist HTTP/2 hervorgegangen.
SPDY beschleunigte die Webanwendungen tatsächlich, gewann an Popularität und wurde zu einem ernsthaften Konkurrenten von HTTP. Schließlich beschlossen die Entwickler, dass es nicht zwei konkurrierende Protokolle geben sollte, und kombinierten die beiden. Die Arbeitsgruppe HyperText Transfer Protocol des Internet Engineering Board übernahm die Aufgabe, das neue Protokoll zu erstellen. So wurde HTTP/2 im Jahre 2015 geboren.
Das Hauptziel der neuen Version war die Beschleunigung der Datenübertragung. Gleichzeitig wollten die Entwickler die Engpässe von HTTP/1.1 beseitigen, um es produktiver und sicherer zu machen.
Wie bereits erwähnt, wurde diese Version des Protokolls im Jahre 1999 veröffentlicht. HTTP/2 kam nur 16 Jahre später. In dieser Zeit hat sich im Internet viel verändert, die Websites haben neue Elemente: jР В°vascript, Animationen, CSS-Stile und vieles mehr.
Damit die Web-Ressourcen schnell genug geladen werden konnten, mussten die Anfragen für verschiedene Elemente gleichzeitig bearbeitet werden. Das Protokoll musste mehrere TCP-Verbindungen auf einmal aufbauen, um verschiedene Arten von Daten zu übertragen.
Dies führte zu einer enormen Belastung des Netzes.
Gleichzeitig war die Zahl der bestehenden Verbindungen begrenzt und oft unzureichend. Um diese Beschränkungen zu umgehen, haben Webentwickler viele verschiedene Tricks angewandt, z.B. Domain-Sharing (Verwendung von Subdomains zum Hochladen von Ressourcen), Zusammenführen von Bildern in eine einzige Datei usw. Dies führte zu zusätzlichen Komplikationen.
Da HTTP/1.1 bereits seit vielen Jahren im Einsatz war, erfüllte es irgendwann die Sicherheitsanforderungen nicht mehr. Angreifer fanden darin Schlupflöcher, die es ihnen ermöglichten, Benutzerdaten zu stehlen.
HTTP/2 hat all diese Probleme gelöst und zur Beschleunigung der Datenübertragung im Internet beigetragen.
Um alle Probleme zu beheben, die HTTP/1.1 hatte, haben die Entwickler einige wichtige Änderungen vorgenommen. Wir werden nicht auf alle Unterschiede eingehen, sondern nur auf die, die sich direkt auf die Geschwindigkeit auswirken.
Frühere Versionen von HTTP übermittelten Daten im Textformat. Das war für die Nutzer praktisch. Aber technisch gesehen waren Textnachrichten langsamer zu verarbeiten als binäre Nachrichten.
Bei HTTP/2 bestehen die Nachrichten aus Frames, also binären Dateneinheiten. Ihre Gesamtheit wird als Strom bezeichnet. Jeder Frame trägt eine eindeutige Streamkennung — Informationen darüber, zu welchem Stream er gehört.
Es gibt verschiedene Arten von Frames. Für die Übertragung von Metadaten (Größe der Nachricht, Datentyp, Absender- und Empfängeradresse usw.) wird beispielsweise der HEADERS-Frame verwendet, für die Hauptnachricht der DATA-Frame.
Es gibt einen RST_STREAM-Frame — er wird zur Unterbrechung des Streams verwendet. Der Client sendet diesen an den Server, um ihm mitzuteilen, dass der Stream nicht mehr benötigt wird. Dadurch wird die Datenübertragung gestoppt, aber die Verbindung bleibt offen. Im Vergleich dazu: Bei HTTP/1.1 war die einzige Möglichkeit, die Datenübertragung zu stoppen, die Unterbrechung der Verbindung, die dann neu geöffnet werden musste.
Dieses Prinzip des Binärprotokolls verbessert die Qualität der Verbindung:
Darüber hinaus eröffnet die binäre Natur von HTTP/2 eine Reihe von Möglichkeiten zur Beschleunigung der Datenübertragung, auf die wir gleich noch eingehen werden.
Dies ist einer der Hauptunterschiede zwischen HTTP/2 und früheren Versionen. Dadurch wurde es möglich, die Geschwindigkeit der Datenübertragung zu erhöhen.
In HTTP/1.1 wurden zur schnellen Übertragung verschiedener Datentypen mehrere parallele TCP-Verbindungen eingerichtet. In der neuen Version können alle Daten über eine einzige Verbindung übertragen werden.
Die binäre Natur des Protokolls erlaubt es, verschiedene Informationen parallel herunterzuladen, ohne dass es zu Verzögerungen oder Blockierungen bei den Antworten oder Anfragen kommt.
Da nur eine einzige Verbindung aufgebaut werden muss, wird die Zeit für die Bereitstellung der Inhalte erheblich verkürzt. Jede TCP-Verbindung erfordert nämlich einen „dreifachen Handschlag“:
Erst nach diesen drei Schritten gilt die Verbindung als hergestellt.
All diese Schritte nehmen Zeit in Anspruch. Wenn eine Verbindung nur einmal aufgebaut werden muss, wird keine Zeit mit unnötigen „Handschlägen“ verschwendet und somit die Geschwindigkeit erhöht.
Darüber hinaus ist bei HTTP/2 keine Domänenaufteilung erforderlich.
Um das HTTP/1.1-TCP-Verbindungslimit zu umgehen, haben die Entwickler einige Inhalte in Subdomains verschoben. Die Daten aus den Subdomains wurden parallel heruntergeladen, was die Geschwindigkeit erhöhte.
Dies ist jetzt nicht mehr nötig, da verschiedene Daten über dieselbe Verbindung übertragen werden und es keine Einschränkungen gibt.
Damit ein Server eine Anfrage so genau wie möglich ausführen kann, muss ihre Kopfzeile so viele detaillierte Metadaten wie möglich enthalten. Und HTTP ist ein nicht zustandsorientiertes Protokoll. Das bedeutet, dass der Server keine Informationen aus früheren Anfragen speichern kann und dass der Client daher jedes Mal viele sich wiederholende Daten in den Kopfzeilen senden muss.
Die Kopfzeilen sind etwa 500–800 Byte groß, und manchmal mehr als ein Kilobyte, wenn Cookies verwendet werden.
Dadurch wird die gesamte Nachricht größer. Und je größer die Datenmenge ist, desto länger dauert die Übertragung und desto größer ist die Verzögerung.
HTTP/2 löst dieses Problem durch Komprimierung der Kopfzeilen mit dem HPACK-Format. Р С›Es kodiert und komprimiert Kopfzeilen mit dem Huffman-Algorithmus. Gleichzeitig unterhalten Client und Server eine gemeinsame, ständig aktualisierte Tabelle der Kopfzeilen. Dadurch können die Kopfzeilen anhand einer Tabelle rekonstruiert werden, anstatt sie wiederholt zu übermitteln.
Es werden weniger Daten übertragen, so dass Anfragen und Antworten schneller erfolgen.
Diese Funktion ermöglicht es dem Server, Daten zu übermitteln, bevor der Client sie überhaupt angefordert hat. Zum Beispiel lädt der Browser eine Seite und sendet eine HTML-Anfrage. Neben dem HTML-Code benötigt die Seite aber auch CSS, um sie zu rendern. Der Server wartet nicht auf eine zweite CSS-Anforderung, sondern sendet die Daten zusammen mit dem angeforderten CSS.
Die vom Server „erratenen“ Daten werden mit dem Frame PUSH_PROMISE gesendet. Auf diese Weise kann der Kunde erkennen, dass es sich um Informationen handelt, die nicht angefordert wurden, und feststellen, ob sie benötigt werden. Wenn die Daten nicht benötigt werden (z.B. weil sie sich bereits im Cache befinden), kann der Browser mit einem RST_STREAM-Frame antworten (wie oben beschrieben) und die Redundanzübertragung beenden.
Auf diese Weise lassen sich doppelte Informationen vermeiden.
Auf diese Weise reduziert die Funktion die Anzahl der Anfragen an den Server, verringert die Belastung des Servers und beschleunigt die Webanwendungen.
Daten werden bei HTTP/2 standardmäßig asynchron in beliebiger Reihenfolge übertragen. Diese Reihenfolge kann jedoch festgelegt werden. Sie können festlegen, welche Daten der Server zuerst senden soll und welche später gesendet werden können.
Das Protokoll ermöglicht es Ihnen, die Gewichtung der einzelnen Streams zu bestimmen, d. h. ihre Bedeutung im Hinblick auf die Übertragungspriorität. Gleichzeitig ermöglicht es HTTP/2, die Abhängigkeit eines Streams von einem anderen festzulegen.
Die Gewichtung ist als ganze Zahl von 1 bis 256 definiert. Je höher die Zahl, desto höher ist die Priorität für einen Stream.
Die Abhängigkeit eines Streams von einem anderen wird durch eine spezielle Kennung angezeigt, die auf einen anderen, „übergeordneten“ Stream verweist.
Wenn zum Beispiel Stream X von Stream Y abhängt, bedeutet dies, dass Y der übergeordnete Stream ist und zuerst verarbeitet werden sollte, bevor Stream X verarbeitet wird.
Wenn Streams unabhängig sind, aber unterschiedliche Gewichtung haben, werden sie proportional zu ihren Gewichtungen mit unterschiedlichen Ressourcenmengen behandelt.
Angenommen, Stream X und Stream Y sind unabhängig voneinander, aber X hat den Wert 10, während Y den Wert 15 hat. Berechnen wir nun, wie viel Prozent der Ressourcen jeweils zugewiesen werden sollen:
So werden dem Verarbeitungsablauf X 40% der Ressourcen zugewiesen, während dem Verarbeitungsablauf Y 60% zugewiesen werden.
Schauen wir uns die Funktionsweise anhand eines genaueren Beispiels an.
Was diese Regelung bedeutet:
Welche Möglichkeiten bietet die Prioritätensetzung?
Es ist schon eine Weile her, dass HTTP/2 veröffentlicht wurde, und es wurde viele Male getestet und mit HTTP/1.1 verglichen. Verschiedene Tests zeigen unterschiedliche Ergebnisse, aber die meisten bestätigen, dass diese neue Version ihren Vorgänger in der Leistung übertrifft.
Der CCS-Tricks-Test hat zum Beispiel gezeigt, dass eine Website mit HTTP/2 fast doppelt so schnell geladen wird wie eine Ressource mit HTTP/1.1.
Für die Tests simulierte das Unternehmen eine echte einseitige Website auf WordPress. Sie verwendeten das Tool GTMetrix, um die Ladegeschwindigkeit zu messen.
Das Ergebnis war, dass die Seite mit HTTP/1.1 in 1,9 Sekunden geladen wurde.
Und bei HTTP/2 mit denselben Bedingungen betrug die Ladezeit 1 Sekunde.
Wie Sie sehen können, ist gleichzeitig die Anzahl der Anfragen mit HTTP/2 zurückgegangen.
Die Tests von SolarWinds zeigen weniger beeindruckende Ergebnisse. Ihre Tests zeigen, dass die Leistung von HTTP/2 nur 13% besser ist als die seines Vorgängers.
Ähnlich wie bei der vorherigen Studie hat das Unternehmen die Geschwindigkeit einer WordPress-Website gemessen. Für die Messungen wurde Pingdom verwendet. Die Geschwindigkeit wurde 4 Mal alle 30 Minuten überprüft. Aus den Ergebnissen errechneten sie einen Durchschnittswert. Und das ist es, was sie bekommen haben.
Eine Website mit HTTP/1.1 brauchte 534 ms zum Laden.
Dieselbe Website benötigte bei HTTP/2 464 ms zum Laden.
Wie auch immer, HTTP/2 ist derzeit die am meisten optimierte und schnellste Version des wichtigsten Datenübertragungsprotokolls im Internet.
Das CDN von Gcore unterstützt das HTTP/2-Protokoll. Unser Netzwerk kann Inhalte über HTTP/2 liefern, auch wenn Ihre Server dies nicht unterstützen.
CDN-Merkmale der Gcore: