Firefox beabsichtigt, Unterstützung für HTTP/2 Push einzustellen
(groups.google.com)- Firefox wird HTTP/2 Push wegen geringer Nutzung und zunehmender Kompatibilitätslast in den nächsten Tagen auf allen Plattformen deaktivieren; der Implementierungscode soll vorerst im Tree verbleiben
- Im Browser-Ökosystem ist die Unterstützung bereits zurückgegangen; Chrome 106 hat sie im September 2022 abgeschaltet, und auch die aktuelle Safari-Version lehnt in lokalen Tests Push-Streams ab
- Chrome verwies auf die geringe Nutzung von HTTP/2 Push und empfahl als Alternativen rel="preload" und 103 Early Hints
- Firefox hatte die Unterstützung beibehalten, weil der Wartungsaufwand nicht groß war, doch in den vergangenen Monaten traten wegen HTTP/2 Push Webkompatibilitätsfehler auf, die nur in Firefox auftreten
- Wenn Server und Websites Push nutzen, aber Tests mit Firefox auslassen, können bestimmte Websites nur in Firefox nicht funktionieren
Firefoxs Plan zur Deaktivierung von HTTP/2 Push
- Firefox wird HTTP/2 Push auf allen Plattformen deaktivieren
- Die Entfernung wird in Bugzilla unter 1915848 - Pref off HTTP/2 push verfolgt
- Vorerst wird es per Preference abgeschaltet, der Implementierungscode bleibt zunächst im Tree
- Die vollständige Entfernung wird voraussichtlich vor dem ESR-140-Branch im kommenden Frühjahr erfolgen
Unterstützungsstatus nach Browser und Gründe für die Deaktivierung
-
Chrome
- Chrome 106 hat HTTP/2 Push im September 2022 deaktiviert
- Der zugehörige Status ist unter Chrome Platform Status einsehbar
- Chrome nannte die geringe Nutzung als Grund und empfahl
rel="preload"sowie 103 Early Hints als Alternativen
-
Safari
- Offizielle Deprecation-Unterlagen konnten nicht gefunden werden, aber die aktuelle Version lehnt in lokalen Tests mit einem Node.js-Server Push-Streams ab
-
Firefox
- Firefox hat die Unterstützung für HTTP/2 Push bislang fortgeführt, weil der Wartungsaufwand nicht groß war
- In den vergangenen Monaten sind durch HTTP/2 Push Webkompatibilitätsprobleme entstanden, die nur Firefox betreffen
- Ein zugehöriges Beispiel ist bug 1915830
- Wenn Server und Websites Push verwenden, aber nicht in Firefox testen, kann eine Website nur in Firefox hängen bleiben; ein Beispiel dafür ist bug 1913100
1 Kommentare
Hacker-News-Kommentare
Es ist frustrierend, dass es keinerlei Entschuldigung für diejenigen gibt, die schon lange erklärt hatten, warum HTTP/2 Push nicht funktionieren würde, und damals ignoriert wurden, selbst nachdem plötzlich die „Erkenntnis“ auftauchte, dass es am Ende doch nicht klappt
Jahrelang herrschte die Stimmung, man solle es einfach in die Spezifikation drücken, weil Googles klügere Leute es angeblich bräuchten, dabei sollte man an Spezifikationen viel vorsichtiger herangehen. Man sollte aufhören, ständig spekulative Erweiterungsziele hineinzupacken, nur weil Teile von Google sie für gut halten
Was Browser langsam macht, sind meist nur Werbung, Tracker und sonstiger Ballast, die Websites erdrücken, und was das behebt, ist keine Google-Erfindung, sondern uBlock Origin. Was Google heute in Webstandards drückt, scheint nicht für normale Entwickler zu sein, sondern eher dafür, mehr Werbung unterzubringen oder 0,1 % an Rechenzentrumskosten zu sparen
HTTP/2 wirkt wie ein Fall, in dem ein einzelnes Unternehmen den Zugang zur öffentlichen Ressource WWW weiter im eigenen Interesse kontrollieren will. Wer Chrome benutzt, versucht dann HTTP/2, und dieselbe Firma kontrolliert Suchmaschine, Hardware, Browser und jetzt sogar Netzwerkprotokolle. HTTP/2 ist praktisch HTTP/Chrome
Die Erklärungen dafür, warum HTTP/2 Push gescheitert sei, haben auf mich nie überzeugend gewirkt. Google verweist meist auf einen Artikel von Jake Archibald, aber der liest sich eher wie eine Aufzählung, wie mangelhaft die Browser-Implementierung war, als wie eine Begründung dafür, dass das Protokoll selbst nicht funktionieren könne
Browser unterstützen bereits Preload-Links, und diese sollten im Wesentlichen dieselbe Rolle wie Push-Header erfüllen. Auch bei Problemen der Implementierungen von 2017 wie Caching oder Authentifizierungs-Headern frage ich mich, warum sich bestehender Code zur Verarbeitung von Preload nicht wiederverwenden ließ
https://jakearchibald.com/2017/h2-push-tougher-than-i-though...
Bei HTTP/2 Push schiebt der Server Ressourcen proaktiv zum Client, die dieser seiner Einschätzung nach brauchen wird, um einen Roundtrip zu sparen. Ziel ist, Latenz zu senken, indem Ressourcen unabhängig von der DOM→Render-Pipeline gesendet werden. Beim Preload-Header teilt der Server mit dem Response-Body mit, welche Ressourcen parallel geladen werden sollen, damit sie vor dem Parsen oder der Auswertung von JS geholt werden. 103 Early Hints senden Preload-Hinweise noch bevor die Response-Erzeugung abgeschlossen ist, also noch vor dem ersten Byte des Bodys, und ziehen den Fetch-Schritt damit weiter nach vorn
Der Kernunterschied ist servergesteuert versus clientgesteuert sowie mit dem Body versus vor dem ersten Byte. Der einfachste Grund, warum HTTP/2 Push sein Ziel schlecht erreicht, ist der Cache. Der Browser fordert Ressourcen, die er schon hat, gar nicht erst an, aber der Server weiß nicht, was im Client-Cache liegt. Bei Push ist das Risiko groß, unnötige Ressourcen zu senden, während bei 103/Preload im Fehlerfall nur ein paar nutzlose Header-Bytes verschwendet werden, was die Implementierung einfacher und die Kosten geringer macht
https://github.com/whatwg/fetch/issues/51
Selbst beim Anwendungsfall der Auslieferung von Inhalten, auf den sich alle konzentrierten, scheint es noch viele Möglichkeiten gegeben zu haben. Es gab auch nicht viele öffentlich sichtbare Versuche, und kaum jemand hatte Zugang zu Bibliotheken oder Ausgangspunkten, um zu experimentieren, was man überhaupt pushen sollte
Mit HTTP/3 0-RTT-Start lässt sich ein Teil der Geschwindigkeit zurückholen, und mit 103 Early Hints kann man den Browser Assets früh preloaden lassen. Diese Kombination hat zudem den Vorteil, semantisch abwärtskompatibel zu HTTP/1 zu sein. Auch in Reverse Proxies oder Load Balancern ist sie leichter zu handhaben
Es ist etwas schade zu sehen, dass HTTP/2 Push nun doch verschwindet. Die Idee war elegant, aber die Unterstützung in Frameworks blieb schwach, und es ist eine Funktion, die mehr Aufmerksamkeit verdient hätte
.NET hat es am Ende nie ausgeliefert, und nginx hatte eine Art Basisimplementierung. Auch das Fehlen von Cache Digests hat es immer wieder ausgebremst. Chrome entfernte es teils mit der Begründung, „es wird sowieso niemand bemerken“, und offenbar war es wichtiger, alles mit UDP neu zu entwerfen, das hinter NAT bekanntlich immer hervorragend funktioniert
Schon bevor HTTP/2 standardisiert wurde, war bei Gesprächen mit Mike Belshe die Stimmung da, diese Funktion eher aus H2 herauszunehmen, weil es bereits schwer war, den Nutzen zu realisieren, und es viele Probleme und Fallstricke gab
Eines der größten Probleme war übermäßiger Push: Es wurde etwas gesendet, das schon im Browser-Cache lag, oder es wurde zu viel unwichtiger Inhalt geschickt. Ich habe tatsächlich sehr schlechte Fälle gesehen, in denen Push das Laden der Seite noch langsamer gemacht hat. Es gab auch Vorschläge, dass der Browser dem Server mitteilt, was sich im lokalen Cache befindet, aber die stießen auf verschiedene Probleme. HTTP Early Hints und Resource Hints haben den Bedarf an H2 Push weitgehend ersetzt, sind viel einfacher zu implementieren, vermeiden unnötige Fetches und sind auch leichter zu verstehen
Man kann das auch so lesen: „Wenn Webserver und Websites Push verwenden und nicht mit Firefox testen, kann die Website nur in Firefox hängen bleiben“ — aber es ist auch eine andere Deutung möglich.
Andere Browser lehnen HTTP/2 Push ab und ignorieren es stillschweigend, während Firefox unter einigen Randbedingungen heftig stolpert. Zum Beispiel heißt es, „Firefox setzt die Verbindung offenbar zurück, wenn ein Header-Name Großbuchstaben enthält“.
Dieser Text scheint genau die Maßnahme zu beschreiben, HTTP/2 Push wie andere Browser abzulehnen und stillschweigend zu ignorieren; es wirkt nicht so, als würde hier etwas verheimlicht.
Ich frage mich, warum Push nicht breiter angenommen wurde. Trotz seiner großen Mängel war es einer der Hauptgründe, warum HTTP/2 als potenziell bahnbrechendes Feature galt.
Ich weiß nicht, ob es an mangelnder Browser-Unterstützung lag oder daran, dass es nicht gut zu CDNs passte.
Im zweiten Fall ist das unnötige Last und besonders auf Mobilgeräten schädlich. Der Server kann niemals genau wissen, ob der Client dieses Asset tatsächlich braucht. Early Hints sind wahrscheinlich besser: Der Server kann die benötigten Assets früh ankündigen, und der Client kann selbst entscheiden, ob er sie holen muss oder bereits hat.
index.htmlhereinkommt, möchte man normalerweisescript.jsundstyle.cssmitschieben, und damit hätte man bereits einige hundert kbit gesendet.Wenn der Nutzer
index.htmlerneut anfordert, soll man dann alles noch einmal senden? Wahrscheinlich befinden sich die Ressourcen schon im Cache des Nutzers. Wenn man sie nicht sendet, woher soll man wissen, was stattdessen gesendet werden muss? Was im Cache vorhanden ist und was nicht, weiß nur der Browser. Am Ende steht man vor der Wahl, den ersten Besuch zu beschleunigen und bei Wiederholungsbesuchen Bandbreite zu verschwenden, oder den ersten Besuch langsamer zu lassen und Wiederholungsbesuche zu beschleunigen.Für die meisten anderen war es ein massiver Anstieg der Komplexität und wurde faktisch ignoriert.
https://developer.chrome.com/blog/removing-push/
Die Push-Unterstützung von nginx scheint laut Wikipedia ungefähr 2018 hinzugekommen zu sein. Solche Änderungen brauchen Zeit, bis sie in Versionen mit stabilem Release und in die Standardkonfigurationen einsickern. Auf meinem Apache-Server habe ich HTTP/2 sogar erst 2020 erstmals aktiviert, und selbst 2024 gibt es wahrscheinlich noch Application-Server, die es nicht direkt unterstützen.
… in Firefox.
Scheint ein verwandter Beitrag zu sein. Gibt es noch mehr?
Removing HTTP/2 Server Push from Chrome - https://news.ycombinator.com/item?id=32522926 - August 2022, 201 Kommentare
A Study of HTTP/2’s Server Push Performance Potential - https://news.ycombinator.com/item?id=32097013 - Juli 2022, 2 Kommentare
HTTP/2 Push is dead - https://news.ycombinator.com/item?id=25283971 - Dezember 2020, 168 Kommentare
Blink: Intent to Remove: HTTP/2 and gQUIC server push - https://news.ycombinator.com/item?id=25064855 - November 2020, 133 Kommentare
We're considering removing HTTP/2 Server Push support - https://news.ycombinator.com/item?id=24591815 - September 2020, 2 Kommentare
Performance Testing HTTP/1.1 vs. HTTP/2 vs. HTTP/2 and Server Push for REST APIs - https://news.ycombinator.com/item?id=21937799 - Januar 2020, 71 Kommentare
How HTTP/2 Pushes the Web - https://news.ycombinator.com/item?id=18216495 - Oktober 2018, 16 Kommentare
Nginx HTTP/2 server push support - https://news.ycombinator.com/item?id=16365413 - Februar 2018, 63 Kommentare
HTTP/2 Server Push on Netlify - https://news.ycombinator.com/item?id=14798271 - Juli 2017, 23 Kommentare
The browser bugs and edge cases of HTTP/2 push - https://news.ycombinator.com/item?id=14445728 - Mai 2017, 20 Kommentare
A Guide to HTTP/2 Server Push - https://news.ycombinator.com/item?id=14077955 - April 2017, 59 Kommentare
HTTP/2 Server Push - https://news.ycombinator.com/item?id=13990074 - März 2017, 2 Kommentare
HTTP/2 Server Push and ASP.NET MVC – Cache Digest - https://news.ycombinator.com/item?id=13659962 - Februar 2017, 9 Kommentare
Accelerating Node.js Applications with HTTP/2 Server Push - https://news.ycombinator.com/item?id=12296922 - August 2016, 6 Kommentare
Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12224258 - August 2016, 25 Kommentare
Google's Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12223352 - August 2016, 2 Kommentare
HTTP/2 Protocol for iOS Push Notifications - https://news.ycombinator.com/item?id=11175980 - Februar 2016, 13 Kommentare
Nicht überraschend. Wenn man auf ein bestehendes Protokoll, das für einen bestimmten Zweck entwickelt wurde, eine Funktion draufsetzt, die mit dem ursprünglichen Designziel fast nichts zu tun hat, endet es meist so.
In den meisten Fällen ist es besser, mit einem Low-Level-Protokoll zu beginnen und es direkt auf den Anwendungsfall zuzuschneiden; in dieser Hinsicht haben WebSockets das Problem der bidirektionalen Kommunikation bereits elegant gelöst. Um beim Laden tiefer Datei-/Skript-Hierarchien die Latenz zu verringern, sind
rel="preload"- oderrel="modulepreload"-Tags hervorragend und strukturell einfach.Die Idee war, dass der Server die vorab zu ladenden Inhalte per Header schickt, sodass sie schon vorgeladen werden, bevor die Link-Tags übertragen oder geparst sind. Für Seiten mit Streaming-Unterstützung wäre das weniger nützlich, aber wenn Anfragen warten, bis die vollständige HTML-Seite serverseitig gerendert ist, hätte es einen spürbaren Vorteil geben können.