In HTTP/2 schiebt der Server an den Client eine Anfrage für die Ressource mit einem PUSH_PROMISE-Rahmen.
Bei der Übertragung vom Server zum Client handelt es sich nicht um eine Antwort, sondern um eine Anforderung, die der Client stellen würde, um diese Ressource abzurufen.
Wenn der Client den PUSH_PROMISE empfängt, kann er den URI ansehen und den Cache-Status dieser Ressource ermitteln. Browser verwenden normalerweise unterschiedliche Caches für normalerweise empfangene Ressourcen und gepushte Ressourcen. Wenn der Cache noch gültig ist, kann der Client den Push-Stream abbrechen, indem er einen RST_STREAM-Frame an den Server für diesen Stream sendet.
Währenddessen startet der Server, was es braucht, um die Ressource zu pushen. Dadurch wird ein HEADERS-Antwortrahmen generiert, der die typischen Antwortheader wie Etag enthält. Wenn der Client den HEADERS-Response-Frame empfängt, hat er noch eine Chance, den Stream abzubrechen, obwohl - natürlich - DATA-Frames inflight sein können, möglicherweise alle.
Speichern der Bandbreite kann interessant sein, aber es ist normalerweise kein Problem, eine kleine Bandbreite zu verschwenden; Aus der Sicht des Benutzererlebnisses ist die Latenz wichtiger, und der Push-Mechanismus verringert dies um ein beträchtliches Maß.
Ich glaube nicht, dass der Push-Mechanismus jede Client-Cache-Optimierung kompromittiert; Wäre dies der Fall gewesen, hätten sich Browser-Anbieter gegen diese Funktion gewehrt, während die meisten (wenn nicht alle) diese mit sehr guten Ergebnissen bei der Benutzererfahrung und verringerter Latenz implementieren.
Sicher könnte der Mechanismus verbessert werden, zum Beispiel, indem Clients und Server einigen Kopfzeilen zustimmen, die mehr Informationen über die Ressource geben, die geschoben wird, aber bisher ziemlich gut funktioniert.
[Disclaimer: Ich bin ein Jetty Committer] die ersten gewesen Nachdem SPDY und HTTP/2 Drücken Sie für das Java-Ökosystem (almost 3 years ago) zu implementieren, ist die Jetty Project sicherlich interessiert in more discussions and ideas um HTTP/2 Push.
Ich bin neugierig, wenn Sie wissen, welche Mechanik der Client verwendet, um zu wissen, ob es den Push abbrechen kann. Wird ein Etag oder zuletzt geändert oder etwas mit dem Push-Versprechen gesendet? Diese Chromum-Seite über SPDY scheint anzuzeigen, dass ein PUSH überflüssig wäre (Cache ignorieren) und ein HINT würde den Browser bitten, den Gegenstand zu holen, nachdem er seinen Cache überprüft hat: https://www.chromium.org/spdy/link-headers -und-server-hinweis Hat diese Mechanik zwischen SPDY und HTTP2 gewechselt? – CodingWithSpike
Zusätzlich zu meinem obigen Kommentar gibt es hier einen Chrome-Diskussionsthread: https://groups.google.com/a/chromium.org/forum/#!msg/net-dev/yfkW4mkWIPU/CEVL86nFJgAJ (genauer gesagt für SPDY), die anzeigt, dass keine Unterstützung für das Push-Caching von Servern besteht. Servergeschobene Dateien von einem HTTP2-Server werden nicht in 'chrome: // cache' angezeigt (die ursprünglich angeforderte Datei erscheint zwar im Cache, aber zusätzlich verschobene Dateien nicht). Ich denke, die HTTP2-Spezifikation könnte einen Browser ein Etag in der PUSH_PROMISE erhalten und die Push abbrechen, aber es sieht aus wie Chrome, zumindest, ist nicht auf diese Weise implementiert. – CodingWithSpike